Create React App製のビルド激重プロジェクトを Rsbuild に置きかえたら最小の手間で幸せになれた
CRA のビルド時間に苦しんでいる人に届けたい内容の記事です。3分半が7秒になりました
背景
業務で扱っている Create React App (CRA)製のプロジェクトがいくつかあるのですが、dev サーバーの起動時間でカップラーメンが作れるぐらいに遅く、触るたびにとてつもないストレスを感じていました。
耐えがたい劣悪な作業環境だったので、飛びぬけて遅いプロジェクトを vite に置きかえるチャレンジを実施したことがあります。この試みは上手くいき、数秒で起動する環境に生まれ変わりました。
しかし CRA と Vite の互換性は低く、パスの書き換えや環境周りの設定など苦難が多い道のりでした。他のPJはまだ我慢できるから CRA のままでいいか……と思いとどまってしまうほどで、今までずっと放置してしまっていました。
ところで、Webpack 互換を Rust で実現することを目指した Rspack というバンドラーをご存じでしょうか。先日 v1 がリリースされていたようです。こちらであれば Vite よりは楽に移植できそうなので、CRAからの移植を試してみることにしました。
前提環境
- Create React App で作成されている
- webpack のカスタマイズはあまりしていない
手順
前知識
Rspack の関連プロジェクトに Rsbuild があります。
react-scripts のまま使っている or Webpack のプラグインを消しても大丈夫なビルド構成であれば、Rsbuild での置き換えが推奨されます。
webpack ≒ Rspack, CRA ≒ Rsbuild のイメージ。
どちらにせよ移行手順はシンプルです。詳しくは最新の公式手順に沿ってください。
Rspack
Rsbuild (推奨)
インストール
> pnpm add @rsbuild/core @rsbuild/plugin-react -D
変更箇所
私のやった作業
- package.json の script を Rsbuild にする
- env 設定などをいくつか rsbuild.config.ts に書く
これで終わり!import の修正など、コード側に手を入れる作業は本当に一切不要でした。
効果
Before
pnpm build: 3分30秒
pnpm dev: 2分35秒
hot reload(HMR): 2.5~3秒
After
pnpm build: 7.5秒
pnpm dev: 4秒
hot reload(HMR): 1.5~2秒
〆
とても幸せになれました。この情報が CRA に苦しんでいる人に届けば幸いです。
おまけ
/* eslint-disable import/no-extraneous-dependencies */
import { defineConfig, loadEnv } from '@rsbuild/core';
import { pluginReact } from '@rsbuild/plugin-react';
const { publicVars } = loadEnv({ prefixes: ['REACT_APP_'] });
export default defineConfig({
plugins: [pluginReact()],
html: {
template: './public/index.html',
},
output: {
distPath: {
root: 'build',
},
},
source: {
define: {
...publicVars,
'process.env': {},
},
},
});
Discussion