webpack フロントエンドでも環境変数を扱う
React+SpringBootアプリでローカル、ステージング、本番環境用に環境変数ファイルがあって、それぞれに接続するAPIアドレスなどが定義されているのはよくあるケース
SpringBootで環境変数を読み込むのは何度も行ってきましたが、Reactで環境変数にアクセスしたことなかった!
今回フロントエンドはwebpack+Reactだったのでwebpackを使って環境変数を読み込む
そもそもwebpackの話
web資材(js、css、画像などのファイル)をpacking(まとめる)するツール
この記事のようにindex.jsなどのエントリポイントから参照される各モジュール(画面コンポーネントなど)をひとまとめにできる!
まとめる設定をwebpack.config.jsファイルに記述する
DefinePluginで環境変数を読み込む
あらかじめlocal.envなどの環境変数ファイルをサーバ内に環境変数として読み込まれるようにしておく
今回はdockerだったのでdocker-compose.ymlにビルド実行するコンテナのenv-filesにlocal.envを指定した
webpack.config.jsにDefinePluginを記述して環境変数をフロントエンドのグローバル変数に置き換える
local.envに定義したAPI_GATEWAYはprocess.env.でアクセスしグローバル変数API_HOSTに格納
const webpack = require('webpack'); module.exports = { mode: 'development', plugins: [ new webpack.DefinePlugin({ 'API_HOST': JSON.stringify(process.env.API_GATEWAY || "") }), ] };
実際にAPI接続するモジュールで declear const API_HOST: string;
と記述すると環境変数の値が利用できる
環境変数を扱う方法にはdotenv、dotenv-webpackもあるがライブラリを追加したくない場合はこの方法が使える