Dynamic import — lazy loading
Muammodan boshlaylik
Katta ilova yozdingiz. Foydalanuvchi sahifaga kirganida — barcha JavaScript bir vaqtda yuklanadi. 500KB kod. Lekin foydalanuvchi ko'pincha faqat birinchi sahifadan foydalanadi, boshqa sahifalarni ochmasdan chiqib ketadi.
Nima muammo? Foydalanuvchi hech qachon ishlatmaydigan kodni ham yuklaydi. Sahifa sekin ochiladi.
Yechim — Dynamic import: kod kerak bo'lganda, kerak bo'lgan paytda yuklansin.
Static vs Dynamic import farqi
Static import — fayl boshida yoziladi, sahifa yuklanayotganda darhol bajariladi:
import { yordamchi } from "./yordamchi.js";
// sahifa ochilishi bilanoq yordamchi.js yuklanadi — ishlatilmasa ham
Dynamic import — funksiya kabi chaqiriladi, kerak bo'lganda yuklanadi:
const modul = await import("./yordamchi.js");
// faqat bu qator ishlaganda yuklanadi
Hayotiy o'xshatma
Restorandagi menyu. Static import — barcha taomlarni oldindan hozirlab qo'yish. Mijoz keladi, faqat 2 ta tanlaydi, lekin 20 ta taom hozir edi. Ko'p isrof.
Dynamic import — mijoz buyurtma berganida taom hozirlanadi. Faqat kerakli taom, kerakli vaqtda.
Dynamic import qanday ishlaydi?
import() — Promise qaytaradi. Modul yuklanganda resolve bo'ladi.
import("./yordamchi.js").then(function(modul) {
modul.funksiya();
});
// yoki async/await bilan:
const modul = await import("./yordamchi.js");
modul.funksiya();
Tugma bosilganda yuklash
Katta editor faqat foydalanuvchi "Tahrirlash" ni bossagina yuklanadi:
const tahrirlashTugma = document.getElementById("tahrirlash");
tahrirlashTugma.addEventListener("click", async function() {
// Tugma bosildi — endi editor kerak
const { Editor } = await import("./editor.js");
const editor = new Editor("#matn-maydoni");
editor.ishga_tushir();
});
Sahifa ochilayotganda editor.js yuklanmadi. Foydalanuvchi "Tahrirlash" ni bosganida — o'sha payt yuklanadi.
Shartli yuklash
Modulni faqat ma'lum sharoitda yuklash:
async function sozlash(til) {
let tarjimalar;
if (til === "uz") {
tarjimalar = await import("./tarjimalar/uz.js");
} else if (til === "ru") {
tarjimalar = await import("./tarjimalar/ru.js");
} else {
tarjimalar = await import("./tarjimalar/en.js");
}
return tarjimalar.default;
}
Faqat kerakli til fayli yuklanadi — barcha tillar emas.
Default va Named import bilan
Dynamic import — to'liq modul ob'ektini beradi:
// yordamchi.js
export default function asosiy() { ... }
export function qo_shimcha() { ... }
const modul = await import("./yordamchi.js");
modul.default(); // ← default export
modul.qo_shimcha(); // ← named export
Yoki destructuring bilan:
const { default: asosiy, qo_shimcha } = await import("./yordamchi.js");
asosiy();
qo_shimcha();
Vite va bundlerlar bilan
Vite yoki Webpack ishlatayotganda — dynamic import avtomatik "chunk" ga bo'linadi. Har chunk alohida fayl — faqat kerak bo'lganda yuklanadi.
// Vite da:
const { YirikKomponent } = await import("./YirikKomponent.js");
// Vite bu faylni alohida chunk qiladi — asosiy bundle dan ajratadi
Bu — code splitting. Asosiy bundle kichik, qo'shimcha kod keyinroq yuklanadi.
Tez-tez uchraydigan xatolar
Dynamic import ni sinxron ishlatishga urinish:
import() Promise qaytaradi — await yoki .then() kerak.
// ❌ — modul o'rniga Promise keladi
const modul = import("./fayl.js");
modul.funksiya(); // ❌ TypeError — modul hali tayyor emas
// ✅
const modul = await import("./fayl.js");
modul.funksiya(); // ✅
Xatoni ushlaslik:
Modul fayli topilmasa yoki yuklash muammosi bo'lsa — Promise reject bo'ladi.
// ❌ — xato ushlashsiz
const modul = await import("./mavjud_emas.js"); // xato yo'qoladi
// ✅
try {
const modul = await import("./mavjud_emas.js");
modul.default();
} catch (xato) {
console.error("Modul yuklanmadi:", xato.message);
}
Xulosa
Dynamic import — import() funksiyasi, Promise qaytaradi. Modul kerak bo'lganda yuklanadi — sahifa ochilayotganda emas.
Qachon kerak: katta kutubxona (editor, chart, PDF), faqat ma'lum foydalanuvchilarga kerak funksiya, turli shartlarda turli modullar.
Static import — doimiy kerak narsalar uchun. Dynamic import — vaqti-vaqtida kerak bo'lgan og'ir narsalar uchun.
Keyingi dars
56-dars: CommonJS — require, module.exports