题 config.assets.precompile的目的是什么?


在Rails 3.1中,您必须将要包含在资产预编译中的文件列入白名单。您必须打开config / environments / production.rb并明确包含您想要预编译的资产:

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

如果你不这样做,你就跑了 rake资产:预编译,当找不到资产时,您的资产不会被复制到公共/资产,并且您的应用会引发异常(因此导致生产中出现500错误)。

为什么这有必要?为什么不呢 所有 资产是否自动预编译?

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


28
2017-11-04 16:19


起源


只是为了澄清,这更多的是批评需要 明确地 指定资产。 rails预编译过程不仅编译代码,还将编译后的资产代码复制到Web服务器的公共目录中。即使资产不需要编译(如平原 .js 文件),你仍然需要告诉你的应用程序“预编译”它,所以它被复制到 public/assets。如果不这样做,则需要资产的页面会抛出异常。 - dhulihan
如果您正在组合和缩小文件,您可能不希望预编译所有资产。此技术适用于您计划单独包含的资产。例如,在application.js中,您可以 //= require许多其他JS文件不需要预编译。 - Simon Peck
@Simon Peck:你是对的,有些资产不需要预先编译,但是如果它们没有明确包含在内,它们就不会被复制到最终的资产位置(例如: public/assets),并在要求时找不到。将资产添加到 application.js 运用 //= require 工作,但增加了带宽开销,不适用于不在站点范围内使用的资产。 - dhulihan


答案:


大多数资产  自动包含在资产预编译中。根据 资产管道的RoR指南

用于编译文件的默认匹配器包括application.js,application.css和所有不以js或css结尾的文件: [ /\w+\.(?!js|css).+/, /application.(css|js)$/ ]

你会用的 config.assets.precompile 如果您有其他资产要包括:

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

或者你可以覆盖它。


19
2017-11-30 19:05



这里的关键字是 最。你仍然需要明确添加那些额外的任意资产 admin.js 您的应用配置或某些页面可能会引发异常。我在争论这个额外的步骤可能没有必要。 - dhulihan


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

例如,我有一个 admin.js 我的文件 app/assets/javascripts 夹。但它所做的只是需要其他几个.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文件也是如此。


8
2018-05-14 22:29



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


对我来说预编译的资产很酷,所以你不会最终部署你不想要的资产。也不要忘记有助于压缩你的javascripts的uglifer宝石。成像所有这些都不存在,你只是部署你的应用程序,你发现你有未使用的CSS文件和未压缩的javascripts。你觉得如何。这只是我自己的看法,我说资产管道是铁路中最酷的东西。能够正确管理所有资产。

请注意,如果我是rails,我不想编译你不想要的资产,所以你会在脑海中说出为什么这个人编译这些资产.. :)


2
2017-11-04 22:21



好的,感谢您的反馈。如果资产未在应用程序中使用,则它不应该是其文件结构的一部分。除非不需要的资产是具有其他理想的非资产功能的第三方gem的一部分。 - dhulihan
我宁愿使用未使用的资产而不是用户看到页面500,因为没有明确编译。 - Gunchars