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
| Особенность | CommonJS | ES-модули |
| Импорт | require() | import |
| Экспорт | module.exports | export |
| Загрузка | синхронная | асинхронная |
| Когда грузится | в момент вызова | заранее, до выполнения |
| Расширение по умолчанию | .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 обычно указывают расширение файла.