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

Posted

技术标签:

【中文标题】如何加快 Rails Asset Pipeline 预编译过程?【英文标题】:How can you speed up the Rails Asset Pipeline precompile process? 【发布时间】:2012-07-08 13:54:48 【问题描述】:

有哪些方法可以加快 Rails 资产管道预编译过程?

【问题讨论】:

是的,这太疯狂了。 3.7GHz的八核,需要30m! CKEditor 是最差的! 【参考方案1】:

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 确认/routes.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 也会生成这样的资产

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 仍然需要一些时间。

总结

    替换 deploy.rb 资产任务。

    检查日志/production.log

    查找慢速资产 删除@import“指南针”;使用替代解决方案。 使用 require 代替 @import; (真正需要时使用@import) 移除 require_tree,单独装载资产 删除空的 .scss 和 .coffeescript 当资产是纯 CSS 时使用 .css。

【讨论】:

【参考方案2】:

我刚刚在 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,那就太好了,如果您有任何问题,请告诉我。

【讨论】:

@nathan.f77 它被合并到 rails4 中了吗?我在使用它时遇到了错误Errno::ENAMETOOLONG @brauliobo,Rails 4 有一些单独的资产改进,这意味着您不再需要使用这个 gem。【参考方案3】:

(2) 避免使用分词

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

在最新的 railsconf 中引入了 libsass。

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

【讨论】:

以上是关于如何加快 Rails Asset Pipeline 预编译过程?的主要内容,如果未能解决你的问题,请参考以下文章

markdown Rails Asset Pipeline:`require`指令

在asset_pipeline中包含来自rails应用程序之外的资产

禁用 Asset Pipeline/Sprockets Rails 4.1

如何使用 Asset Pipeline 从非标准目录传递字体

如何使用 Grails Asset-Pipeline 插件从 Javascript 访问图像?

带有 3rd 方库的 Grails Asset-Pipeline 系统