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

dhu*_*han 29 ruby-on-rails-3 ruby-on-rails-3.1

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

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

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

为什么这有必要?为什么并非所有资产都自动预编译?

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

Sim*_*eck 19

大多数资产自动包含在资产预编译中.根据资产管道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']

或者你可以覆盖它.


Cal*_*eed 8

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

例如,我的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
Run Code Online (Sandbox Code Playgroud)

这是因为(a)我正在使用外部js插件和(b)我喜欢将jQuery onload处理程序保存在单独的文件中.

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

CSS文件也是如此.

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

Uch*_*nna 2

对我来说,资产预编译很酷,因此您最终不会部署您不需要的资产。也不要忘记 uglifer gem,它可以帮助压缩你的 JavaScript。想象所有这些都不存在,您只需部署您的应用程序,您就会发现您有未使用的 css 文件和未压缩的 javascript。你觉得如何。这只是我自己的观点,我说资产管道是 Rails 中最酷的东西。能够正确管理所有资产。

请注意,如果我是 Rails,我不想编译您不想要的资产,所以您会在心里说为什么这个人编译这些资产..:)

  • 我宁愿拥有未使用的资源,也不愿用户看到第 500 页,因为某些内容没有明确编译。 (4认同)