扩展Sprockets:开发环境下生成RTL CSS文件的技术实现问询
实现Sprockets自动生成RTL CSS副本的方案
我来帮你搞定这个需求——在开发环境中,当Sprockets生成application.css后,自动用css-flip生成对应的RTL版本application.rtl.css。咱们一步步来:
1. 先搞定依赖
首先把css-flip加到你的Gemfile里,因为只在开发环境用,所以放在development组:
group :development do gem 'css-flip' end
然后跑bundle install安装上。
2. 编写后处理器(不是预处理器!)
你之前注册的是预处理器,但咱们需要的是编译完成后处理,所以得写个后处理器。
先在lib目录下创建css_flip_rtl_processor.rb:
require 'css-flip' class CssFlipRtlProcessor def call(input) # 只处理主application.css,别给所有CSS都生成RTL版本 return input[:data] unless input[:name] == 'application.css' # 用css-flip转换原CSS为RTL版本 rtl_css = CSSFlip.flip(input[:data]) # 确定RTL文件的输出路径 output_path = input[:filename].gsub('application.css', 'application.rtl.css') # 避免重复生成:只有文件不存在或者原文件更新过才写入 unless File.exist?(output_path) && File.mtime(output_path) > File.mtime(input[:filename]) File.write(output_path, rtl_css) end # 返回原CSS,不影响原文件的正常输出 input[:data] end end
然后修改config/initializers/sprockets.rb,把这个处理器注册为CSS类型的后处理器:
require_relative '../../lib/css_flip_rtl_processor' # 配置Sprockets,注册后处理器 Rails.application.config.assets.configure do |env| env.register_postprocessor 'text/css', CssFlipRtlProcessor.new end
3. 确保lib目录能被加载(可选)
如果Rails没自动加载lib目录的话,在config/application.rb里加一行:
config.autoload_paths << Rails.root.join('lib')
这样就不用每次都用require_relative了。
4. 测试效果
启动开发服务器,访问你的应用,触发application.css的编译。之后去你的资产输出目录(默认是public/assets)看看,应该能找到application.rtl.css了。
额外提示
- 这个逻辑只在开发环境生效,生产环境如果需要RTL版本,建议把生成逻辑放到资产预编译的hook里,或者写个单独的rake任务来生成。
- 如果你的主CSS文件名不是
application.css,记得修改处理器里的判断条件。
内容的提问来源于stack exchange,提问作者ss_matches
相关产品推荐
相关产品推荐

