JavaScript modullar tizimi: named va default export/import, qayta nomlash (as), modullarning alohida leksik doirasi, live bindings mexanizmi va type="module" qoidalari.
PART 6 (Modern JavaScript) boshlanadi. Bu bobda katta loyihalarni kichik, boshqarish oson fayllarga bo'lish imkonini beruvchi Module tizimini o'rganamiz.
Module — o'z ichiga alohida function, class yoki variable'larni jamlagan, boshqa fayllarga "eksport qilib berish" yoki ulardan "import qilib olish" mumkin bo'lgan JavaScript fayli.
Modul tizimisiz, katta loyihaning barcha kodi bitta ulkan faylda yoki global scope'da (<script> teglar orqali) yozilishi kerak edi — bu esa nom to'qnashuvlari (name collision) va tartibsizlikka olib kelardi.
📦 Modullarni alohida qutilarga o'xshating: har bir quti (fayl) o'z ichida ma'lum narsalarni saqlaydi, va siz kerakli narsani boshqa qutidan "so'rab olishingiz" (import) mumkin, hamma narsani bitta katta, tartibsiz omborga (global scope) yig'ib qo'yish o'rniga.
script.jsJavaScript// mathUtils.jsexport function add(a, b) {return a + b;}export function subtract(a, b) {return a - b;}export const PI = 3.14159;
script.jsJavaScript// user.jsexport default class User {constructor(name) {this.name = name;}}
| Xususiyat | Named Export | Default Export |
|---|---|---|
| Bitta faylda soni | Bir nechta bo'lishi mumkin | Faqat bitta |
| Import qilishda nom | Aynan bir xil nom bilan (yoki as) | Istalgan nom berish mumkin |
| Sintaksis | export function ... | export default ... |
script.jsJavaScript// main.jsimport { add, subtract, PI } from "./mathUtils.js";console.log(add(5, 3)); // 8console.log(PI); // 3.14159
script.jsJavaScript// main.jsimport User from "./user.js"; // istalgan nom berish mumkin, "User" bo'lishi shart emaslet user = new User("Ali");
script.jsJavaScriptimport { add as sum, subtract as diff } from "./mathUtils.js";console.log(sum(2, 3)); // 5
script.jsJavaScriptimport * as MathUtils from "./mathUtils.js";console.log(MathUtils.add(2, 3));console.log(MathUtils.PI);
🔗 Connection
Bu — Chapter 16'da o'rgangan Destructuring'ga o'xshash sintaksis: { add, subtract } — object destructuring'ga juda o'xshaydi, chunki named export'lar aslida bir turdagi "eksport qilingan object" sifatida ishlaydi.
Har bir modul fayli — o'zining alohida scopeiga ega. Bu — Chapter 11'da o'rgangan Global Scope tushunchasidan farqli, chunki modul ichidagi variable'lar avtomatik ravishda boshqa fayllarga "sizib chiqmaydi".
index.htmlHTML<!-- Oddiy script (eski usul) --><script src="file1.js"></script><script src="file2.js"></script><!-- file1.js'dagi barcha global variable'lar file2.js'da ham ko'rinadi --><!-- Module (zamonaviy usul) --><script type="module" src="file1.js"></script><script type="module" src="file2.js"></script><!-- file1.js'dagi variable'lar file2.js'da KO'RINMAYDI, faqat export qilinganlari -->
script.jsJavaScript// file1.js (module)let secretValue = "faqat shu fayl ichida";// file2.js (module)console.log(secretValue); // ❌ ReferenceError — bu yerda mavjud emas!
Har bir modul — o'zining "yopiq" (isolated) scope'iga ega. Faqat export qilingan narsalargina boshqa fayllarga ko'rinadi. Bu — Chapter 12'da o'rgangan Closure orqali erishilgan "private" tushunchasiga juda o'xshash, lekin fayl darajasida.
💡 Key Idea
Bu xususiyat — nomlarning tasodifiy to'qnashishining oldini oladi. Ikki turli modulda bir xil nomli (let count = 0) variable bo'lsa ham, ular bir-biriga hech qanday ta'sir qilmaydi.
index.htmlHTML<!DOCTYPE html><html><body><script type="module" src="main.js"></script></body></html>
⚠️ Common Mistake
type="module" atributini unutish — brauzer import/export sintaksisini tushunmay, sintaksis xatoligi berishiga olib keladi. Bundan tashqari, modullar odatda fayl orqali (file://) emas, server orqali (http:// yoki https://) ishga tushirilishi kerak — bu ba'zi brauzerlarning xavfsizlik cheklovi tufayli.
Node.js muhitida (brauzerdan tashqarida) ikkita modul tizimi mavjud: eski CommonJS (require/module.exports) va zamonaviy ES Modules (import/export, aynan biz o'rgangan sintaksis).
| Tizim | Eksport sintaksisi | Import sintaksisi |
|---|---|---|
| CommonJS (eski) | module.exports = ... | const x = require(...) |
| ES Modules (zamonaviy) | export ... | import x from ... |
🔗 Connection
Bu haqda Chapter 48'da (Node.js Asoslari) yanada batafsil to'xtalamiz.
Task:
greetings.js faylida sayHello(name) nomli function yozing va uni export qiling. main.jsda uni import qilib, chaqiring.
Required Concepts:
export function sayHello(name) { ... } va import { sayHello } from "./greetings.js";Task:
Calculator class yarating (add, subtract metodlari bilan), uni export default qilib eksport qiling. Boshqa faylda uni istalgan nom bilan import qilib, sinab ko'ring.
Required Concepts:
export default class Calculator { ... }Task:
stringUtils.js faylida bir nechta named export function yarating (capitalize, reverse, truncate). Boshqa faylda import * as StringUtils orqali barchasini birga import qilib, har birini sinab ko'ring.
Required Concepts:
import * asimport * as StringUtils from "./stringUtils.js"; keyin StringUtils.capitalize(...).script.jsJavaScript// file1.js (module)export let count = 10;export function increment() {count++;}// file2.js (module)import { count, increment } from "./file1.js";console.log(count); // ?increment();console.log(count); // ?
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> 10 11Why?
Import qilingan count — asl file1.jsdagi countga jonli havola (live binding), oddiy nusxa emas. file1.js ichida increment() chaqirilib count o'zgartirilganda, bu o'zgarish file2.jsdagi import qilingan countga ham avtomatik aks etadi.
Quyidagi kodda muammo bor:
script.jsJavaScript// utils.jsfunction double(x) {return x * 2;}// main.jsimport { double } from "./utils.js";console.log(double(5));
Your Task:
Yechim:
</details>script.jsJavaScript// utils.jsexport function double(x) {return x * 2;}// main.jsimport { double } from "./utils.js";console.log(double(5)); // 10
export/import — kodni fayllar orasida bo'lishish uchun ishlatiladi.<script type="module"> — modullarni HTML'da ishlatish uchun majburiy.script.jsJavaScript// export.jsexport function myFunc() { }export const myConst = 42;export default class MyClass { }// import.jsimport MyClass, { myFunc, myConst } from "./export.js";import { myFunc as renamed } from "./export.js";import * as All from "./export.js";
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 3 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: