Π ΡΡΠΌ ΡΠ°Π·Π½ΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ CommonJS ΠΈ ES Modules?
ΠΠΎΠ»Π½ΡΠΉ ΠΎΡΠ²Π΅Ρ
ΠΠ²Π΅ ΡΠΈΡΡΠ΅ΠΌΡ Π΄Π΅Π»Π°ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅ β ΡΠΊΡΠΏΠΎΡΡ ΠΈ ΠΈΠΌΠΏΠΎΡΡ ΠΊΠΎΠ΄Π°, β Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ:
// === CommonJS ===
// math.js
function add(a, b) {
return a + b;
}
module.exports = { add };
// app.js
const { add } = require("./math");
console.log(add(2, 3)); // 5
// === ES Modules ===
// math.js
export function add(a, b) {
return a + b;
}
// app.js
import { add } from "./math.js";
console.log(add(2, 3)); // 5
ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠΈΡ:
// 1. Π‘ΠΠΠ₯Π ΠΠΠΠΠ‘Π’Π¬ vs ΠΠ‘ΠΠΠ₯Π ΠΠΠΠΠ‘Π’Π¬
// CJS β ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΉ, Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
const fs = require("fs"); // ΠΊΠΎΠ΄ ΠΆΠ΄ΡΡ, ΠΏΠΎΠΊΠ° ΠΌΠΎΠ΄ΡΠ»Ρ Π·Π°Π³ΡΡΠ·ΠΈΡΡΡ
// ESM β Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΉ, ΠΏΠ°ΡΡΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π·Π°ΡΠ°Π½Π΅Π΅
import fs from "node:fs"; // Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΈΠ·Π²Π΅ΡΡΠ½Ρ Π΄ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ
// 2. ΠΠΠΠΠΠΠ§ΠΠ‘ΠΠΠ vs Π‘Π’ΠΠ’ΠΠ§ΠΠ‘ΠΠΠ require
// CJS β ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·Π²Π°ΡΡ require() Π² Π»ΡΠ±ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅
if (needsDatabase) {
const db = require("./db"); // Π·Π°Π³ΡΡΠ·ΠΈΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ true
}
// ESM β import ΡΠΎΠ»ΡΠΊΠΎ Π½Π° Π²Π΅ΡΡ
Π½Π΅ΠΌ ΡΡΠΎΠ²Π½Π΅ (Π΄Π»Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠΈ Π΅ΡΡΡ import())
import { db } from "./db.js"; // Π²ΡΠ΅Π³Π΄Π° Π½Π° Π²Π΅ΡΡ
Π½Π΅ΠΌ ΡΡΠΎΠ²Π½Π΅
// Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²Π°ΡΠΈΠ°Π½Ρ:
if (needsDatabase) {
const { db } = await import("./db.js");
}
// 3. ΠΠΠ‘ΠΠΠ Π’ β ΠΠΠΠΠ― vs ΠΠΠΠΠ― Π‘Π‘Π«ΠΠΠ
// CJS β ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅Ρ ΠΊΠΎΠΏΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
// counter.js
let count = 0;
module.exports = { count, increment: () => ++count };
// app.js (CJS)
const counter = require("./counter");
counter.increment();
console.log(counter.count); // 0 β ΠΊΠΎΠΏΠΈΡ Π½Π΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»Π°ΡΡ!
// ESM β ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅Ρ ΠΆΠΈΠ²ΡΡ ΠΏΡΠΈΠ²ΡΠ·ΠΊΡ (live binding)
// counter.js
export let count = 0;
export function increment() { count++; }
// app.js (ESM)
import { count, increment } from "./counter.js";
increment();
console.log(count); // 1 β ΠΆΠΈΠ²Π°Ρ ΡΡΡΠ»ΠΊΠ° ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»Π°ΡΡ
ΠΠ°ΠΊ Π²ΠΊΠ»ΡΡΠΈΡΡ ESM Π² Node.js:
// package.json β ΡΠΏΠΎΡΠΎΠ± 1: Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°
{
"type": "module"
}
// Π‘ΠΏΠΎΡΠΎΠ± 2: ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π°
// .mjs β Π²ΡΠ΅Π³Π΄Π° ESM
// .cjs β Π²ΡΠ΅Π³Π΄Π° CJS
Π Π΅Π°Π»ΡΠ½ΡΠ΅ ΠΊΠ΅ΠΉΡΡ
Π‘ΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ β Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΎΠ±Π° ΡΠΎΡΠΌΠ°ΡΠ°:
// package.json
{
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
"exports": {
".": {
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
}
}
}
ΠΡΠΈΠ±ΠΊΠΈ ΠΏΡΠΈ ΡΠΌΠ΅ΡΠΈΠ²Π°Π½ΠΈΠΈ:
// β require() Π² ESM-ΡΠ°ΠΉΠ»Π΅ β Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
import { readFile } from "node:fs";
const lodash = require("lodash"); // ReferenceError: require is not defined
// β
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉ import ΠΈΠ»ΠΈ createRequire
import { createRequire } from "node:module";
const require = createRequire(import.meta.url);
const lodash = require("lodash"); // ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
Π Π΅Π·ΡΠΌΠ΅
CJS β Π½Π°ΡΠ»Π΅Π΄ΠΈΠ΅ Node.js, ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ, Π³ΠΈΠ±ΠΊΠΈΠΉ, Π½ΠΎ Π½Π΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΠ΅ΠΌΡΠΉ. ESM β ΡΡΠ°Π½Π΄Π°ΡΡ ΡΠ·ΡΠΊΠ°, ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ, Ρ ΠΆΠΈΠ²ΡΠΌΠΈ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠ°ΠΌΠΈ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ tree shaking. ΠΠΎΠ²ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΡ ΡΡΠΎΠΈΡ ΠΏΠΈΡΠ°ΡΡ Π½Π° ESM, Π° CJS ΠΎΡΡΠ°Π²ΠΈΡΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ.