【发布时间】:2015-12-14 07:00:44
【问题描述】:
为什么我们不能在开发环境中预编译资产?我知道 sprockets 基本上可以编译所有资产。
当我们进入生产环境时,我们运行命令:
rake assets:precompile
但是在开发环境中,我们不能做任何事情来编译它自己。 两种环境下资产编译的行为有何不同?
【问题讨论】:
标签: ruby-on-rails ruby heroku sprockets
为什么我们不能在开发环境中预编译资产?我知道 sprockets 基本上可以编译所有资产。
当我们进入生产环境时,我们运行命令:
rake assets:precompile
但是在开发环境中,我们不能做任何事情来编译它自己。 两种环境下资产编译的行为有何不同?
【问题讨论】:
标签: ruby-on-rails ruby heroku sprockets
如果你想在开发环境中预编译资产,你可以使用这个命令:
RAILS_ENV=development bundle exec rake assets:precompile
您可以在开发环境中默认使用 config/development.rb 预编译资产
config.assets.debug = false
在大多数情况下,您不需要它,因为您的开发过程会更加困难。
【讨论】:
每个 Web 应用程序都包含一些图像和 CSS 文件以使其看起来更漂亮,以及一些 JavaScript 文件来处理用户交互和行为。如果资产加载速度更快,则 Web 应用程序应该会执行得更好。有许多策略可以使资源快速加载,例如缩小、压缩(gzipping)、缓存等。
在开发模式下,资产按照清单文件中指定的顺序作为单独的文件提供。
此清单 app/assets/javascripts/application.js:
//= require core
//= require projects
//= require tickets
在生产环境中,Sprockets 使用上述指纹方案。默认情况下,Rails 假定资产已经预编译,并将由您的 Web 服务器作为静态资产提供。
在预编译阶段,从已编译文件的内容生成 MD5,并在将文件写入光盘时插入文件名。 Rails 助手使用这些指纹名称代替清单名称。
例如:
<%= javascript_include_tag "application" %>
<%= stylesheet_link_tag "application" %>
产生类似这样的东西:
<script src="/assets/application-908e25f4bf641868d8683022a5b62f54.js"></script>
<link href="/assets/application-4dd5b109ee3439da54f5bdfd78a80473.css" media="screen"
rel="stylesheet" />
注意:对于资产管道,不再使用 :cache 和 :concat 选项,请从 javascript_include_tag 和 stylesheet_link_tag 中删除这些选项。
指纹行为由 config.assets.digest 初始化选项控制(对于生产默认为 true,对于其他所有内容默认为 false)。
【讨论】: