こんにちは、かつコーチです。
Node.jsのコードを読んでいると、requireとimportの両方が出てきて混乱した経験はありませんか。
「どっちを使えばいいのか分からない」「混ぜて使ったらエラーになった」という声をよく聞きます。
この記事では、CommonJSとESモジュールという2つのモジュールシステムの違いを整理し、混在時のエラー対処法まで解説します。
基本の書き方
CommonJS(require/module.exports)とは
CommonJSとは、Node.jsで昔から使われてきたモジュールシステムです。
モジュールとは、機能ごとに分割されたコードのファイルのことです。
CommonJSでは、requireで他のファイルを読み込み、module.exportsで外部に公開します。
// math.js
function add(a, b) {
return a + b;
}
module.exports = { add };
// index.js
const { add } = require("./math.js");
console.log(add(1, 2)); // 3
拡張子が.jsの場合、Node.jsはデフォルトでこのCommonJS形式として扱います。
ESモジュール(import/export)とは
ESモジュールとは、JavaScriptの標準仕様として定められたモジュールシステムです。
ブラウザのJavaScriptでも使われている書き方なので、フロントエンドの経験がある方には馴染みやすいはずです。
// math.mjs
export function add(a, b) {
return a + b;
}
// index.mjs
import { add } from "./math.mjs";
console.log(add(1, 2)); // 3
importとexportを使う点が、CommonJSとの大きな違いです。
package.jsonの”type”: “module”設定
拡張子を.mjsにしなくても、ESモジュールを使う方法があります。
package.jsonに以下の設定を追加することです。
{
"name": "my-app",
"type": "module"
}
"type": "module"を指定すると、拡張子.jsのファイルもESモジュールとして扱われます。
逆に、この設定をした状態でrequireを使うとエラーになるので注意が必要です。
CommonJSとESモジュールの比較
| 項目 | CommonJS | ESモジュール |
|---|---|---|
| 読み込み | require() | import |
| 公開 | module.exports | export |
| 実行タイミング | 同期的(実行時に読み込む) | 非同期的(事前に解析される) |
| デフォルト拡張子 | .js | .mjs(または"type": "module"指定時の.js) |
| 主な用途 | 既存のNode.jsプロジェクト | 新規プロジェクト・フロントエンド連携 |
新規プロジェクトでは、フロントエンドとの書き方を揃えやすいESモジュールがおすすめです。
ただし、古いライブラリの中にはCommonJSにしか対応していないものもあるため、乗り換え時は注意しましょう。
よくあるつまずきポイント・エラー対処
requireとimportを混在させたときのエラー
私が実際に遭遇したのは、"type": "module"を設定したプロジェクトで、うっかりrequireを使ってしまったケースです。
❌ Before
// package.jsonに "type": "module" を設定した状態
const express = require("express");
実行すると、以下のエラーが表示されました。
ReferenceError: require is not defined in ES module scope, you can use import instead
"type": "module"を指定した時点で、requireが使えなくなるというルールを理解していなかったのが原因でした。
✅ After
// package.jsonに "type": "module" を設定した状態
import express from "express";
requireをimportに書き換えることで、エラーは解消しました。
"type": "module"を設定するプロジェクトでは、requireを一切使わない前提でコードを統一するのがポイントです。
まとめ
この記事のポイント
- CommonJSは
require/module.exportsを使う、Node.js従来のモジュールシステムである - ESモジュールは
import/exportを使う、JavaScript標準のモジュールシステムである - package.jsonの
"type": "module"設定で、ESモジュールを有効にできる - 2つの方式を混在させると
ReferenceErrorが発生するため、プロジェクト内で統一する
次に読むべき記事
モジュールの基本が分かったら、次はExpressでサーバーを立ててみましょう。
「Expressで最小構成のサーバーを立てる(npm init〜起動まで)」で、環境構築の手順を解説しています。
