config.assets.precompile的用途是什么?

问题描述:

在Rails 3.1中,您必须将您希望包含在资源预编译中的文件列入白名单。您必须打开配置/环境/ production.rb并明确包括资产你想预编译:config.assets.precompile的用途是什么?

config.assets.precompile += ['somestylesheet.css']

如果你不这样做,这一点,你运行耙资产:预编译,你的资产会不会被复制到公共/资产,并且您的应用程序会在找不到资产时引发异常(因此会导致生产中出现500错误)。

这是为什么这是必要的?为什么全部资产自动预编译?

这种当前的方法在部署时会产生额外的代码和压力。黑名单/排除资产不是很容易吗,所以事情就是开箱即用的。其他人分享这些感受?

+1

只是为了澄清,这更多的是**需要明确**指定资产的批评。 rails预编译过程不仅仅是编译代码,它还会将编译后的资源代码复制到Web服务器的公共目录中。 即使资产不需要编译(如简单的'.js'文件),您仍然需要告诉应用程序“预编译”它,以便将其复制到'public/assets'。如果您不这样做,那么需要该资产的页面会引发异常。 – dhulihan

+1

如果您正在合并和缩小文件的练习中,您可能不希望预编译所有资产。此技术适用于您计划单独包含的资产。例如,在application.js中,您可以'需要'许多其他不需要预编译的JS文件。 –

+0

@Simon Peck:你说的对,一些资产不需要预先编译,但如果它们没有明确包含,它们将不会被复制到最终资产位置(例如:'public/assets'),并且在请求时不会被找到。 使用'// = require'将资产添加到'application.js'工作,但会增加带宽开销,并且不适用于不会在站点范围内使用的资产。 – dhulihan

预编译给我的资产非常酷,因此您不会最终部署不需要的资产。不要忘记uglifer宝石可以帮助压缩你的javascript。想象所有这些都不存在,你只需部署你的应用程序,你会发现你有未使用的CSS文件和未压缩的JavaScript。你觉得如何。这只是我自己的看法,我说资产管道是铁轨中最酷的东西。能够正确管理所有资产。

你得注意,如果我的轨道我不想编译你不想这样,你会在你的心中说为什么这个家伙编译这些资产的资产.. :)

+0

好点,感谢您的反馈。如果一个资产没有在应用程序中使用,它不应该是其文件结构的一部分。除非这些不需要的资产是第三方gem的一部分,这些宝石具有其他所需的非资产功能。 – dhulihan

+4

我宁愿有比用户看到页面500更多的未使用资产,因为某些内容没有明确编译。 – Gunchars

大部分资产自动包含在资产预编译中。按照RoR Guide on the Asset Pipeline

编译文件的默认匹配包括的application.js,application.css和所有文件不结束JS和CSS:[ /\w+\.(?!js|css).+/, /application.(css|js)$/ ]

如果你会使用config.assets.precompile有额外的资产包括:

config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js']

或者你可以覆盖它。

+1

这里的关键词是* most *。您仍然需要明确地将这些额外的任意资产(如admin.js)添加到您的应用配置中,或者某些页面可能会引发异常。我在辩论这个额外的步骤可能没有必要。 – dhulihan

我认为这与管道/链轮需要单独文件的能力有关。

例如,我在我的app/assets/javascripts文件夹中有一个admin.js文件。但它所做的只是需要其他几个.js文件。

//= require jquery 
//= require jquery_ujs 
//= require jquery.colorpicker.js 
//= require jquery.wysiwyg.js 
//= require wysiwyg.image.js 
//= require jquery.fileupload.js 
//= require jquery.fileupload-ui.js 
//= require codemirror.js 
//= require css.js 
//= require admin_load 

这是因为(a)我使用外部JS插件和(b)我喜欢让事情就像在不同的文件jQuery的onload事件处理程序。

如果 .js文件预编译,那么它会预先编译这些单独的文件,这是完全没有必要的每一个。我想要/需要的是预编译的单个admin.js文件。

同样适用于CSS文件。

+4

的确,有些资源不需要任何形式的编译(比如普通的'.js'文件),不应该编译它们,就像你说的那样。但是,如果您在链接清单以外的地方使用此资产(例如:在视图中使用'javascript_include_tag'admin.js''),并且您没有在应用程序的配置中明确包含此专用资源,则它永远不会复制到'public/assets',页面会在生产中引发异常。 – dhulihan