こんな感じのものを作る話。
[バージョン情報]
$ yarn -v 1.22.4 $ create-react-app --version 3.4.1
yarn
を使うとcreate-react-app
は自動的に最新バージョンになるのであまり気にしなくてよい。
準備として、任意のディレクトリで下記のコマンドを実行し、新たにプロジェクトを作成する。
yarn create react-app sample-app --template typescript
[環境変数を利用する]
シンプルに<div>Version 0.1.0</div>
という記述を追加してもアプリのバージョンを表示することはできる。しかしせっかくなので、package.jsonに記載されているバージョン情報を利用したい。
react package.json version
で検索すると、次のページにたどり着いた。
var pjson = require('./package.json');
のようにすれば、package.json
の情報をなんでも利用できるが、セキュリティ上問題があるからやるべきではないと言われている。なるほど。
コメントを読み進めると、$npm_package_version
をnode上で環境変数として利用できるとある。
しかし、App.tsx
に<p>{process.env.npm_package_version}</p>
を追加してサーバーを起動しても画面に反映されない。
create-react-appのサイトを調べると、React側で利用できる環境変数は、NODE_ENV
という特別な環境変数と、REACT_APP_
ではじまる環境変数しか利用できないらしい。
環境変数はプロジェクトのルートディレクトリに配置した.envファイル
に定義することもできる。これを利用して、下記のような.envファイル
を作成する。
REACT_APP_VERSION=$npm_package_version
同様に、App.tsxファイル
にも追記する。
<div>Version {process.env.REACT_APP_VERSION}</div>
これで無事バージョン情報をブラウザで確認できた。
(画像では.env.localファイル
を追加して、その中でREACT_APP_VERSION=$npm_package_version.local
と指定しているので、バージョンの末尾に.localとついている)
[productionビルドを試す]
yarn build
コマンドを実行するとbuild
ディレクトリ以下にminifyされたjsファイル(とcssファイル)が出力される。
念のためこちらの中身を確認しておくと、ちゃんとpackage.json
に記載されているバージョンがjsファイル上にハードコーディングされていた。
.env.localファイル
が存在しても、productionビルド時にはちゃんと.envファイル
を参照してビルドしてくれていることが分かった。
yarn global add serve
コマンドを実行してserveコマンドをインストールし、server -s build
コマンドを実行してビルド結果のディレクトリをWebサーバー経由で公開することができる。
ブラウザからhttp://localhost:5000
を開いて動作確認すると、こちらも問題なく動作した。
[まとめ]
package.json
のバージョン情報を.envファイル
経由で環境変数に設定し、tsxファイル側で利用する方法をまとめた.envファイル
にREACT_APP_で始まる任意の環境変数を設定すると、process.env.REACT_APP_XXXX
の形でtsxファイルから利用できる(それ以外はNODE_ENV
環境変数のみ利用可).env.localファイル
でローカル用に環境変数を設定していても、yarn build
した結果のproductionビルド時には.envファイル
の情報が反映される