Точка входа в 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" · карта Node.js.
Запуск файла и подключение как модуль
Файл 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 === module | true, если этот файл — точка входа |
// 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 ….
В браузере скрипт подключают через <script type="module">; отдельной точки входа в стиле CLI там нет. Паттерн с require.main и проверкой import.meta.url нужен в Node.js, утилитах и тестах.
Когда писать проверку
| Ситуация | Нужна ли |
|---|---|
Одноразовый скрипт в npm run | По желанию |
| Модуль с функциями + локальное демо | Да |
Express-приложение в app.js, импортируемое в тестах | Да — listen только при прямом запуске файла |
Только export без кода верхнего уровня | Часто достаточно без обёртки |
Сравнение с Python
| Python | Node.js (CJS) | Node.js (ESM) | |
|---|---|---|---|
| Проверка | __name__ == "__main__" | require.main === module | process.argv[1] и import.meta.url |
| Импорт выполняет код верхнего уровня | Да | Да | Да |
Общий обзор по языкам — в Python — if name == "main".
Связанные материалы
| Тема | Статья |
|---|---|
npm, package.json | Первая программа на Node.js — Первая программа |
| CommonJS и ESM подробнее | Node.js - серверный JavaScript — Node.js |
import.meta в браузере | 40 — ESM |
| Карта блока Node | intro |