有哪些方法可以加快 Rails Asset Pipeline 预编译过程?
3 回答
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.css
是custom.css.scss
编译纯 CSS 和纯 JS 很快(花费几乎 0 毫秒)。但是编译 .scss 和 .coffee 仍然需要一些时间。
总结
- 替换 deploy.rb 资产任务。
检查日志/production.log
- 找到慢速资产
- 删除@import“指南针”;使用替代解决方案。
- 使用 require 代替 @import;(确实需要时使用@import)
- 移除 require_tree,单独挂载资产
- 删除空的 .scss 和 .coffeescript
- 当资产是纯 CSS 时使用 .css。
我刚刚在 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,如果您有任何问题,请告诉我。
(2) 避免使用分部
在 SCSS 中,我们喜欢使用 partial 来组织我们的资产
在最新的 railsconf 中引入了 libsass。
可能事情会改变并用 C 重写,scss partials 承诺会更快