Rails 生产中的 config.assets.compile=true ,为什么不呢?

2024-01-21

默认安装的 Rails 应用程序rails new has config.assets.compile = false在生产中。

做事的普通方法是跑步rake assets:precompile在部署应用程序之前,请确保所有资产管道资产均已编译。

那么如果我设置会发生什么config.assets.compile = true在生产中?

我不需要跑步precompile不再了。我什么believe第一次请求资产时会发生这种情况,它将被编译。这将是第一次对性能造成影响(这意味着您通常需要在生产中使用 js 运行时来执行此操作)。但除了这些缺点之外,在资产被延迟编译之后,我think对该资产的所有后续访问都将具有no性能受到影响,应用程序的性能将一模一样与最初的首次延迟编译之后的预编译资产一样。这是真的?

我有什么遗漏的吗?任何其他原因不设置config.assets.compile = true在生产中?如果我在生产环境中有一个 JS 运行时,并且愿意为性能下降而做出权衡first访问资产,以换取不必运行precompile,这有道理吗?


我写了那部分指南。

您绝对不想在生产中进行实时编译。

当你编译时,会发生以下情况:

对 /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 版本,您可以将其设置为服务器使用,从而无需为每个请求执行此操作。

这样可以尽可能快地将资源以尽可能小的尺寸发送给客户端,从而加快页面的客户端显示速度,并减少(使用远期标头)请求。

所以如果你正在实时编译它是:

  1. 非常慢
  2. 缺乏压缩
  3. 会影响页面的渲染时间

Versus

  1. 尽可能快
  2. 压缩的
  3. 删除从服务器监听到的压缩(可选)。
  4. 最大限度地减少页面的渲染时间。

编辑:(回答后续评论)

管道could可以根据第一个请求更改为预编译,但这样做存在一些主要障碍。首先,必须有一个用于指纹名称的查找表,否则辅助方法太慢。在按需编译的情况下,在编译或请求每个新资产时,需要某种方式附加到查找表。

此外,在所有资产都编译并就位之前,有人必须在未知的时间内付出资产交付缓慢的代价。

默认情况下,编译所有内容的费用都是一次性离线支付的,不会影响公众访问者,并确保一切在上线之前正常运行。

破坏交易的是它给生产系统增加了很多复杂性。

[编辑,2015 年 6 月]如果您正在阅读本文是因为您正在寻找部署期间编译速度慢的解决方案,那么您可以考虑在本地预编译资产。有关这方面的信息位于资产管道指南 http://guides.rubyonrails.org/asset_pipeline.html#local-precompilation。这允许您仅在发生更改时才在本地预编译,提交该更改,然后无需预编译阶段即可快速部署。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails 生产中的 config.assets.compile=true ,为什么不呢? 的相关文章

随机推荐