はじめに
DHHがRails5.1にwebpackを取り入れる意向を示し、その実装としてwebpacker gemを提案しました。
まだ最低限の方針が示されただけで機能は全然足りてませんが(コミットチャンスですよ!!)、どんな実装になっているか軽く見てみました。
リポジトリ, PR
webpacker gem: https://github.com/rails/webpacker
PR to Rails: Basic --webpack delegation to new webpacker gem
内容
注: あくまで2017/1/18現在の話で、これから多くの変更が入ることになります
- webpackのラッパーになっている
- webpackを用いたJSアプリの素地を作ってくれる
- webpackのコマンドをrakeコマンドでラップしている
- rake越しにやりたくない人は、webpackを直に叩くことももちろん可能
- sprocketsとは役割が違うので、sprocketsを殺す予定はない
- sprocketsの役割は、view(controller)ごとのassetを用意すること
- webpackerは個別のJSアプリ(モジュール)を作るのに利用する
- 例えばカレンダーアプリを作る場合、
app/javascript/packs/calendar.js
をエントリーポイントとした一つのJSアプリを作り、それを組み込むことになる - viewごとにファイルが作られると、このようなJSアプリごとのファイルを書きにくかった
- 例えばカレンダーアプリを作る場合、
- Rails5.1以上に対応するが、開発の都合上、現在は5.0でも動くようになっている
- DHH的には5.1以上しか対応するつもりはない
- 一部のrakeコマンドを割り切れば、多分4.xでも動く
- sprocketsの
javascript_include_tag
の代わりにjavascript_pack_tag
を使う -
コード置き場は
app/javascript/
になる-
app/assets/
はasset pipelineのためのディレクトリなので、外に出す必要があったのだと思う -
app/javascript/packs/
にエントリーファイルを置き、app/javascript/
にそれ以外を置く形- 例えば、
app/javascript/packs/calendar.js
とapp/javascript/calendars/*.js
って形でファイルを置いて、app/javascript/packs/calendar.js
を起点にコードを書くことになる
- 例えば、
- ディレクトリのネーミングに疑問を覚える人は次のPRについたコメントを読んでください
-
- ビルド生成物は
public/packs/
に置かれる - 設定ファイル置き場は
config/webpack/<env name>.js
- rake task
-
bin/rake webpacker:install
でテンプレートから設定ファイルとか作ってくれる -
bin/rake webpacker:compile
でwebpackを使いビルドしてくれる(for production)
-
- 開発時の
webpack --watch
はbin/webpack-watcher
を通して行う
参考実装
このリポジトリを見ればReact, Angular, Vueでの実装例がわかりますので、webpackerを導入する前に一度見てみるといいかも
雑感
実装はまだ最低限ですが、webpackをシンプルに利用できるインターフェースが提供されていて非常に良いと思いました。
また、先日「5.1にwebpackが入りそう」という話が出た際に「webpackでいいのか?」という意見が何件か見られましたが、まず大前提としてこの機能はオプションですし、さらにこのwebpacker gemはロックインする何かを作るわけではなさそうなので、webpackが廃れたり別に何かもっといいものが出てきたならば、それはその時に誰かが(あなたが)webpackerと同じように拡張を書けばいいだけだ、ということを伝えるモデルケースとしてもうまくできていると思いました。
さあ、方針はわかったと思うのでみなさんコミットしましょうね