はじめに
Viteで作成したReactアプリにJestを導入し、テストを書いて実行したところ
SyntaxError: Cannot use 'import.meta' outside a moduleというエラーで落ちてしまいました。
いくつか記事を調べてみたところ、Vite環境内でもimport.meta.envではなくprocess.envの書き方で環境変数にアクセスするように設定するという方法が主流でした。
しかし、できるだけアプリ側はViteが提供している標準的な記法のままでJestを実行できないか調べていたところ、便利な方法があったため以下記載します。
結論
babel-preset-viteを導入する。
使用方法
公式のREADME通り、以下の手順でインストール・babelの設定を行えばJest内でもimport.meta.envが読み込めるようになります。
インストール
npm install --save-dev babel-preset-vite
babel設定
.babelrcまたはbabel.config.jsで以下のように設定します。
{
"presets": ["babel-preset-vite"]
}
Jest内でmeta.envだけ読み込めればよく、同じくVite環境でのみ生成されるmeta.globやmeta.hotは読み込まないように設定したい場合は以下のようなオプション設定も可能です。
{
"presets": [
[
"babel-preset-vite",
{
"env": true, // defaults to true
"glob": false, // defaults to true
"hot": false // defaults to true
}
]
]
}
原因
Viteで作成されたReact環境ではECMAScriptの記法が採用されている一方で、JestではCommonJSを前提としています。
これはbabel-jestなどのパッケージを導入することで、ECMAScriptのコードを問題なくJest上でテストすることが可能になりますが、今回問題となったimport.meta.envに関してはJavaScript標準のimport.metaオブジェクト内には存在しておらず、Viteが独自に提供しているプロパティであるようです。
パッケージの導入方法で少し触れていますが、import.meta.env以外にもViteが独自に提供しているプロパティとしてはglob, hotなどがあるようです。
それらをコード内で使用していた場合も、このパッケージを導入することでJestでエラーが出ないようになります。
参考記事
参考記事:
- jestでECMAScriptモジュールをテストする方法
- Vite特有のimport.metaプロパティ
- process.envを使用する方法
- babel-preset-viteの導入