← Назад к вопросам

В чём разница между 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+

Ключевые отличия

ПараметрCommonJSESM
Синтаксис экспорта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 всё ещё широко используется в существующем коде.