🕵️♂️
Node.jsで利用可能なモジュールシステムCommonJS / ES modules はどんな時にどちらの形式で扱われるのか
記事執筆時点の最新の Node.js (v20.9.0) において利用可能なモジュールシステムには CommonJS / ES modules があるが、どんな時にどちらの形式で扱われるのかを調べた🕵🏻♂️
調査方法
CommonJS 形式の場合そのモジュール自身を表す module
オブジェクトが存在しているが、ES modules 形式の場合には module
オブジェクトが存在しない。
従って、以下のようにして module
オブジェクトの存在確認をすることで CommonJS / ES modules どちらの形式でファイルが扱われているかを確認することができる。
if (typeof module === 'undefined') {
console.log('ES Module'); // module が存在しない場合は ESM
} else {
console.log('CommonJS'); // module が存在する場合は CJS
}
調査環境
Node.js v20.9.0
拡張子の違い
拡張子を .cjs
にすると CommonJS形式で扱われ、 .mjs
にすると ES modules形式で扱われる
package.jsonで形式を指定
拡張子が .js
のファイルがある時、package.json の "type”
フィールドを "commonjs"
に指定するとCommonJS形式で扱われ、 ”module”
にすると ES modules形式で扱われる
また、"type”
フィールドの指定があったとしても拡張子が.cjs
であれば CommonJS形式、.mjs
であれば ES modules形式で扱われる。
Discussion