Skip to content

Node.jsで「Must use import to load ES Module」エラーを解決する方法

問題の概要

Node.jsでESモジュール(ESM)をインポートしようとした際に、以下のエラーが発生することがあります:

none
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module

このエラーは、次のようなコードを実行する際に発生します:

hello.js

javascript
export let myArr = ['hello', 'hi', 'hey'];

index.js

javascript
import { myArr } from './hello.js';
console.log(myArr);

解決策

1. package.jsonにtypeフィールドを追加する

Node.jsがESモジュールを認識できるようにする最も一般的な方法です:

json
{
  "type": "module"
}

TIP

package.json"type": "module"を追加すると、そのプロジェクト内のすべての.jsファイルがESモジュールとして扱われます。

2. ファイル拡張子を.mjsに変更する

ESモジュールであることを明示的に示すために、ファイル拡張子を.mjsに変更します:

bash
mv hello.js hello.mjs

そしてインポート文も修正します:

javascript
import { myArr } from './hello.mjs';

3. Node.jsのバージョンを確認する

ESモジュールのネイティブサポートはNode.js 14以降で安定しています。現在のバージョンを確認してください:

bash
node --version

古いバージョン(特に12以下)を使用している場合は、アップグレードを検討してください。

WARNING

Node.js 12以下では、ESモジュールを使用するために--experimental-modulesフラグが必要でした:

bash
node --experimental-modules index.mjs

ただし、このフラグは推奨されていないため、Node.jsの最新バージョンへのアップグレードを強くお勧めします。

4. 依存パッケージの互換性を確認する

一部のパッケージ(例:node-fetch v3など)はESMのみのモジュールとなっている場合があります。CommonJS環境で使用するには:

bash
npm install node-fetch@2  # CommonJS互換バージョンをインストール

5. node_modulesとpackage-lock.jsonを再生成する

依存関係の不一致が原因の場合、以下の手順で解決できることがあります:

bash
rm -rf node_modules package-lock.json
npm install

6. Babelを使用する(レガシー環境向け)

古いNode.js環境でESモジュール構文を使用する必要がある場合、Babelの使用を検討します:

bash
npm install --save-dev @babel/node @babel/core @babel/preset-env

.babelrc

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

実行コマンド:

bash
npx babel-node index.js

注意

babel-nodeは開発環境でのみ使用し、本番環境では適切なビルドプロセスを設定してください。

まとめ

「Must use import to load ES Module」エラーを解決するには、以下のポイントを確認してください:

  1. Node.jsのバージョンが14以上であること
  2. package.json"type": "module"が設定されていること
  3. ファイル拡張子が適切であること(.jsまたは.mjs
  4. 使用しているサードパーティパッケージがESM/CommonJSの互換性を満たしていること

最新のNode.jsプロジェクトでは、"type": "module"を設定する方法が最も推奨されるアプローチです。