RubyOnRails

railsのアセットパイプラインについて解説する

なんとなく知っているけど、聞かれたらドキッとするのでAssets Pipelineについて詳しくまとめました。

アセットパイプラインとは何か?

作業がしやすいように画像、javascript、css、htmlファイルを分解つしてコーディングして、最終的に1つのファイルにまとめる仕組みのことです。

普段railsを使うときには意識することはありませんが、htmlファイルはapp/viewsに配置されてjavascriptファイルはapp/assets/javascriptsに配置されていると思います。

このようにファイルは分けて管理した方が、人間にとってはわかりやすいですが、最終的には全て統合して一つのファイルに統合して扱われます。さらに字を詰めることでファイルの容量を最小化する働きがあります。

アセットパイプラインの動き

1.コンパイル

  • .js.coffee形式のファイルを.js形式にコンパイル
  • .css.scss形式のファイルを.css形式にコンパイル

2.統合

コンパイル済みの

  • .js形式のファイル達をapplication.js
  • .css形式のファイル達をapplication.css

に統合する。

3.統合

application.jsとapplication.cssから改行、コメント、空白を取り除く

4.ダイジェスト付与

圧縮後のapplication.jsやapplication.cssや画像にハッシュ値というファイル固有の文字列を付与する。
これによって、編集作業をするごとに全く別のファイルだと認識され、予期せぬキャッシュの適用を防ぐ。

キャッシュについてのわかりやすいページ
ダイジェストについてのわかりやすいページ

どこが担っているの?

技術的には、アセットパイプラインは既にRails 4のコア機能ではありません。フレームワークから分離され、sprockets-railsというgemに書き出されています。

Railsではデフォルトでアセットパイプラインが有効になっています。

引用:RAILS GUIDE

またsprockets-railsはアセット圧縮の際に

gem 'sass-rails' //sassファイルをコンパイル
gem 'uglifier'   //javascriptのコード軽量化
gem 'coffee-rails'  //coffeeファイルをコンパイル

を使っています。

アセットプリコンパイル

production環境では処理速度に対する影響を防ぐために自動でコンパイルが行われない。
解決方法が二つある。

  • アセットプリコンパイルを行う
  • 設定を変える

アセットプリコンパイルを行う

以下のコマンドを実行します

rake assets:precompile RAILS_ENV=production

設定を変える

config/production.rb
config.assets.compile = true

に変える。