Dynamic Import ใช้ import() Function โหลด Module เมื่อต้องการ (Lazy Loading) คืนค่า Promise ช่วยลด Bundle Size เริ่มต้นและโหลดเฉพาะตอนจำเป็น
โครงสร้างไฟล์ (ต้องรันบน Local Server)
project/
├── index.html
├── main.js (Entry Point)
└── module.js (Lazy Module)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Dynamic Import</title>
<style>
body { font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; }
.result { font-size: 18px; font-weight: 500; }
</style>
</head>
<body>
<h1>Dynamic Module Loading</h1>
<button class="Btn">LOAD MODULE</button>
<div class="result"></div>
<h3>คลิกเพื่อโหลด Module แบบ Dynamic</h3>
<script src="main.js" type="module"></script>
</body>
</html>
main.js (Dynamic Import)
const btn = document.querySelector(".Btn");
const result = document.querySelector(".result");
btn.addEventListener("click", async () => {
try {
btn.disabled = true;
btn.textContent = "Loading...";
// Dynamic Import - คืน Promise
const module = await import("./module.js");
// ใช้ Default Export
module.default();
// หรือ Named Exports
// module.namedExport();
btn.textContent = "LOADED";
} catch (error) {
result.innerHTML = `Error: ${error.message}`;
btn.textContent = "RETRY";
btn.disabled = false;
}
});
module.js
// Named Export
export const API_URL = "https://api.example.com";
// Default Export
export default function initModule() {
document.querySelector(".result").innerHTML =
"Module โหลดสำเร็จ! (Dynamic Import)";
}
// Named Export Function
export function namedExport() {
console.log("Named export called");
}
Static vs Dynamic Import
| ด้าน | Static Import | Dynamic Import |
|---|---|---|
| Syntax | import ... from '...' | import('...') |
| Timing | Compile/Load Time | Runtime (On Demand) |
| Return | Module Namespace | Promise < Module Namespace > |
| Top Level | ต้องอยู่ Top Level | ใช้ได้ทุกที่ (ใน Async Function) |
| Conditional | ไม่ได้ (ต้องใช้ Dynamic) | ได้ (if/else, user action) |
| Tree Shaking | ✅ Full Support | ⚠️ Limited |
Use Cases
- Code Splitting: โหลด Feature เฉพาะตอน User ใช้ (Routes, Modals)
- Conditional Loading: โหลด Polyfill เฉพาะ Browser เก่า
- Lazy Loading: โหลด Heavy Library (Chart, Editor) ตอนต้องการ
- A/B Testing: โหลด Version ต่างๆ ตาม Experiment
ผลลัพธ์
คลิก LOAD MODULE → โหลด module.js → แสดง "Module โหลดสำเร็จ!"