Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

การ Load JavaScript Modules แบบ Dynamic (Dynamic Import)

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 ImportDynamic Import
Syntaximport ... from '...'import('...')
TimingCompile/Load TimeRuntime (On Demand)
ReturnModule NamespacePromise < 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 โหลดสำเร็จ!"