HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>В разработке приложений есть такое понятие как точка входа. Понимание того, как правильно выделять точки входа, может значительно улучшить архитектуру вашего проекта и расширить его возможности.</p>
1 <p>В разработке приложений есть такое понятие как точка входа. Понимание того, как правильно выделять точки входа, может значительно улучшить архитектуру вашего проекта и расширить его возможности.</p>
2 <h2>Точка входа для приложения</h2>
2 <h2>Точка входа для приложения</h2>
3 <p>Большинство приложений - это достаточно объемный проект, состоящий из множества модулей. Но когда запускается приложение, то запускается какой-то один конкретный файл, он и является точкой входа:</p>
3 <p>Большинство приложений - это достаточно объемный проект, состоящий из множества модулей. Но когда запускается приложение, то запускается какой-то один конкретный файл, он и является точкой входа:</p>
4 <p>Выше пример небольшого проекта из двух файлов:</p>
4 <p>Выше пример небольшого проекта из двух файлов:</p>
5 <ul><li><em>src/my-application/index.js</em>- определена и экспортирована функция, выводящая сообщение в консоль</li>
5 <ul><li><em>src/my-application/index.js</em>- определена и экспортирована функция, выводящая сообщение в консоль</li>
6 <li><em>index.js</em>- импортируется и вызывается функция</li>
6 <li><em>index.js</em>- импортируется и вызывается функция</li>
7 </ul><p>. ├── index.js ├── package.json └── src └── my-application └── index.js</p>
7 </ul><p>. ├── index.js ├── package.json └── src └── my-application └── index.js</p>
8 <p>Модуль<em>index.js</em>в таком проекте является точкой входа. Если вызвать этот файл командой node index.js из директории проекта, то начнется выполнение нашего приложения, произойдет вызов функции app(), и мы увидим результат:</p>
8 <p>Модуль<em>index.js</em>в таком проекте является точкой входа. Если вызвать этот файл командой node index.js из директории проекта, то начнется выполнение нашего приложения, произойдет вызов функции app(), и мы увидим результат:</p>
9 <p>В проекте бывают несколько точек входа. Каждая может работать как отдельное приложение и при этом использовать общую логику.</p>
9 <p>В проекте бывают несколько точек входа. Каждая может работать как отдельное приложение и при этом использовать общую логику.</p>
10 <p>Обычно в точке входа происходит вызов одной функции. Могут быть исключения, но всегда лучше стремиться к вызову одной единственной функции. Почему это так - об этом ниже.</p>
10 <p>Обычно в точке входа происходит вызов одной функции. Могут быть исключения, но всегда лучше стремиться к вызову одной единственной функции. Почему это так - об этом ниже.</p>
11 <h2>Точка входа для библиотеки</h2>
11 <h2>Точка входа для библиотеки</h2>
12 <p>Если в приложениях точкой входа является то место, где происходит вызов самого приложения в виде функции или какого-то кода, то для библиотек ситуация иная. В библиотеках мы не должны в обычной ситуации вызывать код. Библиотека предоставляет функцию или набор функций, а когда их вызывать решает тот, кто импортирует библиотеку в свой модуль.</p>
12 <p>Если в приложениях точкой входа является то место, где происходит вызов самого приложения в виде функции или какого-то кода, то для библиотек ситуация иная. В библиотеках мы не должны в обычной ситуации вызывать код. Библиотека предоставляет функцию или набор функций, а когда их вызывать решает тот, кто импортирует библиотеку в свой модуль.</p>
13 <p>Например, библиотека lodash предоставляет различный набор вспомогательных функций. Мы можем импортировать любое количество функций из этой библиотеки, и сами решать какую когда использовать:</p>
13 <p>Например, библиотека lodash предоставляет различный набор вспомогательных функций. Мы можем импортировать любое количество функций из этой библиотеки, и сами решать какую когда использовать:</p>
14 <p>Когда мы указываем подобный импорт, мы не указываем конкретный файл, откуда нужно импортировать функцию, а только указываем название библиотеки. Но как тогда интерпретатор узнает где находится нужная нам функция? Это происходит благодаря тому, что в npm-пакете есть точка входа для этого самого пакета, то есть точка входа библиотеки, npm-пакет является библиотекой.</p>
14 <p>Когда мы указываем подобный импорт, мы не указываем конкретный файл, откуда нужно импортировать функцию, а только указываем название библиотеки. Но как тогда интерпретатор узнает где находится нужная нам функция? Это происходит благодаря тому, что в npm-пакете есть точка входа для этого самого пакета, то есть точка входа библиотеки, npm-пакет является библиотекой.</p>
15 <p>Чтобы указать точку входа библиотеки, которую мы разрабатываем, мы должны указать в<em>package.json</em>в свойстве "main" путь к файлу, который экспортирует нашу функцию или набор функций, если библиотека предоставляет несколько функций. Благодаря этому, тем, кто будет использовать эту библиотеку, не нужно знать в каком файле определена функция. Модуль, который указан в "main" и будет импортироваться при импорте всей библиотеки.</p>
15 <p>Чтобы указать точку входа библиотеки, которую мы разрабатываем, мы должны указать в<em>package.json</em>в свойстве "main" путь к файлу, который экспортирует нашу функцию или набор функций, если библиотека предоставляет несколько функций. Благодаря этому, тем, кто будет использовать эту библиотеку, не нужно знать в каком файле определена функция. Модуль, который указан в "main" и будет импортироваться при импорте всей библиотеки.</p>
16 <h2>Точка входа библиотеки и приложения в одном проекте</h2>
16 <h2>Точка входа библиотеки и приложения в одном проекте</h2>
17 <p>Часто бывает такое, что проект является приложением, но при этом его так же можно сделать и библиотекой. Представьте, что вы разрабатываете небольшое приложение, которое спрашивает у пользователя его возраст и печатает на экран в каком году он родился.</p>
17 <p>Часто бывает такое, что проект является приложением, но при этом его так же можно сделать и библиотекой. Представьте, что вы разрабатываете небольшое приложение, которое спрашивает у пользователя его возраст и печатает на экран в каком году он родился.</p>
18 <p>Решая эту задачу в лоб, вы можете написать в своем проекте один единственный файл. Не будем вдаваться в подробности кода, сейчас это не так важно:</p>
18 <p>Решая эту задачу в лоб, вы можете написать в своем проекте один единственный файл. Не будем вдаваться в подробности кода, сейчас это не так важно:</p>
19 <p>Вы можете пока не знать как получить значение, которое пользователь ввел в терминал или как получить текущую дату, чтобы рассчитать нужный год. Сейчас это не важно, поэтому в коде мы просто поставили заготовленные ответы.</p>
19 <p>Вы можете пока не знать как получить значение, которое пользователь ввел в терминал или как получить текущую дату, чтобы рассчитать нужный год. Сейчас это не важно, поэтому в коде мы просто поставили заготовленные ответы.</p>
20 <p>Такое приложение будет работать и выполнять свою задачу. Но мы можем значительно расширить возможности нашего проекта, при этом потратив минимум усилий:</p>
20 <p>Такое приложение будет работать и выполнять свою задачу. Но мы можем значительно расширить возможности нашего проекта, при этом потратив минимум усилий:</p>
21 <p>Мы выделили функцию подсчета года рождения в отдельный модуль. Теперь мы можем указать в "main" нашего пакета путь к этому модулю ./src/index.js. Теперь все, кто будет импортировать наш пакет, смогут использовать функцию для подсчета года рождения. Выделив функцию, мы значительно повысили возможности переиспользования нашего проекта.</p>
21 <p>Мы выделили функцию подсчета года рождения в отдельный модуль. Теперь мы можем указать в "main" нашего пакета путь к этому модулю ./src/index.js. Теперь все, кто будет импортировать наш пакет, смогут использовать функцию для подсчета года рождения. Выделив функцию, мы значительно повысили возможности переиспользования нашего проекта.</p>
22 <p>Хорошей практикой считается всегда выделять подобные функции в ваших проектах. Это делается не только для переиспользования. Например, это значительно упрощает тестирование вашего проекта.</p>
22 <p>Хорошей практикой считается всегда выделять подобные функции в ваших проектах. Это делается не только для переиспользования. Например, это значительно упрощает тестирование вашего проекта.</p>
23 <p>Обратите внимание, что мы не добавили вызов console.log() и получение возраста в функцию. Это сделано потому, что эти операции предназначены только для консольных приложений. Если бы мы вместо возврата значения из функции делали просто вывод в консоль, то такую функцию нельзя было бы использовать для других задач, например, для веб-приложений.</p>
23 <p>Обратите внимание, что мы не добавили вызов console.log() и получение возраста в функцию. Это сделано потому, что эти операции предназначены только для консольных приложений. Если бы мы вместо возврата значения из функции делали просто вывод в консоль, то такую функцию нельзя было бы использовать для других задач, например, для веб-приложений.</p>
24 <p>По умолчанию в "main" указывается файл<em>index.js</em>- это файл, который находится в корне проекта. Ниже пример<em>package.json</em>как он мог бы выглядеть для нашего проекта:</p>
24 <p>По умолчанию в "main" указывается файл<em>index.js</em>- это файл, который находится в корне проекта. Ниже пример<em>package.json</em>как он мог бы выглядеть для нашего проекта:</p>
25 <p>Свойство "main" указывает на файл<em>src/index.js</em>.</p>
25 <p>Свойство "main" указывает на файл<em>src/index.js</em>.</p>
26 <p>. ├── index.js ├── package.json └── src └── index.js</p>
26 <p>. ├── index.js ├── package.json └── src └── index.js</p>
27 <h2>Итог</h2>
27 <h2>Итог</h2>
28 <p>Мы познакомились с точками входа для приложений и библиотек. Разобрали, что для приложений точка входа является местом, где начинается выполнение кода, а для библиотек это модуль с экспортом сущностей и указанный в "main". Так же мы разобрали как можно расширить возможности проекта с помощью выделения логики в отдельную функцию, которая может быть переиспользована в других задачах. Все, что мы обсудили, тесно связано с проектированием проекта и позволит заложить фундамент хорошей архитектуры для сложных проектов.</p>
28 <p>Мы познакомились с точками входа для приложений и библиотек. Разобрали, что для приложений точка входа является местом, где начинается выполнение кода, а для библиотек это модуль с экспортом сущностей и указанный в "main". Так же мы разобрали как можно расширить возможности проекта с помощью выделения логики в отдельную функцию, которая может быть переиспользована в других задачах. Все, что мы обсудили, тесно связано с проектированием проекта и позволит заложить фундамент хорошей архитектуры для сложных проектов.</p>