Node.jsを使用していると、JavaScriptのESモジュールを利用する際に「Cannot use import statement outside a module」というエラーに直面することがあります。
Cannot use import statement outside a module
このエラーは、Node.jsがデフォルトでCommonJSモジュールを使用しているため、ESモジュールのimport
文を正しく解釈できないことが原因です。
本記事では、このエラーの原因と解決策を詳しく解説し、実際のサンプルコードを交えて説明します。
1. エラーの原因を理解する
「Cannot use import statement outside a module」というエラーは、主に以下の理由で発生します。
- モジュールの種類
- Node.jsはデフォルトでCommonJSモジュールを使用します。これに対して、
import
文はESモジュールの構文であり、Node.jsがESモジュールとしてファイルを認識していない場合にエラーが発生します。
Node.jsのバージョンによっては、ESモジュールのサポートが不完全な場合もあります。
- Node.jsはデフォルトでCommonJSモジュールを使用します。これに対して、
- package.jsonの設定
- ESモジュールを使用するためには、プロジェクトの
package.json
ファイルに"type": "module"
を追加する必要があります。
この設定がない場合、Node.jsはファイルをCommonJSとして扱います。
- ESモジュールを使用するためには、プロジェクトの
- ファイル拡張子
- ESモジュールを使用する場合、ファイルの拡張子を
.mjs
に変更することも一つの方法です。
これにより、Node.jsはそのファイルをESモジュールとして認識します。
- ESモジュールを使用する場合、ファイルの拡張子を
2. 解決策1: package.jsonの設定を確認する
最初の解決策は、package.json
ファイルの設定を確認することです。
以下の手順で設定を行います。
- プロジェクトのルートディレクトリにある
package.json
ファイルを開きます。 "type": "module"
を追加します。これにより、Node.jsはすべての.js
ファイルをESモジュールとして扱います。
{
"name": "my-project",
"version": "1.0.0",
"type": "module",
"main": "index.js"
}
この設定を行うことで、import
文を使用する際のエラーを回避できます。
3. 解決策2: ファイル拡張子を変更する
次の解決策は、JavaScriptファイルの拡張子を変更することです。ESモジュールを使用する場合、ファイルの拡張子を.mjs
に変更することで、Node.jsはそのファイルをESモジュールとして認識します。
以下の手順で行います。
- 使用しているJavaScriptファイルの拡張子を
.mjs
に変更します。 - そのファイル内で
import
文を使用します。
例えば、example.mjs
というファイルを作成し、以下のように記述します。
import { myFunction } from './myModule.mjs';
myFunction();
このようにすることで、Node.jsはexample.mjs
をESモジュールとして扱い、エラーを回避できます。
4. 解決策3: Babelを使用する
Babelを使用してESモジュールをCommonJSにトランスパイルすることも可能です。これにより、古いNode.jsバージョンでもESモジュールを使用できます。以下の手順でBabelを設定します。
- Babelと必要なプラグインをインストールします。
npm install --save-dev @babel/core @babel/preset-env @babel/register
- プロジェクトのルートに
.babelrc
ファイルを作成し、以下の設定を追加します。
{
"presets": ["@babel/preset-env"]
}
start.js
というファイルを作成し、以下のように記述します。
require('@babel/register')({
presets: ['@babel/preset-env']
});
module.exports = require('./server.js');
この設定を行うことで、BabelがESモジュールをCommonJSに変換し、エラーを回避できます。
5. 解決策4: Webpackや他のバンドラーを使用する
Webpackなどのモジュールバンドラーを使用することで、ESモジュールをCommonJSに変換し、エラーを回避することができます。Webpackの設定ファイルでESモジュールを適切に処理するように設定します。以下はWebpackを使用する際の基本的な設定手順です。
- Webpackをインストールします。
npm install --save-dev webpack webpack-cli
- プロジェクトのルートに
webpack.config.js
ファイルを作成し、以下のように記述します。
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.m?js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
]
}
};
- Webpackを実行して、バンドルを作成します。
npx webpack
このようにすることで、ESモジュールを使用したコードをバンドルし、エラーを回避できます。
6. まとめ
Node.jsで「Cannot use import statement outside a module」というエラーが発生した場合、主にpackage.json
の設定やファイルの拡張子が原因です。上記の解決策を試すことで、ESモジュールを正しく使用できるようになります。Node.jsのバージョンやプロジェクトの構成に応じて、最適な方法を選択してください。
これにより、より効率的にJavaScriptのモジュールを管理し、開発を進めることができるでしょう。