0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p><strong>Всем известно, что зависимости вашего проекта установлены в папке node_modules. Но когда вы делаете require('lodash'), как Node.js узнает, какой файл загружать при загрузке модуля?</strong></p>
1
<p><strong>Всем известно, что зависимости вашего проекта установлены в папке node_modules. Но когда вы делаете require('lodash'), как Node.js узнает, какой файл загружать при загрузке модуля?</strong></p>
2
<h2>Содержание</h2>
2
<h2>Содержание</h2>
3
<ul><li><a>Загрузка модуля работает в два этапа.</a></li>
3
<ul><li><a>Загрузка модуля работает в два этапа.</a></li>
4
<li><a>Поиск директории</a></li>
4
<li><a>Поиск директории</a></li>
5
<li><a>Поиск точки входа</a></li>
5
<li><a>Поиск точки входа</a></li>
6
<li><a>Как выглядит точка входа для популярных пакетов</a></li>
6
<li><a>Как выглядит точка входа для популярных пакетов</a></li>
7
</ul><h2>Загрузка модуля работает в два этапа.</h2>
7
</ul><h2>Загрузка модуля работает в два этапа.</h2>
8
<p>При загрузке зависимости Node.js работает в два этапа. Это достаточно сильно отличается от загрузки модулей, встроенных в Node.js, например, с помощью require('fs') или локального модуля с помощью require ('./queue/mem.js'). Зависимость загружается в два основных этапа:</p>
8
<p>При загрузке зависимости Node.js работает в два этапа. Это достаточно сильно отличается от загрузки модулей, встроенных в Node.js, например, с помощью require('fs') или локального модуля с помощью require ('./queue/mem.js'). Зависимость загружается в два основных этапа:</p>
9
<p>- Поиск нужной директории;</p>
9
<p>- Поиск нужной директории;</p>
10
<p>- Поиск точки входа;</p>
10
<p>- Поиск точки входа;</p>
11
<h2>Поиск директории</h2>
11
<h2>Поиск директории</h2>
12
<p>Среда выполнения анализирует все директории, которые находятся на пути от текущего файла к корню файловой системы. В каждой директории Node.js проверяет, содержит ли она папку node_modules. В случае, если поиск заканчивается успехом, среда выполнения переходит внутрь этой директории и ищет внутри поддиректорию, имя которой должно соответствовать имени загружаемого модуля. То есть, если мы импортируем lodash - require('lodash'), то Node.js будет искать директорию node_modules/lodash. Node.js будет это делать, пока не найдет совпадение.</p>
12
<p>Среда выполнения анализирует все директории, которые находятся на пути от текущего файла к корню файловой системы. В каждой директории Node.js проверяет, содержит ли она папку node_modules. В случае, если поиск заканчивается успехом, среда выполнения переходит внутрь этой директории и ищет внутри поддиректорию, имя которой должно соответствовать имени загружаемого модуля. То есть, если мы импортируем lodash - require('lodash'), то Node.js будет искать директорию node_modules/lodash. Node.js будет это делать, пока не найдет совпадение.</p>
13
<h2>Поиск точки входа</h2>
13
<h2>Поиск точки входа</h2>
14
<p>Найдя нужную директорию, Node.js попробует несколько стратегий для определения точки входа. Точкой входа является файл, module.exports которого возвращается в качестве значения вызова функции require().</p>
14
<p>Найдя нужную директорию, Node.js попробует несколько стратегий для определения точки входа. Точкой входа является файл, module.exports которого возвращается в качестве значения вызова функции require().</p>
15
<blockquote><h3>Читайте также</h3>
15
<blockquote><h3>Читайте также</h3>
16
<p><a>Все про Node.js</a>: о перспективах бэкенда на JavaScript и ситуации на рынке труда.</p>
16
<p><a>Все про Node.js</a>: о перспективах бэкенда на JavaScript и ситуации на рынке труда.</p>
17
</blockquote><p>Сначала Node.js ищет package.json файл и проверяет, содержит ли он свойство main. Оно будет использоваться для указания на файл внутри директории пакета, который и будет точкой входа. Если main не существует, то Node.js будет пытаться загрузить файлы в следующем порядке - index.js, index.json, index.node.</p>
17
</blockquote><p>Сначала Node.js ищет package.json файл и проверяет, содержит ли он свойство main. Оно будет использоваться для указания на файл внутри директории пакета, который и будет точкой входа. Если main не существует, то Node.js будет пытаться загрузить файлы в следующем порядке - index.js, index.json, index.node.</p>
18
<p>Приоритетность поиска:</p>
18
<p>Приоритетность поиска:</p>
19
<p>- Если package.json содержит свойство main;</p>
19
<p>- Если package.json содержит свойство main;</p>
20
<p>- Если свойства main нет, то Node будет загружать по порядку - index.js, index.json, index.node.</p>
20
<p>- Если свойства main нет, то Node будет загружать по порядку - index.js, index.json, index.node.</p>
21
<h2>Как выглядит точка входа для популярных пакетов</h2>
21
<h2>Как выглядит точка входа для популярных пакетов</h2>
22
<p>То, что происходит внутри пакетов, зависит от их авторов. Есть несколько способов указать точку входа в определенный пакет. Вот так это делают некоторые популярные модули npm.</p>
22
<p>То, что происходит внутри пакетов, зависит от их авторов. Есть несколько способов указать точку входа в определенный пакет. Вот так это делают некоторые популярные модули npm.</p>
23
<p>При этом многие пакеты определяют свойство main, и только некоторые оставляют его для поиска по умолчанию.</p>
23
<p>При этом многие пакеты определяют свойство main, и только некоторые оставляют его для поиска по умолчанию.</p>
24
<p><em>Адаптированный перевод <a>статьи</a> Main property in package.json defines package entry point с сайта Byte Archer by Panu Pitkamaki. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.</em></p>
24
<p><em>Адаптированный перевод <a>статьи</a> Main property in package.json defines package entry point с сайта Byte Archer by Panu Pitkamaki. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.</em></p>