CommonJS से नेटिव ES मॉड्यूल में स्थानांतरण
require/module.exports को import/export में बदलिए और दोहरे पैकेज व इंटरऑपरेबिलिटी की समस्याएँ संभालिए।
CommonJS से नेटिव ES मॉड्यूल में स्थानांतरण, CoddyKit पर Node.js बैकएंड विकास बूटकैंप का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Node.js बैकएंड विकास बूटकैंप सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Node.js बैकएंड विकास बूटकैंप पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
दो मॉड्यूल प्रणालियाँ, एक रनटाइम
Node.js में ऐतिहासिक रूप से CommonJS (CJS) का उपयोग होता था: आप require() से कोड लोड करते हैं और module.exports से उसे उपलब्ध कराते हैं। आधुनिक JavaScript में एक अंतर्निहित मानक, ES Modules (ESM), मौजूद है, जिसमें import और export का उपयोग होता है।
- CommonJS रनटाइम पर मॉड्यूल को समकालिक रूप से लोड करता है।
- ESM का स्थैतिक विश्लेषण किया जाता है, इसे असमकालिक रूप से लोड किया जाता है और यह आधिकारिक ECMAScript मानक है।
Node अब दोनों का समर्थन करता है, लेकिन इन्हें मिलाने के कुछ नियम हैं। यह पाठ आपको बैकएंड प्रोजेक्ट को CJS से मूल ESM में साफ़-सुथरे ढंग से स्थानांतरित करना सिखाता है।
// CommonJS (old)
const fs = require('fs');
module.exports = { readConfig };
// ES Modules (new)
import fs from 'fs';
export { readConfig };Node को बताना कि आपका आशय ESM है
Node यह तय करता है कि किसी फ़ाइल के साथ कैसा व्यवहार करना है, इसके विस्तार और निकटतम package.json के आधार पर:
"type": "module"कोpackage.jsonमें रखने पर →.jsफ़ाइलों को ESM माना जाता है।typeफ़ील्ड न होने पर (या"commonjs"होने पर) →.jsफ़ाइलें CommonJS होती हैं।.mjsहमेशा ESM होता है;.cjsहमेशा CommonJS होता है, चाहेtypeकुछ भी हो।
स्थानांतरण का सबसे साफ़ चरण है एक बार "type": "module" जोड़ना और फिर उन फ़ाइलों को ठीक करना जिन पर इसका प्रभाव पड़ता है।
{
"name": "my-api",
"version": "1.0.0",
"type": "module",
"main": "src/server.js",
"scripts": {
"start": "node src/server.js"
}
}निर्यातों को बदलना
module.exports और exports.foo को export कथनों से बदलें।
module.exports = X(एकल मान) →export default X।exports.foo = ...(कई नामित मान) →export const foo = ...या समूहितexport { foo, bar }।
उपयोगिता कोड के लिए नामित निर्यातों को प्राथमिकता दें, ताकि उपयोगकर्ताओं को स्वतः-पूर्णता और अधिक स्पष्ट आयात मिल सकें।
// Before (CJS)
// module.exports.add = (a, b) => a + b;
// module.exports.PI = 3.14159;
// After (ESM)
export const add = (a, b) => a + b;
export const PI = 3.14159;
console.log(add(2, 3)); // 5
console.log(PI); // 3.14159आयातों को बदलना
require() को import से बदलें। निर्यात शैली का मिलान करें:
- नामित:
const { add } = require('./math')→import { add } from './math.js'। - डिफ़ॉल्ट:
const express = require('express')→import express from 'express'।
महत्वपूर्ण नियम: ESM में अपनी फ़ाइलों के सापेक्ष आयातों में फ़ाइल विस्तार अवश्य शामिल होना चाहिए (.js)। CommonJS की तरह Node आपके लिए इसका अनुमान नहीं लगाएगा।
// Before (CJS)
// const { add } = require('./math');
// After (ESM) — note the explicit .js extension
import { add } from './math.js';
console.log(add(10, 5)); // 15अब __dirname या __filename नहीं
ESM, CommonJS के वैश्विक __dirname और __filename उपलब्ध नहीं कराता। यदि आपका बैकएंड फ़ाइल पथ (कॉन्फ़िगरेशन, अपलोड, टेम्पलेट) बनाता है, तो आपको उन्हें import.meta.url से फिर से बनाना होगा।
आधुनिक Node (20.11+) सीधे import.meta.dirname और import.meta.filename भी उपलब्ध कराता है, जो आगे के लिए सबसे सरल विकल्प है।
import { fileURLToPath } from 'node:url';
import { dirname, join } from 'node:path';
// Classic portable approach
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const configPath = join(__dirname, 'config.json');
console.log(configPath);
// Node 20.11+ shortcut:
// const dir = import.meta.dirname;JSON और अंतर्निहित मॉड्यूल आयात करना
बैकएंड प्रोजेक्ट को प्रभावित करने वाले दो और बदलाव:
- JSON:
require('./data.json')अब सीधे काम नहीं करता। आयात विशेषता का उपयोग करें:import data from './data.json' with { type: 'json' }। - मुख्य मॉड्यूल:
node:उपसर्ग को प्राथमिकता दें (जैसेimport { readFile } from 'node:fs/promises')। यह अस्पष्टता रहित और भविष्य के लिए सुरक्षित है।
यदि आप पुराने Node को लक्ष्य बना रहे हैं, तो fs के माध्यम से JSON पढ़ने से विशेषता-वाक्यविन्यास की संगतता संबंधी चिंताएँ पूरी तरह दूर हो जाती हैं।
import { readFile } from 'node:fs/promises';
// Robust, version-agnostic way to load JSON in ESM
const raw = await readFile(new URL('./pkg.json', import.meta.url));
const pkg = JSON.parse(raw);
console.log(pkg.name);शीर्ष-स्तरीय await एक महाशक्ति है
ESM बैकएंड को मिलने वाला एक वास्तविक सुधार है: शीर्ष-स्तरीय await। CommonJS में आपको असमकालिक स्टार्टअप को IIFE में लपेटना पड़ता था। ESM मॉड्यूल में आप शीर्ष स्तर पर सीधे await कर सकते हैं।
इससे सर्वर की प्रवेश फ़ाइलों में डेटाबेस कनेक्शन, कॉन्फ़िगरेशन प्राप्त करना और वार्म-अप तर्क अधिक साफ़ हो जाते हैं।
// ESM entry file
async function connectDb() {
await new Promise((r) => setTimeout(r, 50));
return { status: 'connected' };
}
const db = await connectDb(); // top-level await — no IIFE needed
console.log('DB:', db.status);इंटरऑप: ESM से CommonJS आयात करना
आप अब भी केवल CJS वाले npm पैकेजों पर निर्भर रहेंगे। अच्छी बात यह है कि ESM, CommonJS को आयात कर सकता है। Node पैकेज के module.exports को डिफ़ॉल्ट निर्यात के रूप में लपेट देता है।
import pkg from 'cjs-lib'का उपयोग करकेmodule.exportsप्राप्त करें।- Node नामित निर्यातों का भी पता लगाने का प्रयास करता है, लेकिन जटिल CJS में यह विफल हो सकता है — इसके बजाय डिफ़ॉल्ट से संरचना-विभाजन करें।
// 'lodash' is CommonJS; the whole export object is the default
import _ from 'lodash';
const { chunk } = _; // safe: destructure from default
console.log(chunk([1, 2, 3, 4], 2)); // [[1,2],[3,4]]इंटरऑप: CommonJS से ESM लोड करना
उलटी दिशा अधिक कठिन है। CommonJS फ़ाइल ESM मॉड्यूल को समकालिक रूप से require() नहीं कर सकती (पुराना Node ERR_REQUIRE_ESM त्रुटि देता है)। विकल्प:
- गतिशील
import()का उपयोग करें, जो एक Promise लौटाता है — यह CJS में असमकालिक फ़ंक्शन के भीतर काम करता है। - Node 22+ ने ESM के समकालिक
require()का प्रायोगिक समर्थन जोड़ा है, लेकिन पोर्टेबल कोड के लिए इस पर निर्भर न रहें।
यही असमानता मुख्य कारण है कि टीमें प्रणालियों को मिलाने के बजाय पूरे कोडबेस को ESM में स्थानांतरित करती हैं।
// Inside a CommonJS file:
async function run() {
// dynamic import works even from CJS
const { add } = await import('./math.mjs');
console.log(add(4, 6)); // 10
}
run();द्वैध-पैकेज प्रकाशन
यदि आप कोई लाइब्रेरी प्रकाशित करते हैं, तो कुछ उपयोगकर्ता ESM और कुछ CJS का उपयोग करेंगे। आधुनिक समाधान सशर्त निर्यातों वाले exports फ़ील्ड का उपयोग करके दोनों बिल्ड भेजना है।
importशर्त → ESM प्रवेश।requireशर्त → CJS प्रवेश।
द्वैध-पैकेज जोखिम से सावधान रहें: यदि दोनों बिल्ड लोड हो जाते हैं, तो आपके मॉड्यूल की स्थिति की दो प्रतिलिपियाँ बन जाती हैं (जैसे दो अलग-अलग सिंगलटन)। स्थिति-निर्भर तर्क को एक ही आंतरिक मॉड्यूल में रखें, जिसे दोनों बिल्ड आयात करें।
{
"name": "my-lib",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"exports": {
".": {
"import": "./dist/index.js",
"require": "./dist/index.cjs",
"types": "./dist/index.d.ts"
}
}
}व्यावहारिक स्थानांतरण जाँच-सूची
मौजूदा बैकएंड के लिए कार्यों का विश्वसनीय क्रम:
package.jsonमें"type": "module"जोड़ें।- जो फ़ाइल CJS ही रहनी चाहिए, उसका नाम बदलकर
.cjsकरें। require/module.exportsकोimport/exportमें बदलें।- सभी सापेक्ष आयातों में
.jsविस्तार जोड़ें। __dirname/__filenameकोimport.metaसहायक साधनों से बदलें।- JSON आयात और CJS-डिफ़ॉल्ट इंटरऑप ठीक करें।
- परीक्षणों का समूह चलाएं; शेष
requireकॉलों का पता विफलताओं से लगने दें।
cjstoesm जैसे उपकरण या कोडमॉड बड़े पैमाने के संपादन को स्वचालित कर सकते हैं, लेकिन अंतर की हमेशा समीक्षा करें।
त्वरित जाँच
आप किसी बैकएंड फ़ाइल को ESM में बदलते हैं और "type": "module" जोड़ते हैं। अचानक आपके अपने सहायक का आयात ERR_MODULE_NOT_FOUND त्रुटि देता है। सबसे संभावित समाधान क्या है?
पुनरावलोकन
आपने Node.js बैकएंड को CommonJS से मूल ES Modules में स्थानांतरित किया। मुख्य बातें:
"type": "module"से इसे सक्रिय करें; प्रति फ़ाइल बदलाव के लिए.cjs/.mjsका उपयोग करें।require/module.exportsकोimport/exportसे बदलें और सापेक्ष आयातों में हमेशा.jsविस्तार शामिल करें।import.meta.urlके माध्यम से__dirnameफिर से बनाएं (याimport.meta.dirnameका उपयोग करें)।- ESM, CJS को डिफ़ॉल्ट निर्यात के रूप में आयात कर सकता है; CJS को ESM के लिए गतिशील
import()का उपयोग करना होगा। - शीर्ष-स्तरीय
awaitअसमकालिक स्टार्टअप को सरल बनाता है। - लाइब्रेरी के लिए सशर्त
exportsका उपयोग करें और द्वैध-पैकेज जोखिम से सावधान रहें।
इन नियमों के साथ, आप किसी भी Node सेवा को मानक ES Modules में आत्मविश्वास से आधुनिक बना सकते हैं।
एआई शिक्षक के साथ JavaScript सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 22
- पाठ
- 92
अक्सर पूछे जाने वाले प्रश्न
क्या “CommonJS से नेटिव ES मॉड्यूल में स्थानांतरण” पाठ निःशुल्क है?
हाँ—“CommonJS से नेटिव ES मॉड्यूल में स्थानांतरण” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Node.js बैकएंड विकास बूटकैंप पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Node.js बैकएंड विकास बूटकैंप पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“CommonJS से नेटिव ES मॉड्यूल में स्थानांतरण” में मैं क्या सीखूँगा?
require/module.exports को import/export में बदलिए और दोहरे पैकेज व इंटरऑपरेबिलिटी की समस्याएँ संभालिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Node.js बैकएंड विकास बूटकैंप का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Node.js बैकएंड विकास बूटकैंप शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Node.js बैकएंड विकास बूटकैंप शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“CommonJS से नेटिव ES मॉड्यूल में स्थानांतरण” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Node.js बैकएंड विकास बूटकैंप पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Node.js बैकएंड विकास बूटकैंप पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- CommonJS से नेटिव ES मॉड्यूल में स्थानांतरण
- Node बैकएंड परियोजनाओं के लिए tsconfig कॉन्फ़िगर करना
- टाइप-सुरक्षित पर्यावरण कॉन्फ़िगरेशन और रनटाइम सत्यापन
- tsx, हॉट रीलोड और सोर्स मैप से तेज़ पुनरावृत्ति