できない.dev

CommonJS

別名: CJS / CommonJS modules

Node.js が長らく標準としてきた同期的なモジュール方式。require() で読み込み module.exports で公開する。ESM とは解決規則も実行モデルも異なる。

#commonjs#esm#nodejs#module#require

公開:

定義

CommonJS(CJS) は、Node.js が長らく標準としてきた 同期 モジュール方式。
各ファイルが関数ラッパーで囲まれ、require() で他モジュールを読み、module.exports / exports で公開する。__dirname / __filename / require / module / exports の 5 つのグローバル相当が自動注入される点が特徴。

詳細

拡張子 .cjs のファイル、または package.json"type" が未設定か "commonjs" のときの .js が CJS として解釈される。require() はファイルを読みながら同期的に評価し、循環依存があると 未完成の module.exports がそのまま返るため、ESM の静的解析とは挙動が違う。
ブラウザは CJS をそのまま実行できず、webpack / esbuild などが内部で ESM 風に変換して動かす。
判定規則の詳細は Node.js の公式ドキュメントに記載されている。

よくある誤解

  • import を書けば自動で ESM になる:違う。
    TypeScript / Babel が出力する import は設定次第で内部 require() に変換され、依然 CJS のまま動く。package.json"type" と拡張子が真の判定基準。
  • CJS は古いので使わない方がいい:Node では今でも一級市民。
    ESM 専用ライブラリへの追従が必要なときだけ移行を検討すれば十分。

関連

ESM 専用パッケージを require する事故が ERR_REQUIRE_ESM、ESM 化したコードでグローバル相当が無くなる症状が __dirname is not defined
対概念は ESM。