Webpack で git 管理してもよいような環境ごとに値の異なる定数を設定する方法

mori-dev|2017年04月13日
JavaScript

です。仕事でのちょっとしたコミットをブログ記事化するシリーズです。今日は Webpack の話題です。

課題

環境ごとに値の異なる定数として、git で管理できるものと git で管理すべきではないものがあります。後者は dotenvWebpack の DefinePlugin で実現できます。git で管理してよいような、環境ごとに値の異なる定数はどう扱えばよいのでしょうか。

答案

webpack-merge で環境ごとに設定ファイルを分離して、Webpack の DefinePlugin と組み合わせてみました。webpack-merge の smartStrategy で plugins 欄の扱いをコントロールします。

production 環境でだけ違う値を使いたい場合は、webpack.config.base.js の値を webpack.config.production.js の値で上書きできるように設定した上で、webpack.config.base.js でデフォルト値を指定して、webpack.config.browser.production.js で production 用の値を指定します。以下は webpack.config.browser.production.js の例です。

const config = merge.smartStrategy({
plugins: ‘prepend’ // DefinePlugin の base の値を上書きできるようにする
})(baseConfig, {優先される設定})

module.exports = config;

補足

flowtype 対策が必要かもしれません。たとえば APP.HOGE という定数だとすると、decls/my_app_types.js に `declare var APP: Object;` と記述します。
eslint 対策が必要かもしれません。たとえば APP.HOGE という定数だとすると、.eslintrc.yaml に以下のように記述します。ワードプレスの引用記法では、インデントが崩れている点はご注意下さい。

globals:
APP: true

テストが落ちないようにする必要もあります。たとえば APP.HOGE という定数だとすると、 test/util/global.js に以下のように書いた上で、

global.APP = {
‘HOGE’: ‘3000’,
}
export default global;

次のように呼び出しておきます。

/* eslint-disable no-unused-vars */
import global from ‘../util/global’;

環境

  • webpack v2.3.3
  • webpack-merge v4.1.0