升级tailwindcss-rails gem后生产环境编译资源出现SassC语法错误如何解决
报错信息如下:
bundle exec rails assets:precompile rails aborted! SassC::SyntaxError: Error: unterminated attribute selector for type on line 1009:16 of stdin >> .prose ol[type="A" s] { ---------------^ /home/circleci/project/vendor/bundle/ruby/3.0.0/bundler/gems/sassc-ruby-4fce2b635ca5/lib/sassc/engine.rb:50:in `render' /home/circleci/project/vendor/bundle/ruby/3.0.0/gems/sassc-rails-2.1.2/lib/sassc/rails/compressor.rb:29:in `call' /home/circleci/project/vendor/bundle/ruby/3.0.0/gems/sprockets-4.0.2/lib/sprockets/sass_compressor.rb:30:in `call'
错误触发原因
- 报错核心是新旧工具的语法兼容性问题:升级后的
tailwindcss-rails内置的Tailwind CSS v3+ 版本,搭配的@tailwindcss/typography插件会生成包含CSS4新特性的属性选择器,报错行里type="A" s的s是CSS4新增的大小写不敏感匹配修饰符。 - 项目中依赖的
sassc/sassc-railsgem底层使用已经停止维护的旧版LibSass编译器,完全不支持这类新CSS语法,生产环境编译时触发Sass压缩流程就会识别失败,抛出语法错误。
排查解决方法
方案1:替换CSS编译工具(最推荐,长期兼容)
直接用维护活跃的dartsass-rails替换已经停止更新的sassc-rails:
- 第一步:删除Gemfile中的
gem 'sassc-rails',新增gem 'dartsass-rails' - 第二步:执行
bundle install安装依赖 - 第三步:修改
config/environments/production.rb配置,把config.assets.css_compressor = :sass改为config.assets.css_compressor = :dartsass - 第四步:重新执行
bundle exec rails assets:precompile验证即可
方案2:修改Tailwind配置关闭特性(无依赖改动,生效快)
如果暂时不想更换编译工具,可以直接配置Typography插件不生成该类语法:
- 打开项目根目录的
tailwind.config.js,调整插件配置:
module.exports = { // 原有其他配置保持不变 plugins: [ require('@tailwindcss/typography')({ caseSensitive: false, // 新增该行,关闭大小写不敏感修饰符生成 }), ] }
- 重新编译资源即可
方案3:降级tailwindcss-rails版本(临时应急方案)
如果上述方案都不适用,可以回退到不生成该新语法的旧版tailwindcss-rails,比如Gemfile中指定版本号锁在2.0以下,该方案仅适合临时救急,不推荐长期使用。
内容的提问来源于stack exchange,提问作者Dorian
相关产品推荐
相关产品推荐

