LoginSignup
4
1

Node.jsのCJSとESM の挙動の違い

Last updated at Posted at 2023-11-27
1 / 2

はじめに

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の学習はおすすめです。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1