Node दोन module systems समर्थन करतो: CommonJS (CJS) — मूळ, require/module.exports वापरत — आणि ES Modules (ESM) — मानक, import/ वापरत. ते सिंटॅक्स, लोडिंग वर्तन आणि interop मध्ये भिन्न आहेत.
Node दोन module systems समर्थन करतो: CommonJS (CJS) — मूळ, require/module.exports वापरत — आणि ES Modules (ESM) — मानक, import/ वापरत. ते सिंटॅक्स, लोडिंग वर्तन आणि interop मध्ये भिन्न आहेत.
export// math.js
function add(a, b) { return a + b; }
module.exports = { add };
// app.js
const { add } = require("./math"); // synchronous, runtime
// math.mjs (or .js with "type": "module")
export function add(a, b) { return a + b; }
export default something;
// app.mjs
import { add } from "./math.mjs"; // static, hoisted
CommonJS ES Modules
Syntax require/module.exports import/export
Loading synchronous, runtime static, hoisted
Top-level await no yes
Tree-shaking hard yes (statically analyzable)
File extension .cjs / .js (default) .mjs / .js with "type":"module"
__dirname/__filename available not available (use import.meta.url)
// package.json
{ "type": "module" } // now .js files are treated as ESM
किंवा .mjs extension स्पष्टपणे वापरा. यावशिष्ट, Node डिफॉल्टनुसार .js ला CommonJS देते.
// ESM can import CommonJS:
import pkg from "some-cjs-lib"; // works (default import)
// CommonJS CANNOT require() a pure-ESM package (it's async):
const esm = require("esm-only-pkg"); // ❌ ERR_REQUIRE_ESM
// must use dynamic import: const esm = await import("esm-only-pkg");
कठीण बिंदू: CJS ESM-only packages require() करू शकत नाही — हा सामान्य migration दर्द आहे. तसेच, ESM ला __dirname नाही हे लक्षात घ्या (import.meta.url वापरा).
वास्तविक Node कामासाठी दोनही systems जाणे आवश्यक आहे: ESM हवेळ (मानक, tree-shakeable, top-level await, browser-aligned) आहे आणि नवीन projects साठी योग्य निवड आहे, परंतु npm ecosystem आणि विद्यमान code चा विशाल भाग CommonJS आहे.
सिंटॅक्स फरक, ESM कसे सक्षम करावे ("type": "module"), आणि interop मर्यादा (विशेषत: CJS-can't-require-ESM) समजून घेतल्याने त्यांना मिक्स करताना येणारी वारंवार गोंधळ आणि त्रुटी टाळल्या जातात.