我写了那部分指南。
您绝对不想在生产中进行实时编译。
当你编译时,会发生以下情况:
对 /assets 中文件的每个请求都会传递到 Sprockets。上first请求它编译并缓存在 Rails 用于缓存的每个资产(通常是文件系统)中。
在后续请求中,Sprockets 收到请求并必须查找指纹文件名,检查组成资产的文件(图像)或文件(css 和 js)是否未被修改,然后如果有缓存版本则提供该版本。
That is 一切在资产文件夹中and在插件使用的任何供应商/资产文件夹中。
这是很大的开销,因为说实话,代码没有针对速度进行优化。
这将影响资产通过线路传输到客户端的速度,并对站点的页面加载时间产生负面影响。
与默认的比较:
当资产预编译并且编译关闭时,资产将被编译并指纹识别到public/assets
。 Sprockets 将普通文件名到指纹文件名的映射表返回给 Rails,Rails 将其写入文件系统。清单文件(Rails 3 中的 YML 或 Rails 4 中具有随机名称的 JSON)在启动时加载到 Memory by Rails 中并缓存以供资产帮助器方法使用。
这使得具有正确指纹资产的页面的生成速度非常快,并且文件本身的服务是来自文件系统的网络服务器的快速。两者都比实时编译快得多。
为了获得管道和指纹识别的最大优势,您需要在 Web 服务器上设置远期标头,并为 js 和 css 文件启用 gzip 压缩。 Sprockets 编写资产的 gzip 版本,您可以将其设置为服务器使用,从而无需为每个请求执行此操作。
这样可以尽可能快地将资源以尽可能小的尺寸发送给客户端,从而加快页面的客户端显示速度,并减少(使用远期标头)请求。
所以如果你正在实时编译它是:
- 非常慢
- 缺乏压缩
- 会影响页面的渲染时间
Versus
- 尽可能快
- 压缩的
- 删除从服务器监听到的压缩(可选)。
- 最大限度地减少页面的渲染时间。
编辑:(回答后续评论)
管道could可以根据第一个请求更改为预编译,但这样做存在一些主要障碍。首先,必须有一个用于指纹名称的查找表,否则辅助方法太慢。在按需编译的情况下,在编译或请求每个新资产时,需要某种方式附加到查找表。
此外,在所有资产都编译并就位之前,有人必须在未知的时间内付出资产交付缓慢的代价。
默认情况下,编译所有内容的费用都是一次性离线支付的,不会影响公众访问者,并确保一切在上线之前正常运行。
破坏交易的是它给生产系统增加了很多复杂性。
[编辑,2015 年 6 月]如果您正在阅读本文是因为您正在寻找部署期间编译速度慢的解决方案,那么您可以考虑在本地预编译资产。有关这方面的信息位于资产管道指南 http://guides.rubyonrails.org/asset_pipeline.html#local-precompilation。这允许您仅在发生更改时才在本地预编译,提交该更改,然后无需预编译阶段即可快速部署。