Jest で「Unexpected token ‘export’」エラーが出る原因と解決策

Jest を利用してテストを実行していると、突然以下のようなエラーに遭遇することがあります。

Test suite failed to run

    SyntaxError: Unexpected token 'export'

これは特に ESM モジュールを読み込んでいる場合 に頻発するエラーです。従来の CommonJS 環境では問題なく動作していたコードが、ESM 化に伴って Jest 上で動かなくなるケースは多くの開発者が経験しているでしょう。

本記事では、このエラーの原因と解決方法について技術者向けに整理します。実際の設定例やコードも交えて解説します。

1. エラーの背景

Jest は長らく CommonJS を前提に設計されており、ESM(ECMAScript Modules)の完全サポートは比較的新しい機能です。

そのため、プロジェクト内に export を含む ESM モジュールが存在すると、Jest がデフォルトのままでは解釈できずエラーを投げます。特に node_modules 内のパッケージや、type: "module" を指定している場合にこの問題が顕在化します。多くの場合、Babel を通じて ESM をトランスパイルするか、Jest の transform 設定で適切に扱う必要があります。

2. よくある発生パターン

実際にこのエラーが出る典型的なパターンを挙げます。

  • package.json"type": "module" を指定しているプロジェクトでテスト実行
  • ESM を前提とした外部ライブラリをインポートしている
  • Jest の transform 設定が存在せず、素の ESM を読み込んでしまっている
  • babel-jest が導入されていない、あるいは設定されていない

これらのケースでは、Jest が export を含むファイルをそのまま解釈しようとして失敗します。そのため、どのモジュールを変換する必要があるのか を把握して対処することが重要です。

3. 解決方法: Babel と transform の設定

もっとも一般的な解決策は、babel-jest を導入して transform 設定を追加することです。これにより Jest 実行時に ESM を適切に変換して解釈させることができます。

まず babel-jest をインストールします。

npm install --save-dev babel-jest @babel/core @babel/preset-env
babel-jest
Jest plugin to use babel for transformation.. Latest version: 30.1.2, last published: 6 days ago. Start using babel-jest...

次に、プロジェクトルートに .babelrc または babel.config.js を配置します。

{
  "presets": ["@babel/preset-env"]
}

その後、jest.config.js を以下のように設定します。

module.exports = {
  transform: {
    "^.+\\.[t|j]sx?$": "babel-jest"
  }
};

これで Jest は ESM ファイルを Babel 経由で解釈するようになります。

4. NodeNext / ts-jest を利用する場合

TypeScript を利用しているプロジェクトでは、ESM サポートがさらに複雑になります。ts-jest を導入している場合は、以下のように設定します。

npm install --save-dev ts-jest @types/jest
ts-jest
A Jest transformer with source map support that lets you use Jest to test projects written in TypeScript. Latest version...
@types/jest
TypeScript definitions for jest. Latest version: 30.0.0, last published: 3 months ago. Start using @types/jest in your p...

tsconfig.jsonに以下のように指定します。

// jest.config.js
module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'node',
  extensionsToTreatAsEsm: ['.ts'],
  globals: {
    'ts-jest': {
      useESM: true
    }
  }
};

さらに、tsconfig.json では以下を指定します。

{
  "compilerOptions": {
    "module": "NodeNext",
    "moduleResolution": "NodeNext"
  }
}

これにより TypeScript で書かれた ESM モジュールも Jest 上で正しく扱えるようになります。

5. よくある落とし穴と追加対処法

  • node_modules 内の一部ライブラリは ESM 形式のみを提供しているため、Jest が解釈できずにエラーを出すことがあります。その場合は transformIgnorePatterns を調整して特定のパッケージを変換対象に含める必要があります。
  • Babel 設定が二重になっていると、意図せずトランスパイルされないファイルが発生するケースがあります。必ずプロジェクト全体で設定を一貫させることが重要です。
  • Jest のバージョンが古い場合、ESM サポート自体が不十分であり、最新のバージョンに更新することで解決する場合もあります。

これらの落とし穴は特に大規模プロジェクトで顕著に現れるため、チーム内で設定を共有しておくことが推奨されます。

6. まとめ

本記事では、Jest 実行時に発生する 「Unexpected token ‘export’」エラー の原因と解決策を解説しました。

  • Jest はデフォルトで CommonJS 前提のため、ESM をそのまま解釈できない
  • babel-jest を導入して transform 設定を追加するのが基本的な対処法
  • TypeScript プロジェクトでは ts-jestNodeNext 設定を組み合わせる
  • 一部ライブラリは transformIgnorePatterns の調整が必要になる

最終的に、このエラーは 「どのファイルを Jest にどう解釈させるか」 の問題です。適切な設定を行うことで安定したテスト環境を構築できます。

参考

タイトルとURLをコピーしました