ES-модули: import и export

Стандартный для языка синтаксис модулей — import/export — и как включить его в Node.

ES-модули (ESM) — это официальный стандарт модулей в JavaScript, с ключевыми словами import и export. Тот же синтаксис вы видели во фронтенде.

Два мира модулей

Исторически Node использовал CommonJS (require). Но в самом языке JavaScript позже появился свой стандарт — ES-модули с import/export. Современный Node поддерживает оба, и важно понимать разницу.

Экспорт в ESM

В ES-модулях экспортируют конкретные имена ключевым словом export, либо одно главное значение через export default:

// math.mjs
export function add(a, b) {
  return a + b;
}

export const PI = 3.14159;

export default function multiply(a, b) {
  return a * b;
}

Импорт в ESM

Именованные импорты берут в фигурные скобки, а default — без скобок и с любым именем:

// app.mjs
import multiply, { add, PI } from "./math.mjs";

console.log(add(2, 3));       // 5
console.log(PI);              // 3.14159
console.log(multiply(4, 5));  // 20

Обратите внимание: в ESM в относительных путях обычно указывают расширение файла (.mjs или .js) — в отличие от CommonJS, где можно было опускать.

Как включить ESM в Node

Есть два способа сказать Node, что файл — это ES-модуль:

  • дать файлу расширение .mjs;
  • или добавить "type": "module" в package.json — тогда все .js станут ES-модулями.
{
  "name": "my-app",
  "type": "module"
}

CommonJS против ESM

ОсобенностьCommonJSES-модули
Импортrequire()import
Экспортmodule.exportsexport
Загрузкасинхроннаяасинхронная
Когда грузитсяв момент вызовазаранее, до выполнения
Расширение по умолчанию.js.mjs или type: module

Что выбрать

Для новых проектов рекомендуется ESM — это стандарт языка, тот же синтаксис, что во фронтенде, и за ним будущее. CommonJS по-прежнему встречается в огромном количестве пакетов и старого кода, поэтому знать его обязательно.

Деструктуризация при импорте — это обычная возможность языка. Вот её суть на чистом JS:

const moduleExports = { add: (a, b) => a + b, PI: 3.14159 };

// аналог: import { add, PI } from "..."
const { add, PI } = moduleExports;

console.log(add(7, 8));
console.log("PI =", PI);

Вывод:

15
PI = 3.14159

Итог

  • ES-модули — стандарт языка: export и import.
  • export default — одно главное значение, импортируется без скобок.
  • Включить ESM: расширение .mjs или "type": "module" в package.json.
  • В путях ESM обычно указывают расширение файла.
Проверьте себя
1. Какое ключевое слово экспортирует значение в ES-модулях?
Amodule.exports
Bexport
Crequire
Dprovide
2. Как включить ES-модули для всех .js файлов проекта?
AДобавить флаг --esm
BУказать «type»: «module» в package.json
CПереименовать всё в .ts
DЭто невозможно
3. Чем отличается загрузка ESM от CommonJS?
AESM грузится синхронно, CJS асинхронно
BESM грузится асинхронно и заранее, CJS синхронно по вызову
CРазницы нет
DESM не кешируется
Поддержать проект