🕵️‍♂️

Node.jsで利用可能なモジュールシステムCommonJS / ES modules はどんな時にどちらの形式で扱われるのか

2023/10/29に公開

記事執筆時点の最新の 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