ES-модули и CommonJS
Модуль — это файл, который отдаёт наружу часть своего кода. Как работают import и export, вы знаете из учебника. В Node.js есть две системы модулей: современные ES-модули и старая CommonJS с require. Новые проекты пишут на ES-модулях, но CommonJS встречается в старом коде и документации, поэтому её нужно узнавать.
Свой модуль
Создайте папку src и в ней файл posts.js — модуль со статьями блога:
// src/posts.js
export const posts = [
{ id: 1, title: 'Привет, Node.js' },
{ id: 2, title: 'Работа с файлами' },
];
export function findPost(id) {
return posts.find((post) => post.id === id);
}Подключите его в app.js в корне проекта:
// app.js
import { posts, findPost } from './src/posts.js';
console.log(posts.length); // 2
console.log(findPost(2).title); // Работа с файламиnode app.js выведет 2 и заголовок второй статьи. Путь к своему модулю начинается с ./ или ../ и обязательно включает расширение .js.
Встроенные модули
Встроенные модули Node.js подключаются по имени с приставкой node: — она показывает, что модуль встроенный, а не скачанный из npm:
import os from 'node:os';
import path from 'node:path';
console.log(path.extname('posts.json')); // .json
console.log(os.EOL === '\n' || os.EOL === '\r\n'); // trueos.EOL — символ конца строки в текущей системе.
CommonJS
В CommonJS вместо import пишут require(), а вместо export — присваивают module.exports:
const path = require('node:path');
function fileName(file) {
return path.basename(file);
}
module.exports = { fileName };
console.log(fileName('/data/posts.json')); // posts.jsonТак устроены проекты без "type": "module" в package.json и файлы с расширением .cjs.
Сравнение
| ES-модули | CommonJS | |
|---|---|---|
| Подключение | import x from '...' | const x = require('...') |
| Экспорт | export, export default | module.exports = ... |
| Включаются | "type": "module" или .mjs | По умолчанию или .cjs |
await вне функции | Можно | Нельзя |
| Путь к своему файлу | Нужен с расширением | Расширение можно опустить |
Частая ошибка
Две системы нельзя смешивать в одном файле. Если в проекте с "type": "module" скопировать из старой статьи строку с require, программа упадёт:
ReferenceError: require is not defined in ES module scopeЗамените require на import: const fs = require('node:fs') превращается в import fs from 'node:fs'. Обратная ситуация тоже бывает: без поля "type" Node.js 22 сам распознаёт import, но печатает предупреждение MODULE_TYPELESS_PACKAGE_JSON. Чтобы его убрать, задайте поле командой npm pkg set type=module.