Перейти к основному содержимому

Точка входа в Node.js — require.main и import.meta

Разработчику

В Python есть if __name__ == "__main__":. В Node.js тот же вопрос звучит так: файл запустили командой node file.js или подключили через require / import?

См. также: Первая программа на Node.js · модули Node · ESM в браузере · Python — if name == "main".


Зачем разделять запуск и импорт

Файл calculator.js экспортирует функции и внизу демонстрирует их:

function add(a, b) {
return a + b;
}

console.log(add(5, 3));
module.exports = { add };

Команда node -e "require('./calculator')" выведет 8, хотя нужна была только функция add. Демо-код стоит выполнять только при прямом запуске.


CommonJS — require.main === module

В модулях CommonJS (require, module.exports) Node задаёт:

ОбъектСмысл
moduleТекущий модуль
require.mainМодуль, с которого начался процесс
require.main === moduletrue, если этот файл — точка входа
// calculator.cjs
function add(a, b) {
return a + b;
}

module.exports = { add };

if (require.main === module) {
console.log(add(5, 3));
}
СпособПоведение
node calculator.cjsПоказывает демо
require('./calculator.cjs')Только экспорт, без console.log

Часто логику выносят в main() и вызывают её внутри проверки — как в Python.


ESM — import.meta.url и process.argv[1]

В ES-модулях ("type": "module" в package.json или расширение .mjs) переменной require.main нет. Сравнивают путь запущенного файла с URL текущего модуля:

// calculator.mjs
import { fileURLToPath } from 'node:url';

export function add(a, b) {
return a + b;
}

const isMain =
process.argv[1] === fileURLToPath(import.meta.url);

if (isMain) {
console.log(add(5, 3));
}
  • import.meta.url — URL текущего файла (аналог «кто я» в ESM).
  • process.argv[1] — путь, который передали в node ….
Браузер и bundler

В браузере скрипт подключают через <script type="module"> — там нет «импорта без запуска» того же файла как отдельной точки входа. Паттерн с require.main актуален для Node.js, CLI и тестов.


Когда писать проверку

СитуацияНужна ли
Одноразовый скрипт в npm runПо желанию
Модуль с функциями + локальное демоДа
Express-приложение в app.js, импортируемое в тестахДа — слушатель порта только в блоке «main»
Только export без кода верхнего уровняЧасто достаточно без обёртки

Сравнение с Python

PythonNode.js (CJS)Node.js (ESM)
Проверка__name__ == "__main__"require.main === moduleprocess.argv[1] и import.meta.url
Импорт выполняет код верхнего уровняДаДаДа

Общий обзор по языкам — в Python — if name == "main".


Дальше по разделу

ТемаСтатья
npm, package.json262 — Первая программа
CommonJS и ESM подробнее26 — Node.js
import.meta в браузере40 — ESM

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").