みなさま、Railsで外部のJavaScriptライブラリ、例えばUnderscore.jsなどを管理するとき、どんな方法を使っていますか? ファイルを落としてきてvendor/
以下につっこんでますか?
でもそれだと、いざバージョンアップしようと思ったときに面倒ですし、バグがあるのでバージョンを戻したい、といったときにも不便です。そもそもバージョンを管理できていません。
そんなとき、JSの世界ではBowerというツールでライブラリを管理します。Rubyの世界でのBundlerのようなものです。これをRailsで簡単に使えるようにしたのがbower-railsです。
使い方
事前に用意するもの
Railsの環境があることは前提にして、他に以下のセットアップが必要です。
- node.js
- bower
このセットアップについては「Bower入門(基礎編)」という記事で分かりやすくまとめられていますので、まだ導入されていない方は、こちらの記事を参考にセットアップしてみてください。
注意:node.jsのバージョンについて
nodebrewを利用してインストールされる場合は、上記の記事のnode.jsのバージョンだとちょっと古いので、以下のように最新版(2014/4/14現在)のバージョンを指定してnode.jsをインストールして下さい。
nodebrew install v0.10.26 nodebrew use v0.10.26
Railsへの導入方法
Railsのバージョンは4.0.4
、rubyのバージョンは2.1.1
の環境で説明します。

Gemfileには以下のようにbower-rails
を追加します。
source 'https://rubygems.org' gem 'rails', '4.0.4' gem 'sqlite3' gem 'sass-rails', '~> 4.0.2' gem 'uglifier', '>= 1.3.0' gem 'coffee-rails', '~> 4.0.0' gem 'jquery-rails' gem 'turbolinks' gem 'jbuilder', '~> 1.2' gem 'bower-rails' group :doc do # bundle exec rake doc:rails generates the API under doc/api. gem 'sdoc', require: false end
Gemfileへの追加後、bundle install
しまして、次はBowerで管理したいライブラリを管理するBowerfileを作成します。今回はunderscore.jsを使いたいというニーズがあるとして、以下のようなBowerfileを用意します。
aseet 'underscore'
Bowerfileで指定できるライブラリは、ライブラリのルートにbower.json
が設定されている、つまりBowerに対応しているものに限られます。
Bowerfileを作成したあとはライブラリをプロジェクト内にダウンロードするため、bundle exec rake bower:install
を実行します。すると、vendor/bower.json
が作成(または更新)されるのと同時にvendor/bower_components
にライブラリがダウンロードされます。

こんな感じにライブラリがダウンロードされます。

vendor/assets/bower_components
以下にダウンロードされるので、application.jsでrequireするためにも、このパスをconfig.assets.paths
に追加しておきます。
# config/application.rb config.assets.paths << Rails.root.join('vendor', 'assets', 'bower_components')
ここまで終わったらあとはapp/assets/javascripts/application.js
でrequire
するだけです。
//= require jquery //= require jquery_ujs //= require turbolinks //= require underscore/underscore //= require_tree .
これでunderscore.jsを使えるようになりました!
素朴な疑問:bower_componentsはGitで管理するの?
結論から言うと管理しないのが一般的なようなので、.gitignoreにvendor/bower_components
を追加するのが良いと思います。
参考:[Bower] bower_components ディレクトリはgitで管理すべきか問題
BowerでダウンロードされたライブラリのバージョンはGemfile.lockのようにvendor/bower.json
で管理されるので、このファイル自体はバージョン管理しておく必要があります。
Bower便利なので、zurui-sassなんかもBowerに対応するようにしていきたいですね。