【Node.js】CommonJSとESモジュール(require/import)の違い

JavaScript

こんにちは、かつコーチです。

Node.jsのコードを読んでいると、requireimportの両方が出てきて混乱した経験はありませんか。

「どっちを使えばいいのか分からない」「混ぜて使ったらエラーになった」という声をよく聞きます。

この記事では、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

importexportを使う点が、CommonJSとの大きな違いです。

package.jsonの”type”: “module”設定

拡張子を.mjsにしなくても、ESモジュールを使う方法があります。

package.jsonに以下の設定を追加することです。

{
  "name": "my-app",
  "type": "module"
}

"type": "module"を指定すると、拡張子.jsのファイルもESモジュールとして扱われます。

逆に、この設定をした状態でrequireを使うとエラーになるので注意が必要です。

CommonJSとESモジュールの比較

項目CommonJSESモジュール
読み込みrequire()import
公開module.exportsexport
実行タイミング同期的(実行時に読み込む)非同期的(事前に解析される)
デフォルト拡張子.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";

requireimportに書き換えることで、エラーは解消しました。

"type": "module"を設定するプロジェクトでは、requireを一切使わない前提でコードを統一するのがポイントです。

まとめ

この記事のポイント

  • CommonJSはrequire/module.exportsを使う、Node.js従来のモジュールシステムである
  • ESモジュールはimport/exportを使う、JavaScript標準のモジュールシステムである
  • package.jsonの"type": "module"設定で、ESモジュールを有効にできる
  • 2つの方式を混在させるとReferenceErrorが発生するため、プロジェクト内で統一する

次に読むべき記事

モジュールの基本が分かったら、次はExpressでサーバーを立ててみましょう。

「Expressで最小構成のサーバーを立てる(npm init〜起動まで)」で、環境構築の手順を解説しています。

タグ: #Node.js #中級者向け #基本文法

タイトルとURLをコピーしました