Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails产品中config.assets.compile=true,为什么不呢?_Ruby On Rails_Asset Pipeline_Production Environment - Fatal编程技术网

Ruby on rails 在Rails产品中config.assets.compile=true,为什么不呢?

Ruby on rails 在Rails产品中config.assets.compile=true,为什么不呢?,ruby-on-rails,asset-pipeline,production-environment,Ruby On Rails,Asset Pipeline,Production Environment,由Rails new安装的默认Rails应用程序在生产环境中具有config.assets.compile=false 通常的做法是在部署应用程序之前运行rakeassets:precompile,以确保所有资产管道资产都已编译 那么,如果我在生产环境中设置config.assets.compile=true,会发生什么呢 我不再需要运行预编译了。我相信第一次请求资产时,它将被编译。这将是第一次对性能的打击(这意味着您通常需要在生产环境中使用js运行时才能做到这一点)。但是除了这些缺点之外,在对

由Rails new安装的默认Rails应用程序在生产环境中具有
config.assets.compile=false

通常的做法是在部署应用程序之前运行
rakeassets:precompile
,以确保所有资产管道资产都已编译

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

我不再需要运行
预编译了。我相信第一次请求资产时,它将被编译。这将是第一次对性能的打击(这意味着您通常需要在生产环境中使用js运行时才能做到这一点)。但是除了这些缺点之外,在对资产进行延迟编译之后,我认为对该资产的所有后续访问都不会产生性能影响,应用程序的性能将与首次延迟编译后预编译资产的性能完全相同这是真的吗?

我有什么遗漏吗?是否有其他原因不在生产中设置
config.assets.compile=true
?如果我在生产环境中有一个JS运行时,并且愿意在第一次访问资产时权衡性能降低,以换取不必运行
预编译
,这有意义吗?

来自官方:

在第一个请求中,按照上面的开发中所述编译和缓存资产,并修改helpers中使用的清单名称以包括MD5散列

链轮还将缓存控制HTTP标头设置为最大年龄=31536000。这表示服务器和客户端浏览器之间的所有缓存可以缓存该内容(所服务的文件)1年。这样做的效果是减少服务器对该资产的请求数量;资源很可能位于本地浏览器缓存或某些中间缓存中

此模式使用更多内存,性能比默认模式差,不推荐使用

另外,如果您用于部署,那么预编译步骤一点也不麻烦。它会帮你解决的。你就跑吧

cap deploy
或(取决于您的设置)


你们都准备好了。如果您仍然不使用它,我强烈建议您将其签出。

即使在第一次命中之后,它也与预编译不同:因为文件未写入文件系统,所以web服务器无法直接为其提供服务。一些ruby代码总是会涉及其中,即使它只是读取一个缓存条目。

我写了这部分指南

您肯定不想生活在生产环境中

当您在上编译时,会发生以下情况:

在/assets中对文件的每个请求都会传递到链轮。在第一次请求每个资产时,它被编译并缓存在Rails用于缓存的任何资源中(通常是文件系统)

在后续请求中,链轮接收请求并必须查找指纹文件名,检查组成资产的文件(图像)或文件(css和js)是否未修改,然后如果存在缓存版本,则提供该文件

这就是assets文件夹和插件使用的任何供应商/资产文件夹中的所有内容

这是一个很大的开销,因为,老实说,代码没有针对速度进行优化

这将影响资产通过连接到客户端的速度,并对站点的页面加载时间产生负面影响

与默认值比较:

当预编译资产并关闭“编译”时,将对资产进行编译,并在
公共/assets
中提取指纹。链轮将普通到指纹文件名的映射表返回到Rails,Rails将其写入文件系统。清单文件(Rails 3中的YML或Rails 4中带有随机名称的JSON)在启动时由Rails加载到内存中,并缓存以供asset helper方法使用

这使得生成具有正确指纹资产的页面的速度非常快,并且文件本身的服务是来自文件系统的web服务器。两者都比实时编译快得多


为了最大限度地利用管道和指纹,您需要在web服务器上设置将来的头文件,并为js和css文件启用gzip压缩。Sprockets写入可设置服务器使用的gzip版本的资产,从而无需为每个请求执行此操作

这将尽可能快地将资产以尽可能小的尺寸提供给客户端,从而加快页面的客户端显示,并减少(将来的页眉)请求

因此,如果您是实时编译,它是:

  • 很慢
  • 缺乏压缩力
  • 将影响页面的渲染时间
  • 尽快
  • 压缩的
  • 删除服务器上的压缩窃听(可选)
  • 最小化页面的渲染时间 编辑:(回答后续评论)

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

    此外,在一段未知的时间内,有人将不得不为缓慢的资产交付付出代价,直到所有资产被汇编并到位

    默认情况下,编译所有内容的价格都是一次性离线支付的,不会影响公众访问者,并确保所有内容都在上线之前工作

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

    <强> [编辑,2015年6月] < /强>如果你正在阅读这篇文章,因为你正在寻找一个部署期间缓慢编译时间的解决方案,那么你可以考虑在本地预编译资产。有关这方面的信息,请参阅。这允许

    cap production deploy
    
    Precompile everything initially with these settings in production.rb
    # Precompile *all* assets, except those that start with underscore
    config.assets.precompile << /(^[^_\/]|\/[^_])[^\/]*$/