Rails生产环境预编译压缩JS/CSS遇SassC语法错误求助
看起来你遇到了两个核心问题:一是常规预编译不压缩资源,二是带环境变量执行时触发Sass语法错误。我们一步步来排查解决:
一、先解决Sass语法错误问题
报错信息SassC::SyntaxError: Error: Invalid CSS after "}": expected 1 selector or at-rule, was '!function(){if("und'明确说明:你的CSS编译流程中混入了JavaScript代码。Sass试图解析JS代码为CSS,自然会报错。
排查步骤:
定位错误来源
先执行不压缩的预编译,生成未合并的资产文件,方便找到问题代码:RAILS_ENV=production rake assets:precompile --no-compress然后进入
public/assets目录,搜索错误片段!function(){if("und,找到对应的CSS文件,就能定位是哪个源文件引入了JS代码。检查资产导入规则
- 确认
app/assets/stylesheets/application.scss中,有没有错误地用//= require引入JS文件?SCSS文件应该用@import导入CSS/SCSS,而JS文件要放在app/assets/javascripts/application.js里用//= require引入。 - 检查第三方gem或前端库:如果引入的某个库同时包含CSS和JS,确保只导入对应的CSS部分(比如有些库会提供
library.css和library.js,不要把JS文件导入到SCSS中)。
- 确认
修复错误导入
找到错误的导入语句后,将JS文件移到JavaScript的入口文件中引入,或者移除SCSS中对JS文件的引用。
二、解决资产不压缩的问题
当常规执行rake assets:precompile不压缩资源时,需要检查生产环境的配置:
确认production.rb配置
打开config/environments/production.rb,确保以下配置正确:# 关闭实时编译,使用预编译的资产 config.assets.compile = false # 启用JS压缩(依赖uglifier gem) config.assets.js_compressor = :uglifier # 启用CSS压缩(依赖sassc-rails gem) config.assets.css_compressor = :sass确认gem依赖
确保Gemfile中包含以下gem(并已安装):gem 'uglifier' gem 'sassc-rails'如果这些gem在
:development组里,要移到全局或者:production组。正确的预编译命令
你之前的命令SECRET_KEY_BASE= rake secret RAILS_ENV=production rake assets:precompile是错误的——rake secret会生成密钥,但你把它和预编译命令混在一起了。正确的生产环境预编译命令应该是:# 先生成密钥(如果还没设置) export SECRET_KEY_BASE=$(rake secret) # 执行预编译 RAILS_ENV=production rake assets:precompile或者直接在命令行一次性执行:
SECRET_KEY_BASE=$(rake secret) RAILS_ENV=production rake assets:precompile不要将
SECRET_KEY_BASE设为空值,这会导致Rails运行异常。
总结
先解决Sass语法错误(找到混入CSS的JS代码并修正导入),再检查生产环境的压缩配置和gem依赖,最后用正确的命令执行预编译,应该就能顺利完成资产的预编译与压缩了。
内容的提问来源于stack exchange,提问作者Antonio Fergesi

