419 文字
2 分
ECMAScript Modules (ESM) と CommonJS

ECMAScript Modules (ESM)#

  • JavaScriptの標準規格で定義されたモジュールシステム
  • ブラウザとNode.jsで動作
  • 静的にモジュールを解析し、依存関係を解決
  • 型情報を含む
  • デフォルトエクスポートのみ許可
  • 相対パスと絶対パスの両方をサポート
  • 簡潔な構文
  • 動的importや名前空間など、新しい機能をサポート

CommonJS#

  • Node.jsコミュニティで開発されたモジュールシステム
  • Node.jsでのみ動作
  • 実行時にモジュールをロードし、依存関係を解決
  • 型情報は含まない
  • すべてのエクスポートを許可
  • 相対パスのみサポート
  • 複雑な構文
  • CommonJSモジュールのエコシステムとの互換性

その他の違い#

importrequire
動的import可能不可
名前空間可能不可
サイクル依存検出可能検出困難
Tree Shaking可能困難

動的import

サイクル依存#

サイクル依存とは、モジュールAがモジュールBに依存し、モジュールBがモジュールAに依存するような依存関係のことです。

importの場合、モジュール解析時に依存関係を静的に解析するため、サイクル依存を検出することができます。

一方、requireの場合、モジュールロード時に依存関係を動的に解決するため、サイクル依存が発生した場合、無限ループに陥る可能性があります。

// モジュールA.js
const B = require("./B");
// モジュールB.js
const A = require("./A");
// エラー: サイクル依存が発生

JavaScriptにおける、 Tree Shaking とは?#

JavaScriptにおける、 Tree Shaking とは?

どちらを使用するべきか#

  • ブラウザで動作するコード: importを使用
  • Node.jsで動作するコード: requireを使用
  • 新しい機能を使用したい場合: importを使用
  • 既存のCommonJSモジュールと互換性を保ちたい場合: requireを使用

関連記事#

import と require の違い