Всем известно, что зависимости вашего проекта установлены в папке 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()
.
Читайте также Все про Node.js: о перспективах бэкенда на 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. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.