Пошук уроків, статей та іншого контенту
Дві системи модулів у Node.js — історична require/module.exports та сучасна import/export.
Коли Node.js з'явився у 2009 році, стандарту модулів у самому JavaScript ще не існувало — Node прийняв власний, CommonJS: require() для імпорту, module.exports для експорту. ES Modules (import/export), пройдені в основному курсі JavaScript, стали офіційним стандартом мови значно пізніше, і Node.js додав їхню підтримку окремо. Сьогодні в Node.js працюють обидві системи, і важливо розуміти, яка активна в конкретному файлі.
// math.js
function sum(a, b) {
return a + b;
}
module.exports = { sum };
// app.js
const { sum } = require("./math.js");
console.log(sum(2, 3));require() — синхронна функція: файл модуля виконується одразу в момент виклику, а не заздалегідь. Це історично й дало Node.js гнучкість (умовний require() усередині if можливий), якої немає в статичному синтаксисі import.
// math.mjs (або math.js, якщо в package.json увімкнено ESM)
export function sum(a, b) {
return a + b;
}
// app.mjs
import { sum } from "./math.mjs";
console.log(sum(2, 3));Розширення файлу й поле type у package.json визначають, яка система модулів активна за замовчуванням:
Файл .cjs — завжди CommonJS, незалежно від налаштувань проєкту.
Файл .mjs — завжди ES Modules, незалежно від налаштувань проєкту.
Файл .js — залежить від поля "type" у найближчому package.json: "type": "module" означає ES Modules, відсутність поля чи "type": "commonjs" означає CommonJS (типова поведінка за замовчуванням).
{
"name": "my-app",
"type": "module"
}Синтаксис CommonJS і ES Modules не можна довільно змішувати в межах одного файлу — файл, що використовує import, не може одночасно використовувати require() (і навпаки). Взаємодія між файлами різних систем можлива, але має свої обмеження — наприклад, CommonJS-файл не може статично import-нути ESM-файл без динамічного import().
Змішування require() та import в одному файлі — призводить до помилки синтаксису чи виконання, залежно від того, яка система активна для цього файлу.
Забути "type": "module" у package.json, а потім дивуватись синтаксичній помилці при спробі використати import у .js-файлі — за замовчуванням .js трактується як CommonJS.
Плутати динамічний import() (функція, що повертає Promise, працює і в CommonJS) зі статичним import (декларація, працює лише в ESM-файлах) — вони мають різні правила використання.
Node.js підтримує дві системи модулів: історичний CommonJS (require/module.exports, синхронний, гнучкіший) і сучасний стандартний ES Modules (import/export, статичний, той самий синтаксис, що й у браузерному JavaScript). Розширення файлу (.cjs/.mjs) або поле "type" у package.json визначають, яка система активна для конкретного .js-файлу — змішувати синтаксис двох систем в одному файлі не можна.