65

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

4

3 回答 3

81

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

如果

  • 应用程序/资产
  • 库/资产
  • 供应商/资产
  • Gemfile.lock
  • 确认/路由.rb

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

2. 谨慎使用@import。

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

当你

@import "compass";@import "compass/typography/links/link-colors";在 SCSS 中。

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

那是因为当@import "compass";它编译整个指南针资产时。不只是link-colors一部分。

(2) 避免使用分部

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

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

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

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

3. 不需要 .scss & .coffee 无缘无故

(1) 避免使用 require_tree

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

  • 产品.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

css.scss(2)如果js.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. 检查日志/production.log

    • 找到慢速资产
    • 删除@import“指南针”;使用替代解决方案。
    • 使用 require 代替 @import;(确实需要时使用@import)
    • 移除 require_tree,单独挂载资产
    • 删除空的 .scss 和 .coffeescript
    • 当资产是纯 CSS 时使用 .css。
于 2012-07-09T07:08:38.273 回答
20

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

请注意,我也在尝试将此补丁合并到 Rails 4.0.0 和 Rails 3.2.9 中(请参阅https://github.com/rails/sprockets-rails/pull/21)。但是现在,如果您能帮助我测试turbo-sprockets-rails3 gem,如果您有任何问题,请告诉我。

于 2012-10-03T00:20:40.720 回答
2

(2) 避免使用分部

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

在最新的 railsconf 中引入了 libsass。

可能事情会改变并用 C 重写,scss partials 承诺会更快

于 2012-07-13T18:29:38.110 回答