レガシーReactアプリから標準create-react-app
に移行するプロジェクトがあります(排出されません)。
レガシープロジェクトでは、dotenv
および.env
を含むdotenv-expand
ファイルを手動でロードし、webpack DefinePlugin
を介して挿入します。
create-react-app
はdotenv
を直感的にサポートしますが、REACT_APP_
接頭辞が付いた変数のみを認識できます。
レガシーコードには、process.env.xxx
変数を使用している他のリポジトリにインポートされたパッケージと同様に非常に多くの場所があるため、移行前にプレフィックスを付けて名前を変更することは今のところ不可能です。
この場合、create-react-app
プレフィックスのないdotenv変数をREACT_APP_
に認識させるにはどうすればよいですか?
ところで、私は前にrewire
ビルドスクリプトを試しましたが、jsとcssをバンドルするなど、webpackを介していくつかの簡単なカスタマイズを行いました。
const path = require('path');
const rewire = require('rewire');
const defaults = rewire('react-scripts/scripts/build.js');
let webpackConfig = defaults.__get__('config');
webpackConfig.output.filename = 'static/js/[name].js';
webpackConfig.optimization.splitChunks = { cacheGroups: { default: false } };
webpackConfig.optimization.runtimeChunk = false;
webpackConfig.plugins.find(plugin => plugin.__proto__.constructor.name === 'MiniCssExtractPlugin').options.filename = 'static/css/[name].css';
webpackConfig.plugins.find(plugin => plugin.__proto__.constructor.name === 'MiniCssExtractPlugin').options.moduleFilename = () => 'static/css/[name].css';
しかし、dotenv
とDefinePlugin
はより複雑なようです。それが同じ方法で達成できるかどうかはわかりません。
数年前 Dan Abramov(CRAの共同作成者)は、変数を再定義してエントリポイントスクリプトにREACT_APP_
を合わせ、package.jsonのreact-scriptsを呼び出すことを提案しました。
NetlifyのCOMMIT_REF
やGitlabのCI_COMMIT_SHA
などのCIプラットフォーム変数など、これらの変数をサポートする必要がある場合は、別のスクリプトを追加せずにこれらの変数をインラインで設定できます。
"scripts": {
"start": "react-scripts start",
"build": "REACT_APP_COMMIT_SHA=$COMMIT_REF$CI_COMMIT_SHA react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
これはREACT_APP_COMMIT_SHA
を、それが組み込まれているサービスのハッシュの値に設定します(他の変数は空になるため)。