This post is based on my blog post: http://blog.xdite.net/posts/2012/07/09/3-way-to-speedup-asset-pipeline/
Here are my three tips for speedup asset pipeline precompile process:
- Capistrano deployment speedup
- Use @import carefully.
- don’t require .scss & .coffee for no reason
Capistrano has its own built-in task 'deploy/assets'. It will automatically do task for you.
The difference between your own handcraft task is it only load assets
group to precompile assets, not whole environment.
cd /home/apps/APP_NAME/releases/20120708184757 && bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile
https://gist.github.com/3072362
If
- app/assets
- lib/assets
- vendor/assets
- Gemfile.lock
- confir/routes.rb
are changed, it will recompile assets. Otherwise, it will skip the pecompile process, save a lot of time.
It will both work when you
@import "compass";
or @import "compass/typography/links/link-colors";
in SCSS.
But @import "compass/typography/links/link-colors";
is 9 times faster than @import "compass";
when you compile assets.
That is because when @import "compass";
, it compile whole compass assets. not only just link-colors
part.
In SCSS, we like to use partial
to organize our assets.
But only if you need to share variables, or there are necessary dependencies, otherwise
//= require "reset"
//= require "base"
//= require "product"
is faster than
@import "reset";
@import "base";
@import "product";
When we use Rails generator to generate controllers. Rails will also generate assets likes this
- product.css.scss
- product.js.coffee
and mount assets in application.js using this techniques:
//= require_tree
But the empty assets (output nothing) which only contain this lines:
# 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/
It will cost you about 250ms to compile each of them. If you have 10 empty assets, it will be 2.5 seconds .
Remove them from your project, or mount them individually in application.js like this:
//= require prodcuts
//= require users
//= require albums
- Compiled jquery-ui-1.8.16.custom.css (0ms) (pid 19108)
- Compiled jquery.ui.1.8.16.ie.css (0ms) (pid 19108)
- Compiled jquery.js (5ms) (pid 19108)
- Compiled jquery_ujs.js (0ms) (pid 19108)
- Compiled custom.css (14ms) (pid 19108)
custom.css
is custom.css.scss
Compile pure CSS and pure JS is fast ( cost almost 0 ms). But compile .scss and .coffee still cost some time.
- replace deploy.rb assets task.
- check logs/product.log
- find slow assets
- remove @import "compass"; use alternative solution.
- use require instead @import; ( use @import when it is really necessary )
- remove require_tree, mount assets individually
- remove empty .scss and .coffeescript
- use .css when assets are pure CSS.