我写了那本指南。
您绝对不希望在生产中进行实时编译。
当您进行编译时,将发生以下情况:
/ assets中对文件的每个请求都传递给Sprockets。在对每个资产的第一个请求时,它都会被编译并缓存在Rails用于缓存的文件中(通常是文件系统)。
在随后的请求中,Sprockets接收到该请求,并且必须查找指纹文件名,检查构成资产的文件(图像)或文件(css和js)是否未修改,然后如果有缓存版本,则为该文件提供服务。
这是一切的资产文件夹,并在任何供应商/使用插件资产的文件夹。
坦白说,这是很多开销,因为代码并未针对速度进行优化。
这将影响资产通过电线快速传输到客户端的速度,并对站点的页面加载时间产生负面影响。
与默认值比较:
当资产被预编译并关闭编译时,资产将被编译并指纹到public/assets
。Sprockets将平原到指纹文件名的映射表返回到Rails,Rails将此表写入文件系统。清单文件(在Rails 3中为YML或在Rails 4中为随机名称的JSON)在启动时由Rails加载到内存中,并缓存以供资产帮助器方法使用。
这使得具有正确指纹资产的页面的生成非常快,并且文件本身的提供是从文件系统Web服务器快速进行的。两者都比实时编译快得多。
为了最大程度地利用流水线和指纹识别功能,您需要在Web服务器上设置远期头,并为js和css文件启用gzip压缩。Sprockets编写资产的压缩版本,您可以将其设置为使用服务器,而无需为每个请求都这样做。
这样可以尽可能快地以最小的大小将资产提供给客户端,从而加快了客户端在页面上的显示速度,并减少了请求(具有远期头)。
因此,如果您正在现场编译,它是:
- 非常慢
- 缺乏压缩
- 将影响页面的渲染时间
与
- 尽可能快
- 压缩的
- 从服务器(可选)上删除压缩窃听。
- 最小化页面的渲染时间。
编辑:(回答跟进评论)
该管道可以改为预编译的第一个请求,但也有一些主要的障碍这样做。首先是必须有一个用于查找指纹名称的查找表,否则辅助方法太慢。在按需编译的环境下,当每种新资产被编译或请求时,将需要某种方式附加到查找表。
而且,在所有资产被编译并就位之前,有人将不得不为资产交付缓慢的时间付出未知的时间。
缺省情况下,一次编译所有内容的费用是脱机支付的,它不会影响公众访问者,并确保一切在事情上线之前就起作用。
令人大跌眼镜的是,它给生产系统增加了很多复杂性。
[2015年6月,编辑]如果由于正在寻找解决方案以减少部署期间的缓慢编译时间而阅读此书,则可以考虑在本地预编译资产。有关此信息,请参阅资产管道指南。这使您仅在发生更改时才在本地进行预编译,提交更改,然后在没有预编译阶段的情况下进行快速部署。