开发模式下的资产编译速度慢

时间:2013-01-11 19:13:33

标签: javascript ruby-on-rails ruby asset-pipeline

我有一个包含数百个咖啡脚本文件的大型rails应用程序。

有时当我在coffeescript文件中进行微小更改或切换分支时,整个资产都被预编译,我必须等待很长时间才能加载页面:

Started GET "/assets/application.js" for 127.0.0.1 at 2013-01-11 19:39:45 +0100
Compiled sprockets/commonjs.js  (0ms)  (pid 18142)
Compiled jquery.js  (2ms)  (pid 18142)
Compiled jquery_ujs.js  (0ms)  (pid 18142)
Compiled underscore.js  (0ms)  (pid 18142)
Compiled backbone.js  (0ms)  (pid 18142)
Compiled backbone_rails_sync.js  (0ms)  (pid 18142)
Compiled handlebars.runtime.js  (0ms)  (pid 18142)
Compiled moment.js  (0ms)  (pid 18142)
...and so on

我使用以下资源配置config/development.rb

# Do not compress assets
config.assets.compress = false

# Expands the lines which load the assets
config.assets.debug = false

当我设置config.assets.debug = false时,我必须等待很长时间才能加载数百个js文件。 问题是:如何找到中庸之道?如何在大型应用程序的开发模式中优化资产配置?

3 个答案:

答案 0 :(得分:7)

查看Discourse团队的this middleware。我们在rails 4应用程序中取得了巨大的成功 - 将重新加载时间从一分钟缩短到5秒。

答案 1 :(得分:2)

这是一个可悲的事实,但你没有。没有一种干净的方法可以解决这个问题。

然而,你可以遵循一些模式来减少你的痛苦,如果我理解正确,你必须等待很多开发才能看到变化。

如上所述here1here2

  1. 查看here1中的第2项。
  2. 在许多文件中破坏您的资产。这意味着在发生更改时处理的行数会减少。
  3. 首选css / js,它们可能不那么酷,但不需要编译。
  4. 在资源预编译时查找有趣的内容。它可能会降低生产力,但肯定可以消除痛苦。

答案 2 :(得分:0)

正如其他人所指出的,优化资产是提高编译速度的第一种方法(消除不必要的文件和预处理器,谨慎导入,谨慎使用部分)。但是,为什么你在开发模式中转向config.assets.debug = false呢?当它为假时,链接器会将所有文件连接在一起,如果你有大量的文件,这可能需要一段时间。

相反,请转到config.assets.debug = true,以便在第一个请求中编译和缓存资产。 Sprockets设置Cache-Control HTTP标头以减少后续请求的请求开销。浏览器获得304(未修改)响应。请参阅Rails Asset Pipeline文档。