Разбираем Node.js. Как свойство main в package.json определяет точку входа

Читать в полной версии →

Всем известно, что зависимости вашего проекта установлены в папке node_modules. Но когда вы делаете require('lodash'), как Node.js узнает, какой файл загружать при загрузке модуля?

Загрузка модуля работает в два этапа.

При загрузке зависимости Node.js работает в два этапа. Это достаточно сильно отличается от загрузки модулей, встроенных в Node.js, например, с помощью require('fs') или локального модуля с помощью require ('./queue/mem.js'). Зависимость загружается в два основных этапа:

— Поиск нужной директории;

— Поиск точки входа;

Поиск директории

Среда выполнения анализирует все директории, которые находятся на пути от текущего файла к корню файловой системы. В каждой директории Node.js проверяет, содержит ли она папку node_modules. В случае, если поиск заканчивается успехом, среда выполнения переходит внутрь этой директории и ищет внутри поддиректорию, имя которой должно соответствовать имени загружаемого модуля. То есть, если мы импортируем lodash — require('lodash'), то Node.js будет искать директорию node_modules/lodash. Node.js будет это делать, пока не найдет совпадение.

Поиск точки входа

Найдя нужную директорию, Node.js попробует несколько стратегий для определения точки входа. Точкой входа является файл, module.exports которого возвращается в качестве значения вызова функции require().

Читайте также За что могут уволить программиста: опыт и мнение экспертов: о перспективах бэкенда на JavaScript и ситуации на рынке труда.

Сначала Node.js ищет package.json файл и проверяет, содержит ли он свойство main. Оно будет использоваться для указания на файл внутри директории пакета, который и будет точкой входа. Если main не существует, то Node.js будет пытаться загрузить файлы в следующем порядке — index.js, index.json, index.node.

Приоритетность поиска:

— Если package.json содержит свойство main;

— Если свойства main нет, то Node будет загружать по порядку — index.js, index.json, index.node.

Как выглядит точка входа для популярных пакетов

То, что происходит внутри пакетов, зависит от их авторов. Есть несколько способов указать точку входа в определенный пакет. Вот так это делают некоторые популярные модули npm.

При этом многие пакеты определяют свойство main, и только некоторые оставляют его для поиска по умолчанию.


Адаптированный перевод статьи Main property in package.json defines package entry point с сайта Byte Archer by Panu Pitkamaki. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.