Dark mode
Module คืออะไร
Module คือหน่วยของโค้ดที่แยกออกมาเป็นไฟล์หรือชุดโค้ดที่สามารถนำกลับมาใช้ใหม่ได้ โดยมีขอบเขต (scope) ของตัวเอง ทำให้สามารถแบ่งโค้ดเป็นส่วนๆ จัดการได้ง่าย และป้องกันการชนกันของตัวแปรหรือฟังก์ชัน
ใน Node.js เราใช้ระบบ module เพื่อ:
- แบ่งโค้ดเป็นส่วนๆ ที่มีหน้าที่เฉพาะ (Separation of concerns)
- นำโค้ดกลับมาใช้ใหม่ได้ (Reusability)
- ซ่อนรายละเอียดการทำงานภายใน (Encapsulation)
- จัดการ dependencies ระหว่างส่วนต่างๆ ของโปรแกรม
ประเภทของ Module
ESM (แนะนำ)
ESM(ECMAScript Modules) คือมาตรฐานการ import/export module แบบใหม่ใน JavaScript และ Node.js
ถ้าเป็นไปได้ แนะนำใช้ ESM
js
// math.js - Export แบบ named exports
export function add(a, b) {
return a + b;
}
export function subtract(a, b) {
return a - b;
}
export const PI = 3.14159;
// Export default (ส่งออกค่าหลักเพียงค่าเดียว)
export default function multiply(a, b) {
return a * b;
}
// main.js - การ import หลายรูปแบบ
import multiply, { add, PI as MathPI, subtract } from "./math.js";
console.log(add(5, 3)); // 8
console.log(subtract(10, 4)); // 6
console.log(multiply(2, 3)); // 6
console.log(MathPI); // 3.14159
// Dynamic import (โหลด module ตามเงื่อนไขขณะรันไทม์)
async function loadModule() {
if (someCondition) {
const { default: myModule } = await import("./dynamicModule.js");
myModule.doSomething();
}
}
เหตุผลที่ ESM ดีกว่านี้ CJS
คุณสมบัติ | ESM | CJS |
---|---|---|
Syntax | import /export | require /module.exports |
Static/Dynamic | Static (รู้ตั้งแต่ compile time) | Dynamic (รู้ตอน runtime) |
Top-level await | รองรับ | ไม่รองรับ |
Tree shaking | รองรับ (ทำให้ bundle size เล็กลง) | ไม่รองรับ |
Browser support | รองรับโดยตรง | ต้องใช้ bundler |
File extension | จำเป็นต้องระบุ .js | ไม่จำเป็นต้องระบุ |
มาตรฐาน | ECMAScript มาตรฐานใหม่ | Node.js เฉพาะ |
CJS (ไม่แนะนำ)
CJS(CommonJS) คือมาตรฐานการ import/export module แบบเก่าใน Node.js
แบบเก่า ไม่แนะนำให้ใช้ ถ้าเป็นไปได้ใช้ ESM ทั้งหมด
js
// utils.js - การส่งออกหลายฟังก์ชัน
function formatDate(date) {
return date.toISOString().split("T")[0];
}
function calculateTax(amount, rate = 0.07) {
return amount * rate;
}
// วิธีที่ 1: ส่งออกแต่ละฟังก์ชันแยกกัน
module.exports.formatDate = formatDate;
module.exports.calculateTax = calculateTax;
// หรือ วิธีที่ 2: ส่งออกทั้งหมดในครั้งเดียว
module.exports = {
formatDate,
calculateTax,
VERSION: "1.0.0",
};
// app.js - การนำเข้า
const utils = require("./utils.js");
console.log(utils.formatDate(new Date())); // 2023-10-15
console.log(utils.calculateTax(100)); // 7
// หรือใช้ destructuring
const { formatDate, calculateTax } = require("./utils.js");
console.log(formatDate(new Date())); // 2023-10-15