ES Modules vs CommonJS: JavaScript’da import va require
Asoslar3 daqInnovialabs tahririyati
Qisqacha
CommonJS (require) — Node.js ning eski sinxron modul tizimi, ES Modules (import) — tilning rasmiy standarti; Node.js tizimni fayl kengaytmasi va package.json dagi type maydoni bo‘yicha tanlaydi.
Farq qisqacha
JavaScript’da ikkita modul tizimi bor:
- CommonJS (CJS) —
require()vamodule.exports. Node.js da standartdan ancha oldin paydo bo‘lgan va hanuz eski paketlar hamda konfiglarda uchraydi. - ES Modules (ESM) —
importvaexport. Tilning rasmiy standarti, brauzerlarda ham, Node.js da ham ishlaydi.
Yangi kod uchun ESM ni tanlang. CommonJS ni esa mavjud kodni o‘qish va moslik xatolarini tushunish uchun bilish kerak.
// CommonJS
const fs = require('fs');
function sum(a, b) { return a + b; }
module.exports = { sum };
// ES Modules
import fs from 'node:fs';
export function sum(a, b) { return a + b; }
Mohiyatan nimasi bilan farq qiladi
| CommonJS | ES Modules | |
|---|---|---|
| Sintaksis | require, module.exports | import, export |
| Yuklanish | sinxron, ishlash vaqtida | bajarilishdan oldin statik tahlil |
| Shartli import | require istalgan joyda | import() — dinamik, Promise qaytaradi |
| Top-level await | yo‘q | bor |
__dirname, __filename | bor | yo‘q, import.meta ishlatiladi |
| Strict mode | ixtiyoriy | doim yoqilgan |
| Tree shaking | yomon ishlaydi | ishlaydi |
Asosiy amaliy natija: ESM importlari statik. Bandler nima qayerdan import qilinayotganini oldindan ko‘radi va ishlatilmagan kodni olib tashlay oladi. require bilan bu qiyinroq, chunki yo‘l ishlash vaqtida hisoblanishi mumkin.
Node.js fayl qaysi tizimda ekanini qanday aniqlaydi
Node.js kengaytma va package.json ga qaraydi:
.mjs— har doim ESM..cjs— har doim CommonJS..js— eng yaqin package.json dagitypemaydoniga bog‘liq:"module"— ESM,"commonjs"yoki maydon yo‘qligi — CommonJS.
Loyihani ESM ga o‘tkazish uchun:
{
"type": "module"
}
Shundan keyin quyidagilarni hisobga oling:
- Nisbiy importlarda kengaytmani ko‘rsatish kerak:
import { sum } from './math.js'. __dirnameendi yo‘q.import.meta.urlnifileURLToPathbilan yoki Node.js ning yangi versiyalaridaimport.meta.dirnameni ishlating.- Hali CommonJS kutadigan vositalar konfiglarini
.cjsga qayta nomlang.
Odatiy xatolar qayerdan chiqadi
«Cannot use import statement outside a module» — import bor fayl CommonJS sifatida bajarilmoqda. Sabablari:
- package.json da
"type": "module"yo‘q, fayl esa.jskengaytmali; - brauzerda skript
type="module"siz ulangan; - test runner yoki eski vosita ESM ga sozlanmagan.
Yechim: "type": "module" qo‘shish, faylni .mjs ga qayta nomlash yoki <script type="module"> dan foydalanish.
«require is not defined in ES module scope» — teskari holat: ESM faylda require chaqirilgan. Uni import ga almashtiring yoki node:module dagi createRequire dan foydalaning.
ERR_REQUIRE_ESM — CommonJS kod faqat ESM sifatida tarqatiladigan paketni require orqali yuklamoqchi. Node.js ning yangi versiyalari top-level await bo‘lmagan ES modullarni require() qila oladi, eskilarida faqat dinamik import() yoki ESM ga o‘tish yordam beradi.
ESM da «Cannot find module './utils'» — yo‘lda fayl kengaytmasi unutilgan.
Birga ishlatish qoidalari
ESM CommonJS ni import qiladi — deyarli har doim ishlaydi:
import pkg from './legacy.cjs'; // butun module.exports
import { helper } from './legacy.cjs'; // Node.js eksportlarni statik aniqlay olsa ishlaydi
Nomlangan import topilmasa, standart obyektni import qilib, uni destrukturizatsiya qiling.
CommonJS ESM ni yuklaydi — murakkabroq:
// CommonJS faylida
async function main() {
const { sum } = await import('./math.mjs');
console.log(sum(2, 3));
}
main();
Dinamik import() CommonJS da har doim ishlaydi, lekin u asinxron.
Loyiha uchun qanday tanlash kerak
- Yangi ilova — ESM,
"type": "module". - Next.js, Vite va boshqa zamonaviy frameworklar —
import/exportyozing, qolganini bandler hal qiladi. - CommonJS dagi eski Node.js servis — bosqichma-bosqich o‘tkazing: yangi fayllar
.mjssifatida yoki testlar bo‘lganda to‘liq o‘tish. - npm uchun kutubxona — asosiy format ESM; eski iste’molchilar muhim bo‘lsa,
exportsmaydoni orqali CommonJS build’ini ham nashr qiling.