Node.jsで「Must use import to load ES Module」エラーを解決する方法
問題の概要
Node.jsでESモジュール(ESM)をインポートしようとした際に、以下のエラーが発生することがあります:
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module
このエラーは、次のようなコードを実行する際に発生します:
hello.js
export let myArr = ['hello', 'hi', 'hey'];
index.js
import { myArr } from './hello.js';
console.log(myArr);
解決策
1. package.jsonにtypeフィールドを追加する
Node.jsがESモジュールを認識できるようにする最も一般的な方法です:
{
"type": "module"
}
TIP
package.json
に"type": "module"
を追加すると、そのプロジェクト内のすべての.js
ファイルがESモジュールとして扱われます。
2. ファイル拡張子を.mjsに変更する
ESモジュールであることを明示的に示すために、ファイル拡張子を.mjs
に変更します:
mv hello.js hello.mjs
そしてインポート文も修正します:
import { myArr } from './hello.mjs';
3. Node.jsのバージョンを確認する
ESモジュールのネイティブサポートはNode.js 14以降で安定しています。現在のバージョンを確認してください:
node --version
古いバージョン(特に12以下)を使用している場合は、アップグレードを検討してください。
WARNING
Node.js 12以下では、ESモジュールを使用するために--experimental-modules
フラグが必要でした:
node --experimental-modules index.mjs
ただし、このフラグは推奨されていないため、Node.jsの最新バージョンへのアップグレードを強くお勧めします。
4. 依存パッケージの互換性を確認する
一部のパッケージ(例:node-fetch v3など)はESMのみのモジュールとなっている場合があります。CommonJS環境で使用するには:
npm install node-fetch@2 # CommonJS互換バージョンをインストール
5. node_modulesとpackage-lock.jsonを再生成する
依存関係の不一致が原因の場合、以下の手順で解決できることがあります:
rm -rf node_modules package-lock.json
npm install
6. Babelを使用する(レガシー環境向け)
古いNode.js環境でESモジュール構文を使用する必要がある場合、Babelの使用を検討します:
npm install --save-dev @babel/node @babel/core @babel/preset-env
.babelrc
{
"presets": ["@babel/preset-env"]
}
実行コマンド:
npx babel-node index.js
注意
babel-node
は開発環境でのみ使用し、本番環境では適切なビルドプロセスを設定してください。
まとめ
「Must use import to load ES Module」エラーを解決するには、以下のポイントを確認してください:
- Node.jsのバージョンが14以上であること
package.json
に"type": "module"
が設定されていること- ファイル拡張子が適切であること(
.js
または.mjs
) - 使用しているサードパーティパッケージがESM/CommonJSの互換性を満たしていること
最新のNode.jsプロジェクトでは、"type": "module"
を設定する方法が最も推奨されるアプローチです。