16

如何在生产中使用 config.assets.precompile 以仅包含“lib/assets/javascripts”、“lib/assets/stylesheets”、“vendor/assets/javascripts”和“vendor/assets/stylesheets”中的文件?

基本上是这样的:

config.assets.precompile += %w( pagespecific.js anotherpage.js )

但用于自动包含不是“app/assets/javascripts”或“app/assets/stylesheets”的特定目录中的文件。

*编辑:添加我最终用于页面特定js的解决方案

config.assets.precompile += ['pages/*.js']
4

5 回答 5

31

你可以简单地这样写:

config.assets.precompile += ['directory/*']
于 2012-09-27T05:18:37.910 回答
3

编译资产的目的是构建一个(或少量)文件,以尽量减少来自浏览器的 HTTP 请求数量。

如果您要单独提供每个文件,那么为什么不禁用预编译呢?

要按预期使用预编译,请使用 Sprockets' 将整个目录构建到一个文件中require_directory

//= require_directory ./awesome_js_app

config.assets.precompile...并在您的数组中列出该文件。

默认情况下,所有 CSS 都内置在application.css& JSapplication.js中。您可以添加更多顶级文件以使用 precompile 指令进行编译config/environments/production.rb(如果您愿意,还可以添加其他环境。)例如:

config.assets.precompile += %w( public.css public.js )

//= require ...然后这些顶级文件中的 Sprockets指令将确定最终编译文件的组成。

您可以在布局中使用这些额外的顶级文件来为某些视图使用不同的 CSS 和 JS。

于 2012-09-27T04:59:15.090 回答
1

将其包含为资产路径可能会更好一些(根据您的示例解决方案):

config.assets.paths << Rails.root.join('app', 'assets', 'javascripts', 'pages')

它还允许您包含不在资产目录中的路径(例如包含bootstrap-sass)。然后将这些路径添加到公共目录中的资产文件夹中,如果使用类似asset_sync.

于 2014-10-01T07:26:34.417 回答
0

我找到了这个链接,认为它可能对你有帮助,请看

基思加普蒂斯的回答。Rails config.assets.precompile 设置处理 app/assets 中的所有 CSS 和 JS 文件

我认为你可以这样做。

# In production.rb
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
    if full_path.starts_with? app_assets_path
      puts "excluding asset: " + full_path
      false
    else
      puts "including asset: " + full_path
      true
    end
  else
    false
  end
}
于 2012-09-27T04:50:51.513 回答
0

从 Sprockets 3 开始,您可以使用 manifest.js 文件来声明哪些文件或目录是预编译的。请参阅升级文档。因此,在您的配置中,您将添加:

config.assets.precompile = %w(manifest.js)

然后在 app/assets/config/manifest.js 你可以拥有

//= link_directory ../pages .js

如果link_tree您希望嵌套子目录中的 js 文件也被预编译,请使用。

于 2018-09-05T20:31:17.403 回答