Vite で作った React のアプリで MSW を使おうとしてドキュメントにあるコード (下記)をコピペしたらエラーになった
// src/index.js import React from 'react'; import ReactDOM from 'react-dom'; import App from './App'; if (process.env.NODE_ENV === 'development') { const { worker } = require('./mocks/browser'); worker.start(); } ReactDOM.render(<App />, document.getElementById('root'));
=> Uncaught (in promise) ReferenceError: require is not defined
require は node の方法 (CommonJS) なので ESM なクライアントサイドでは使えない
create-react-app や create-next-app で作られたプロジェクトは webpack が使われていたので CommonJS の require もよしなに変換してくれていたので問題になってなかったが、Vite では DEV モードの時には ネイティブESM を使用するので require が使えないとなっていたっぽい
Vite は、ネイティブ ESM を行使してソースコードを提供します。ブラウザは、実質的にバンドラの仕事の一部を引き受けます
cf. なぜ Vite なのか | Vite
Dynamic Import を使う
require が使えないので ESModule の import を使えばOKということになります
今回は条件式の中で import したいので Dynamic import を使えば良さそうです
// src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
if (process.env.NODE_ENV === 'development') {
- const { worker } = require('./mocks/browser');
- worker.start();
+ (async () => {
+ const { worker } = await import('./mocks/browser');
+ worker.start();
+ })();
}
ReactDOM.render(<App />, document.getElementById('root'));
Dynamic import は非同期なので async の即時関数を作成してその中で import するようにすればOK
これで Vite のプロジェクトでも MSW の worker がどうさするようになりました。
おわり。
[参考]
そうだね…
