はじめに
Node.jsを久しぶりに触ってCJSとESMでの挙動の違いに少し苦戦してしまったのでその違いをまとめようと思って書きました。
Node.jsのバージョンの意味
Node.jsの偶数は長期サポートが保証されているもの
奇数は新しい機能を試すためのもの
- Current
- Active LTS
- MAINTENANCE
CJSとESMの挙動の違い
- __filename, __dirnameへの対応
- require, module.exports
- require JSONで自動でパースされない
__filename
__dirname
この書き方はCJSでは対応しているけど、ESMでは対応していない
ESMでパスを扱うにはこのようにする
import { fileURLToPath } from 'url';
import { dirname } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
モジュールの読み込み方の違い
CJSの書き方
const plus = (a, b) => {
return a + b;
}
module.export { plus }
const plus = require(./plus); // .jsを省略できる
console.log(pulus(3, 4)); // 7を出力
ESMの書き方
const plus = (a, b) => {
return a + b;
}
export { plus }
import { plus } from "./plus.js";
console.log(pulus(3, 4)); // 7を出力
JSONの取り扱いの違い
CJSでは
const jsonObj = require("./users.json");
console.log(jsonObje); // オブジェクトとして出力される
ESMでは
import { createRequire } from "module";
const require = createRequire(important.meta.url);
const jsonObj = require("./users.json");
console.log(jsonObj); // オブジェクトとして出力される
まとめ
CJSとESMでは挙動が異なり、同じ書き方ができない部分もあります。これらの違いを理解することでエラーの原因を特定しやすくなります。Node.jsは普段フロントのコードを書いている人と親和性の高い技術なのでNode.jsを入り口にバックエンドを少しづつ学習することで市場価値を高めることにもつながるのでNode.jsの学習はおすすめです。