Asosiy kontentga o‘tish
Innovialabs

ES Modules vs CommonJS: JavaScript’da import va require

Asoslar3 daq

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() va module.exports. Node.js da standartdan ancha oldin paydo bo‘lgan va hanuz eski paketlar hamda konfiglarda uchraydi.
  • ES Modules (ESM) — import va export. 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

CommonJSES Modules
Sintaksisrequire, module.exportsimport, export
Yuklanishsinxron, ishlash vaqtidabajarilishdan oldin statik tahlil
Shartli importrequire istalgan joydaimport() — dinamik, Promise qaytaradi
Top-level awaityo‘qbor
__dirname, __filenameboryo‘q, import.meta ishlatiladi
Strict modeixtiyoriydoim yoqilgan
Tree shakingyomon ishlaydiishlaydi

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 dagi type maydoniga 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'.
  • __dirname endi yo‘q. import.meta.url ni fileURLToPath bilan yoki Node.js ning yangi versiyalarida import.meta.dirname ni ishlating.
  • Hali CommonJS kutadigan vositalar konfiglarini .cjs ga 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 .js kengaytmali;
  • 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/export yozing, qolganini bandler hal qiladi.
  • CommonJS dagi eski Node.js servis — bosqichma-bosqich o‘tkazing: yangi fayllar .mjs sifatida yoki testlar bo‘lganda to‘liq o‘tish.
  • npm uchun kutubxona — asosiy format ESM; eski iste’molchilar muhim bo‘lsa, exports maydoni orqali CommonJS build’ini ham nashr qiling.

Ko‘p beriladigan savollar

Brauzer faylni <script type="module"> orqali ulangan bo‘lsa, modul sifatida bajaradi. Node.js esa "type": "module" yoki .mjs kengaytmasi ko‘rsatilmaguncha .js fayllarni CommonJS deb hisoblaydi.

Bunda yordam beramiz

O‘zingiz shug‘ullanmasdan natija olishni istasangiz — biz har kuni shu bilan shug‘ullanamiz.

Loyihani muhokama qilish

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.