webpackerでデフォルト以外のenvironmentを使いたい場合

"environment"が指すものがRAILS_ENVとNODE_ENVの2つあり、かつwebpackerはその両方を利用するのでわかりづらい。

config/webpacker.yml

RAILS_ENVに対応したキーの設定を使う

config/webpack/*.js

NODE_ENVに対応したキーのファイルを使う。のだけど注意点がある。

例えばNODE_ENV=stagingのときにはconfig/webpack/staging.jsを使う。その中で次のようにしていたとする。このとき、変数environmentに入るのはwebpackerがproduction用に用意した設定になる。

const environment = require('./environment')

module.exports = environment.toWebpackConfig()

これは、webpackerが

  • test,development,production用のデフォルト設定を用意している
  • NODE_ENVがデフォルト設定のいずれかと同様であればそれを、どれでもなければproduction用のデフォルト設定を利用する

という仕様になっているから。このへんを見ると挙動がつかめるはず。

https://github.com/rails/webpacker/blob/d905149d8a33303a9c24002721bc872ef95a8b6f/package/env.js

NODE_ENVはどのように決まるか

./bin/webpackコマンドでコンパイルするときは、明示的にNODE_ENVを設定しないとdevelopmentになる

https://github.com/rails/webpacker/blob/d905149d8a33303a9c24002721bc872ef95a8b6f/lib/install/bin/webpack#L4

rails assets:precompilerails webpacker:compileを実行したときは、明示的にNODE_ENVを設定しないとproductionになる

https://github.com/rails/webpacker/blob/d905149d8a33303a9c24002721bc872ef95a8b6f/lib/tasks/webpacker/compile.rake#L29

前はRAILS_ENVも見てなかったっけ?

https://github.com/rails/webpacker/pull/1359 で今の挙動に変わったらしい