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 install6. 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"を設定する方法が最も推奨されるアプローチです。