</>
⌕
Mid #modules#esm#commonjs#tree-shaking

ES Modules khác CommonJS thế nào? Live binding và tree shaking là gì?

⚡ Trả lời nhanh

ESM (`import`/`export`) được phân tích tĩnh, bất đồng bộ, export là live binding (tham chiếu sống) và hỗ trợ tree shaking, top-level await. CommonJS (`require`) chạy đồng bộ lúc runtime, export là bản sao giá trị tại thời điểm gán trên `module.exports`.

So sánh

ESMCommonJS
Cú phápimport / exportrequire / module.exports
Phân tíchtĩnh, lúc parseđộng, lúc chạy
Tảibất đồng bộđồng bộ
Exportlive binding, chỉ đọcgiá trị/object được gán
Tree shakingcókhó
Top-level awaitcókhông
this ở top-levelundefinedmodule.exports

Live binding

// counter.js
export let count = 0;
export function inc() { count++; }

// main.js
import { count, inc } from "./counter.js";
inc();
console.log(count); // 1, thấy giá trị mới
// count = 5;       // TypeError: import là chỉ đọc

Với CommonJS, const { count } = require("./counter") chỉ lấy giá trị lúc đó và không cập nhật theo.

  • import() động trả Promise, dùng cho code splitting và lazy loading.
  • Module được cache: chỉ thực thi một lần dù import nhiều nơi.
  • Phụ thuộc vòng: ESM xử lý tốt hơn nhờ binding, nhưng truy cập trước khi khởi tạo gây ReferenceError (TDZ).
🃏 Ôn bằng flashcard