如何加快Rails Asset Pipeline预编译过程?

时间:2012-07-09 07:08:00

标签: ruby-on-rails asset-pipeline

有哪些方法可以加快Rails Asset Pipeline预编译过程?

3 个答案:

答案 0 :(得分:79)

1。 Capistrano部署加速

(1)使用capistrano内置任务'deploy / assets'进行部署。

Capistrano有自己的内置任务'部署/资产'。它将自动为您完成任务。

您自己的手工任务之间的区别是它只加载assets组来预编译资产,而不是整个环境。

cd /home/apps/APP_NAME/releases/20120708184757 && bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile

(2)在资产未更改时跳过预编译过程。

https://gist.github.com/3072362

如果

  • 应用程序/资产
  • LIB /资产
  • 供应商/资产
  • Gemfile.lock的
  • confir / routes.rb中

已更改,它将重新编译资产。否则,它将跳过pecompile进程,节省大量时间。

2。小心使用@import。

(1)避免直接使用@import "compass";

当你

时它都会起作用 SCSS中的

@import "compass";@import "compass/typography/links/link-colors";

但是编译资产时@import "compass/typography/links/link-colors";@import "compass";快9倍。

这是因为当@import "compass";时,它会编译整个罗盘资产。不仅仅是link-colors部分。

(2)避免使用partials

在SCSS中,我们希望使用partial来组织我们的资产。

但是只有你需要共享变量,或者有必要的依赖,否则

//= require "reset"
//= require "base"
//= require "product"

@import "reset";
@import "base";
@import "product";

3。不需要.scss& 。咖啡无缘无故

(1)避免使用require_tree

当我们使用Rails生成器生成控制器时。 Rails还会生成像这样的资产

  • product.css.scss
  • product.js.coffee

并使用以下技术在application.js中挂载资产:

//= require_tree

但空资产(无输出)只包含这一行:

# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

编译它们将耗费大约250毫秒。如果您有10个空资产,则为2.5秒。

从项目中删除它们,或者将它们单独安装在application.js中,如下所示:

//= require prodcuts
//= require users
//= require albums

(2)如果不必要,请不要使用css.scssjs.coffee

  • 编译jquery-ui-1.8.16.custom.css(0ms)(pid 19108)
  • 编译jquery.ui.1.8.16.ie.css(0ms)(pid 19108)
  • 编译jquery.js(5ms)(pid 19108)
  • 编译jquery_ujs.js(0ms)(pid 19108)
  • 编译custom.css(14ms)(pid 19108)

custom.csscustom.css.scss

编译纯CSS和纯JS很快(成本差不多0毫秒)。但是编译.scss和.coffee仍需花费一些时间。

综述

  1. 替换deploy.rb资产任务。
  2. 检查logs / production.log

    • 找到慢资产
    • 删除@import“指南针”;使用替代解决方案。
    • 使用require代替@import; (当真的有必要时使用@import)
    • 删除require_tree,单独装入资源
    • 删除空.scss和.coffeescript
    • 当资产是纯CSS时使用.css。

答案 1 :(得分:20)

我刚刚编写了一个gem来解决Rails中的这个问题,称为turbo-sprockets-rails3。它只通过重新编译已更改的文件来加速assets:precompile,并且只编译一次以生成所有资产。

请注意,我也试图将此补丁合并到Rails 4.0.0中,可能还有Rails 3.2.9(参见https://github.com/rails/sprockets-rails/pull/21)。但是现在,如果你可以帮我测试turbo-sprockets-rails3宝石,那就太棒了,如果你有什么问题请告诉我。

答案 2 :(得分:2)

  
    

(2)避免使用部分

         

在SCSS中,我们喜欢使用partial来组织我们的资产

  

在最新的railsconf上引入了libsass。

可能事情会发生变化并在C中重写,scss partials承诺会更快