Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

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'); // true

os.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 defaultmodule.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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.