Skip to content
Grok

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

คุณสมบัติESMCJS
Syntaximport/exportrequire/module.exports
Static/DynamicStatic (รู้ตั้งแต่ 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