我写的是这篇指南的一部分。
在生产环境中,绝对不要实时编译代码。
当你开启编译模式时,以下情况会发生:
所有请求 /assets 文件夹下文件的请求都会被传递到 Sprockets。对于每个资源的首次请求,它会被编译并缓存在 Rails 使用的缓存(通常是文件系统)中。
在随后的请求中,Sprockets 接收请求,查找指纹文件名,检查组成该资源的文件(图片或css和js)是否已被修改,如果有缓存版本则提供服务。
这是 assets 文件夹中的所有内容和插件使用的任何 vendor/assets 文件夹中的内容。
这会带来很多开销,因为实际上该代码并没有针对速度进行优化。
它会影响资产传输到客户端的速度,并且会对您的网站页面加载时间产生负面影响。
与默认设置相比:
当资产预编译且编译关闭时,资产会被编译并生成指纹到 public/assets
目录。Sprockets 返回一个映射表,将普通文件名映射到指纹文件名,然后写入文件系统。清单文件(在 Rails 3 中为 YML,在 Rails 4 中为具有随机名称的 JSON)由 Rails 在启动时加载到内存中,并缓存以供资产帮助程序使用。
这使得页面的生成与正确的指纹资源非常快速,而文件本身的服务则以 web 服务器从文件系统快速提供。两者都比实时编译要快得多。
为了最大限度地利用管道和指纹,您需要在 Web 服务器上设置远期头,并为 js 和 css 文件启用 gzip 压缩。Sprockets 写出了资产的 gzip 版本,您可以将其设置为服务器使用,从而无需为每个请求执行此操作。
这最大程度地加快了资产传输到客户端的速度,并使页面显示尽可能快,减少了(通过远期标头)请求。
如果您是实时编译,则:
- 非常缓慢
- 缺乏压缩
- 将影响页面的渲染时间
相对而言:
- 尽可能快地进行
- 压缩的
- 从服务器移除压缩开销(可选)。
- 最小化页面的渲染时间。
编辑:(回答跟进评论)
管道可以在第一次请求时更改为预编译,但是有一些主要障碍需要克服。首先,必须有一个带指纹名称的查找表,否则辅助方法将太慢。在按需编译的情况下,每个新资产编译或请求时都需要有一种方法来附加到查找表。
此外,有人必须承担缓慢资产交付的代价,直到所有资产都编译并就绪。
默认情况下,在一次脱机编译所有内容的情况下,不会影响公共访问者,并确保在上线之前一切正常。
不能接受的是这会给生产系统增加很多复杂性。
[编辑,2015年6月]如果您正在阅读此内容,因为您正在寻找部署期间慢速编译的解决方案,则可以考虑在本地对资产进行预编译。有关此信息,请参见资产管道指南。这样,您可以仅在更改时在本地预编译,然后进行快速部署,无需预编译阶段。