Точка входа в 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 === 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"> — там нет «импорта без запуска» того же файла как отдельной точки входа. Паттерн с require.main актуален для Node.js, CLI и тестов.
Когда писать проверку
| Ситуация | Нужна ли |
|---|---|
Одноразовый скрипт в npm run | По желанию |
| Модуль с функциями + локальное демо | Да |
Express-приложение в app.js, импортируемое в тестах | Да — слушатель порта только в блоке «main» |
Только 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 | 262 — Первая программа |
| CommonJS и ESM подробнее | 26 — Node.js |
import.meta в браузере | 40 — ESM |
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Основы JavaScript - стандарт ECMAScript, модель выполнения и базовые конструкции языка. JavaScript — это язык программирования, который позволяет создавать интерактивные веб-страницы, серверные приложения и мобильные программы. Для создания массивов используется литеральная нотация. Конструктор Array не применяется. DOM в JavaScript — поиск элементов, формы, выделение текста, атрибуты, создание и изменение HTML. Простые приложения на JavaScript - базовые сценарии, структура кода и быстрый старт с практическими примерами. Расширения файлов определяют способ обработки кода средой выполнения или компилятором. История JavaScript - происхождение языка, ключевые этапы развития и влияние на современный веб. Такое именование представляет собой соглашение между разработчиками. Классический JavaScript не обеспечивает реальной приватности через подчеркивания. JavaScript содержит набор зарезервированных слов, которые имеют специальное значение в языке. Эти слова нельзя использовать в качестве идентификаторов для переменных, функций или классов. Встроенные функции JavaScript - ключевые методы массивов, строк и объектов для повседневной разработки. Подключение скриптов в HTML, структура файла, CommonJS и ESM в Node.js, кэш модулей и package.json. JavaScript используется для создания кроссплатформенных мобильных приложений, которые работают на iOS и Android с использованием единой кодовой базы.Основы JavaScript
Что требуется знать перед началом изучения языка программирования JavaScript
Рекомендации по разработке на JavaScript
Работа с HTML в JavaScript
Простые приложения на JavaScript
Форматы JavaScript
История языка JavaScript
Синтаксис и пунктуация в JavaScript
Ключевые слова языка JavaScript
Встроенные функции JavaScript
Структура и подключение JavaScript-кода
Применение JavaScript в вебе и за его пределами