Rails3.2.xのAssets precompile を最適化してスピードアップする

Rails3.2.x で開発時にassets precompileに時間を要していたので、なんとか早くすべく調べていたら、stackoverflowに以下の記述があったので実際に試してみたらスピードアップしたので忘れないうちまとめてみた。

  • Capistranoを利用している場合は、Capistranoのビルトインタスクである ‘deploy/assets’ を使用する。
    Capistranoのビルトインタスクを利用することで、assetsのみをプリコンパイルするためアプリ全体を対象にプリコンパイルするよりも早くなります。

    1
    bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile
  • 変更のあったファイルだけをプリコンパイルする。
    変更のあったファイルだけをプリコンパイルし、それ以外のファイルはスキップするたプリコンパイルにかかる時間が短くなります。
    今回、私は Turbo Sprockets for Rails 3.2.x を使いました。

  • Sassの@importの見直し
    SassやScssを使っている場合、Compassを利用すると思うのですが、Compassのmixinのimportはできるだけ細かく制御する。
    とくに @import “compass”; のように記述してしまうと、Compass全体を読込むため、@import “compass/css3/transition” の様に必要なmixinのみを読込むのに比べて約9倍遅くなるそうです。

  • partialを使用しない
    変数や依存ファイルを読込む場合も @import ではなく require で読込む方がより早いそうです。

    1
    2
    3
    4

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

    よりも

    1
    2
    3
    4

    //= require "reset"
    //= require "base"
    //= require "product"
  • require_tree は使わない
    例えば、それぞれが空のファイルのmain.js.cofee、signup.js.coffee、login.js.coffeeがあったとき
    application.jsに require_tree の記述があると、プリコンパイルには最低でも約750msかかります。
    .coffeeファイルが空であっても、application.jsにrequire_treeが記述されている場合、
    プリコンパイルには1ファイルあたり約250msをかかるっぽい。ファイル数が増えるだけ、比例的にプリコンパイルの時間がかかります。

  • 必要がない場合は.scssや.coffeeファイルにしない
    sassやcoffeeで記述されてないファイルを.scssや.coffeeとしてしまうと、その分だけプリコンパイル時間を要します。
    .cssや.jsファイルの場合は、プリコンパイル不要なので処理されないのに対し、.scssや.coffeeファイルは必ずプリコンパイルに時間を要します。
    ファイル数が多いほどその時間は増えます。
    という感じだったので、実際に修正したところ10倍くらい早くなった。
    とくにCompassのmixinのimportは細かく制御した方がいいですね。

Comments