HTML Diff
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>