Rails 3.1 资产预编译 - 包括所有 javascript 文件

Posted

技术标签:

【中文标题】Rails 3.1 资产预编译 - 包括所有 javascript 文件【英文标题】:Rails 3.1 asset precompilation - include all javascript files 【发布时间】:2011-11-08 19:59:16 【问题描述】:

我希望 Rails 3.1 获取更多我的资产进行预编译。特别是,编译文件的默认匹配器不会添加来自vendor/assets/javascripts.js 文件。我可以将资产添加到config.assets.precompile 列表中,但这似乎很烦人。我不想在 application.js 清单中引用它们,因为我不希望它们包含在所有页面中。

总之,有什么方法可以请求vendor/assets/javascripts 中的所有.js 文件由rake assets:precompile 预编译,但不包含在所有页面中?

【问题讨论】:

【参考方案1】:

config.assets.precompile 接受正则表达式和通配符匹配 - 因此要确保编译 所有 js 文件,而不用指定每个文件的名称,这样的事情应该可以解决问题:

config.assets.precompile << '*.js'

【讨论】:

您可能想要覆盖已经在预编译中的内容:config.assets.precompile = ['*.js', '*.css'] 虽然您可能还想为您的图片添加一些内容。 @pat 实际上,asset/images 目录中的所有图像都包括在内。这可能是因为它们不需要任何处理。 虽然文档中没有提到,但是如果你看一下sprockets的代码,你会发现config.assets.precompile也接受Proc,也就是说你可以做一些这样的技巧:@987654321 @ 不知道为什么 rake assets:precompile 默认情况下不这样做,逻辑上它应该这样做。【参考方案2】:

我修改了Rails config.assets.precompile setting to process all CSS and JS files in app/assets 中给出的示例,这是我的版本,它从 /app 和 /vendor 获取所有资产,除了部分(从_开始)

config.assets.precompile << Proc.new  |path|
  if path =~ /\.(css|js)\z/
    full_path = Rails.application.assets.resolve(path).to_path
    app_assets_path = Rails.root.join('app', 'assets').to_path
    vendor_assets_path = Rails.root.join('vendor', 'assets').to_path

    if ((full_path.starts_with? app_assets_path) || (full_path.starts_with? vendor_assets_path)) && (!path.starts_with? '_')
      puts "\t" + full_path.slice(Rails.root.to_path.size..-1)
      true
    else
      false
    end
  else
    false
  end

【讨论】:

【参考方案3】:
# Precompile *all* assets, except those that start with underscore
config.assets.precompile << /(^[^_\/]|\/[^_])[^\/]*$/

完整的解释请参考 55 分钟 Blog。

这将预编译任何资产,而不仅仅是 JavaScript(.js、.coffee、.swf、.css、.scss)

【讨论】:

这很棒。我有什么理由不想想要预编译所有资产? @AlexChaffee,如果您使用的是 SASS 或要求 cmets 来准备资产“捆绑”。

以上是关于Rails 3.1 资产预编译 - 包括所有 javascript 文件的主要内容,如果未能解决你的问题,请参考以下文章

加速资产:使用 Rails 3.1/3.2 Capistrano 部署预编译

黑名单Rails资产被预编译[重复]

Rails:预编译资产缺少节点模块

未使用 Rails 测试环境中的预编译资产

Rails 3.1.1 资产预编译 - rake 中止

如何为包括旧资产在内的所有资产强制使用新指纹?