Create React App の webpack 環境を eject することで隠蔽された構成ファイルが、プロジェクトフォルダに顕現する。それらファイルを直接参照できることによって webpack や babel、ESLint など、カスタマイズを可能にしている。
ところが、複雑な構成ファイルを扱うにも抵抗があったり、eject すると元に戻せなかったりとネガティブな感情を覚えてしまう。
そこで、このエントリーでは、eject せずに Create React App をカスタマイズする方法を紹介したい。
もくじ
カスタマイズの準備
eject せずに Create React App をカスタマイズするにも、多少の準備が必要だ。決して難しいことではないから引き続き付き合ってほしい。
パッケージをインストールする
webpack 環境をオーバーライドするのに必要なパッケージをインストールしたい。必要なパッケージは次の、
- react-app-rewired
- customize-cra
をインストールする。
ついては、以下コマンドを実行してほしい。
$ yarn add react-app-rewired customize-cra --dev
# or
$ npm install react-app-rewired customize-cra --save-dev
開発環境をカスタマイズするためのパッケージであるわけだから、いずれのコマンドも --dev や --save-dev オプションを付与することで、devDependencies 所属のパッケージとしてインストールしている。
package.json を修正する
package.json の scripts 項を修正する。
...
"scripts": {
"start": "react-app-rewired start", 👈
"build": "react-app-rewired build", 👈
"test": "react-app-rewired test", 👈
"eject": "react-scripts eject"
},
...
ここでは、eject コマンド以外の react-scripts を react-app-rewired にしているだけだ。
もともと react-scripts が隠蔽された構成ファイルを参照していたところに、react-app-rewired にすることでカスタム用構成ファイルを介入させる作りだと考えられる。
構成ファイルを用意する
まずはプロジェクトルートに config-overrides.js を新規作成しよう。とりあえず何も記述していない状態で構わない。
$ touch config-overrides.js

カスタマイズを実施
webpack 環境のカスタマイズにおいて依存関係にある react-app-rewired と customize-cra をインストールして、package.json を修正して、config-overrides.js を作成してきた。すでに eject せずにカスタマイズできる状態だ。
それではサンプルとして、babel 構成をカスタマイズして、import のパスに alias を設定してみよう。
モジュールのインポートを次の import MyComponent from '~/components/MyComponent'; のような具合に書き換えられ、これにより相対パス記述時にみられる冗長さ(例:../../../components)を回避できるはずだ。
babel プラグインをインストールする
babel-plugin-root-import をインストールしよう。
$ yarn add babel-plugin-root-import --dev
# or
$ npm install babel-plugin-root-import --save-dev
config-overrides.js に記述する
まず冒頭でインストールしておいた customize-cra のヘルパー関数を分割代入で読み込む。続いて override メソッドの引数に、addBabelPlugins メソッドでプラグインを設定する。
const { override, addBabelPlugins } = require('customize-cra');
module.exports = override(
...addBabelPlugins([
'root-import',
{
rootPathPrefix: '~',
rootPathSuffix: 'src',
},
])
);
果たして、モジュールの import パスに alias を設定できた。
// before
import MyComponent from 'src/components/MyComponents';
// after
import MyComponent from '~/components/MyComponents';
まとめ
Create React App を eject せずにカスタマイズする方法の紹介だった。
「eject すると元に戻せない」と言われると、どうにも抵抗を覚えてしまうもので、当該エントリーの手段は、優れたソリューションではないだろうか。
サンプルでご覧にいれた import パスの alias 設定だったり、SVG ファイルを React コンポーネントとして読み込む設定だったりのカスタマイズシーンは想定できる。babel プラグインを加えたいという程度ならば、今後も活用していこうと思う。
このエントリーが、あなたのクリエイティビティを刺激するものであると期待したい。
