← Назад к вопросам
В чём разница между ESM и Commander.js?
2.0 Middle🔥 72 комментариев
#Инструменты и DevOps
Комментарии (2)
🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между ESM и CommonJS
ESM (ECMAScript Modules) и CommonJS — это два разных стандарта модульной системы в JavaScript. Это базовая и важная разница, которую часто путают с конкретными библиотеками.
CommonJS (CJS)
CommonJS — это модульная система, созданная для Node.js и долгое время была единственным стандартом:
// Экспорт
module.exports = {
greet: (name) => `Hello, ${name}!`
};
// Импорт
const { greet } = require("./greeting");
console.log(greet("Alice"));
Характеристики:
- Синхронная загрузка — модули загружаются когда требуются (
require()блокирует выполнение) - Динамический импорт — можно вычислить путь во время выполнения
- Объекты — экспортируются как объекты, импортируются как копии
- Поддержка — встроена в Node.js по умолчанию
ESM (ECMAScript Modules)
ESM — это официальный стандарт JavaScript, введённый в ES6 (2015). Это современный подход к модулям:
// Экспорт (именованный)
export const greet = (name) => `Hello, ${name}!`;
// Экспорт (по умолчанию)
export default function farewell(name) {
return `Goodbye, ${name}!`;
}
// Импорт (именованный)
import { greet } from "./greeting.js";
// Импорт (по умолчанию)
import farewell from "./greeting.js";
// Импорт всех экспортов
import * as greeting from "./greeting.js";
Характеристики:
- Асинхронная загрузка — модули загружаются параллельно (лучше производительность)
- Статический анализ — импорты должны быть объявлены в начале файла
- Живые связи — экспортируемые значения могут обновляться в реальном времени
- Дерево путей (Tree-shaking) — инструменты сборки могут удалять неиспользуемый код
- Встроена в браузеры и Node.js 12+
Ключевые отличия
| Параметр | CommonJS | ESM |
|---|---|---|
| Синтаксис экспорта | module.exports = ... | export ... или export default |
| Синтаксис импорта | require() | import ... from |
| Загрузка | Синхронная | Асинхронная |
| Динамический импорт | ✅ Встроен в require() | import() функция |
| Tree-shaking | ❌ Сложный анализ | ✅ Встроен |
| Переиспользование | Копия объекта | Живая ссылка |
Пример динамического импорта
// CommonJS
const modulePath = process.env.NODE_ENV === "production"
? "./prod-config"
: "./dev-config";
const config = require(modulePath);
// ESM (динамический импорт)
const modulePath = process.env.NODE_ENV === "production"
? "./prod-config.js"
: "./dev-config.js";
const config = await import(modulePath);
Команда.js (Commander.js)
Commander.js — это популярная библиотека для создания CLI приложений. Она работает как с CommonJS, так и с ESM:
// CommonJS
const { Command } = require("commander");
const program = new Command();
// ESM
import { Command } from "commander";
const program = new Command();
Когда использовать
- CommonJS: Старые проекты Node.js, код, требующий синхронной загрузки
- ESM: Современные приложения, фронтенд, код с поддержкой bundlers (Webpack, Vite)
Вывод: ESM — это будущее JavaScript. Node.js постепенно переходит на ESM как основной стандарт, хотя CommonJS всё ещё широко используется в существующем коде.