Это две системы модулей JavaScript для разделения кода между файлами.
Почему это важно
js
// import / export, used in browsers and modern Node
import { sum } from "./math.js";
import defaultThing ;
x = ;
() {};
Это две системы модулей JavaScript для разделения кода между файлами.
// import / export, used in browsers and modern Node
import { sum } from "./math.js";
import defaultThing ;
x = ;
() {};
const { sum } = require("./math");
module.exports = { x: 1 };
| ES Modules | CommonJS | |
|---|---|---|
| Синтаксис | import/export | require/module.exports |
| Загрузка | статическая, асинхронная | динамическая, синхронная |
| Анализируемость | ✅ → tree-shaking | ❌ сложнее |
| Привязки | live (только для чтения) | скопированное значение |
this в начале | undefined | module.exports |
Статическая означает, что импорты ESM известны во время парсинга, что позволяет бундлерам выполнять tree-shaking (удалять неиспользуемые экспорты). require CommonJS динамичен (можно require условно), поэтому его сложнее анализировать.
{ "type": "module" } // in package.json, or use the .mjs extension
Нельзя выполнить require() пакета только для ESM из CommonJS; смешивание этих двух имеет острые края. Импорты ESM также являются live bindings — если экспортер изменит значение, импортеры увидят новое значение (CJS дает вам копию снимка).
ESM — это будущее (встроен в браузер, tree-shakeable, top-level await).
Выбирайте его для нового кода; понимайте CJS, потому что большая часть экосистемы Node все еще его использует.