Programming Track
JavaScript
ES6+
Dynamic imports
เรียนรู้ Dynamic Import ด้วยฟังก์ชัน import() ที่โหลด module เมื่อต้องการจริงๆ แทนการโหลดทั้งหมดตั้งแต่ต้น เหมาะกับ lazy loading และ conditional loading
Dynamic Import คืออะไร?
ปกติ `import` แบบ static จะโหลด module ทั้งหมดตอนเริ่มต้นโปรแกรม — แม้ว่าบาง module จะยังไม่ถูกใช้ Dynamic Import คือฟังก์ชัน `import()` ที่โหลด module ตอนที่ต้องการจริงๆ — โหลดเฉพาะเวลาที่เรียก ไม่ใช่ตอน start
JS
// Static import — โหลดทันทีตอน start (ต้องอยู่ด้านบนสุดของไฟล์)
import { formatDate } from "./utils/date";
// Dynamic import — โหลดเมื่อเรียก (วางไว้ที่ไหนก็ได้)
const module = await import("./utils/date");
const { formatDate } = module;`import()` คืน Promise
`import(path)` คืน Promise ที่ resolve เป็น module object — ใช้ `.then()` หรือ `await` รับค่าได้เหมือน Promise ทั่วไป
JS
// แบบ .then()
import("./utils/math").then((module) => {
const result = module.add(2, 3);
console.log(result); // 5
});
// แบบ async/await — อ่านง่ายกว่า
async function calculate() {
const { add, multiply } = await import("./utils/math");
console.log(add(2, 3)); // 5
console.log(multiply(4, 5)); // 20
}
calculate();กรณีใช้งานจริง: Lazy Loading
Dynamic Import เหมาะกับ: - **โหลด module เมื่อผู้ใช้ทำ action** — ไม่ต้องโหลดล่วงหน้า - **โหลด module ตาม condition** — โหลดเฉพาะเมื่อจำเป็น - **ลด bundle size** — แยก code ออกเป็นส่วนเล็กๆ โหลดทีหลัง
JS
// โหลด module เมื่อคลิก — ไม่โหลดล่วงหน้า
document.getElementById("btn").addEventListener("click", async () => {
const { renderChart } = await import("./chart-renderer");
renderChart("#container", data);
});
// โหลดตาม condition
async function loadLocale(lang) {
if (lang === "th") {
const { messages } = await import("./locales/th");
return messages;
}
const { messages } = await import("./locales/en");
return messages;
}
// ใน Next.js / React — lazy load component
// const HeavyComponent = React.lazy(() => import("./HeavyComponent"));สรุป
- import() คือฟังก์ชัน ไม่ใช่ keyword — วางไว้ที่ไหนในโค้ดก็ได้
- คืน Promise ที่ resolve เป็น module object — ใช้ await หรือ .then() รับค่า
- โหลด module เมื่อเรียกเท่านั้น ไม่โหลดตอน start เหมือน static import
- ใช้กับ lazy loading, conditional loading, หรือแยก code เป็น chunk ย่อยๆ