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。