You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

扩展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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:42:36