HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>JavaScript, как и любой другой язык, содержит внутри себя много готовых функций и модулей, облегчающих разработку. Все вместе они составляют<strong>стандартную библиотеку языка</strong>. В Node.js, например, это модули для работы с криптографией (шифрование), HTTP, файловой системой и многим другим. В браузере этот набор значительно меньше, но тоже присутствует.</p>
1 <p>JavaScript, как и любой другой язык, содержит внутри себя много готовых функций и модулей, облегчающих разработку. Все вместе они составляют<strong>стандартную библиотеку языка</strong>. В Node.js, например, это модули для работы с криптографией (шифрование), HTTP, файловой системой и многим другим. В браузере этот набор значительно меньше, но тоже присутствует.</p>
2 <p>Какой бы хорошей ни была стандартная библиотека, она не может покрыть все задачи, возникающие во время разработки. Конечно, можно все недостающие компоненты реализовывать самостоятельно, но тогда разработка любого проекта превратится в бесконечный марафон. Слишком много типовых задач нужно решить в любом нетривиальном проекте.</p>
2 <p>Какой бы хорошей ни была стандартная библиотека, она не может покрыть все задачи, возникающие во время разработки. Конечно, можно все недостающие компоненты реализовывать самостоятельно, но тогда разработка любого проекта превратится в бесконечный марафон. Слишком много типовых задач нужно решить в любом нетривиальном проекте.</p>
3 <p>В коммерческих проектах используются миллионы строк стороннего кода, написанные программистами по всему миру. Подобный код хранится в библиотеках, доступных для установки в проект. В JavaScript-мире их принято называть<strong>пакетами</strong>.</p>
3 <p>В коммерческих проектах используются миллионы строк стороннего кода, написанные программистами по всему миру. Подобный код хранится в библиотеках, доступных для установки в проект. В JavaScript-мире их принято называть<strong>пакетами</strong>.</p>
4 <p>Какие задачи решают подобные пакеты? Совершенно разные. От небольших полезных функций для работы со строками или<a>датами</a>, до фреймворков, программных систем, формирующих архитектуру кода. Например, в JavaScript невероятно популярна библиотека<a>lodash</a>. Она предоставляет около сотни полезных функций, решающих типовые задачи по работе с массивами, строками и другими типами данных. Пара примеров:</p>
4 <p>Какие задачи решают подобные пакеты? Совершенно разные. От небольших полезных функций для работы со строками или<a>датами</a>, до фреймворков, программных систем, формирующих архитектуру кода. Например, в JavaScript невероятно популярна библиотека<a>lodash</a>. Она предоставляет около сотни полезных функций, решающих типовые задачи по работе с массивами, строками и другими типами данных. Пара примеров:</p>
5 <p>Каждая из этих функций по отдельности может выглядеть небольшой. Однако чем больше проект, тем больше требуется подобных функций, и все вместе они превращаются в довольно большую кодовую базу. А ведь еще хотелось бы иметь хорошую документацию.</p>
5 <p>Каждая из этих функций по отдельности может выглядеть небольшой. Однако чем больше проект, тем больше требуется подобных функций, и все вместе они превращаются в довольно большую кодовую базу. А ведь еще хотелось бы иметь хорошую документацию.</p>
6 <p>Обратите внимание на то, как происходит импорт кода из внешних библиотек. В этом случае имя пакета указывается без указания пути ./. Так JavaScript понимает, что это именно пакет и не нужно искать файл с именем<em>lodash.js</em>.</p>
6 <p>Обратите внимание на то, как происходит импорт кода из внешних библиотек. В этом случае имя пакета указывается без указания пути ./. Так JavaScript понимает, что это именно пакет и не нужно искать файл с именем<em>lodash.js</em>.</p>
7 <h2>Установка</h2>
7 <h2>Установка</h2>
8 - <p>Если просто импортировать<em>lodash</em>в коде и затем запустить код на выполнение, то программа упадет с ошибкой: "lodash не найден". Для того чтобы воспользоваться сторонним пакетом, его нужно добавить в проект как<strong>зависимость</strong>. Так говорят потому, что код проекта теперь зависит от этих библиотек. Для этого в<em>npm</em>предусмотрена команда установки:</p>
8 + <p>Если просто импортировать<em>lodash</em>в коде и затем запустить код на выполнение, то программа упадет с ошибкой: "lodash не найден". Для того чтобы воспользоваться сторонним пакетом, его нужно добавить в проект как<strong>зависимость</strong>. Так говорят потому, что код проекта теперь зависит от этих библиотек. Для этого в<em>npm</em>педусмотрена команда установки:</p>
9 <p>Эта команда выполняет три действия. Сначала она скачивает пакет из NPM-хранилища в директорию<em>node_modules</em>в корне проекта. Если этой директории не было, то она автоматически создается. Затем она добавляет запись в<em>package.json</em>о том, что пакет<em>lodash</em>стал зависимостью. И наконец, создает или обновляет файл<em>package-lock.json</em>.</p>
9 <p>Эта команда выполняет три действия. Сначала она скачивает пакет из NPM-хранилища в директорию<em>node_modules</em>в корне проекта. Если этой директории не было, то она автоматически создается. Затем она добавляет запись в<em>package.json</em>о том, что пакет<em>lodash</em>стал зависимостью. И наконец, создает или обновляет файл<em>package-lock.json</em>.</p>
10 <p>Зависимости в<em>package.json</em>добавляются под ключом dependencies. Здесь указаны все пакеты, используемые в проекте и не входящие в стандартную библиотеку.</p>
10 <p>Зависимости в<em>package.json</em>добавляются под ключом dependencies. Здесь указаны все пакеты, используемые в проекте и не входящие в стандартную библиотеку.</p>
11 <p>В качестве ключа в зависимостях указывается имя пакета. Именно это имя используется при импорте пакета. Значением является последняя доступная версия на момент скачивания.</p>
11 <p>В качестве ключа в зависимостях указывается имя пакета. Именно это имя используется при импорте пакета. Значением является последняя доступная версия на момент скачивания.</p>
12 <p>Теперь, когда Node.js встречает подобный импорт:</p>
12 <p>Теперь, когда Node.js встречает подобный импорт:</p>
13 <p>Происходит попытка импортировать модуль из<em>node_modules/react/...</em></p>
13 <p>Происходит попытка импортировать модуль из<em>node_modules/react/...</em></p>
14 <p>Осталось разобраться с файлом<em>package-lock.json</em>. Мы расскажем о его предназначении позже в курсе, а сейчас опишем его общую концепцию.</p>
14 <p>Осталось разобраться с файлом<em>package-lock.json</em>. Мы расскажем о его предназначении позже в курсе, а сейчас опишем его общую концепцию.</p>
15 <p>Если кратко, то у зависимостей нашего проекта есть свои зависимости, а у них, в свою очередь, свои зависимости (зависимости зависимостей называются транзитивными зависимостями). Подобная цепочка может быть довольно длинной и на разных ее участках возможно появление одних и тех же пакетов, но разных версий.<em>package-lock.json</em>содержит описание<strong>всех пакетов</strong>, которые будут поставлены, включая все их зависимости с указанием конкретных версий. Это позволяет получать гарантированно одни и те же версии зависимостей для всех разработчиков проекта. Этот файл создается командой npm install и потом используется при установке зависимостей. При наличии<em>package-lock.json</em>в проекте, установку зависимостей рекомендуется выполнять командой npm ci</p>
15 <p>Если кратко, то у зависимостей нашего проекта есть свои зависимости, а у них, в свою очередь, свои зависимости (зависимости зависимостей называются транзитивными зависимостями). Подобная цепочка может быть довольно длинной и на разных ее участках возможно появление одних и тех же пакетов, но разных версий.<em>package-lock.json</em>содержит описание<strong>всех пакетов</strong>, которые будут поставлены, включая все их зависимости с указанием конкретных версий. Это позволяет получать гарантированно одни и те же версии зависимостей для всех разработчиков проекта. Этот файл создается командой npm install и потом используется при установке зависимостей. При наличии<em>package-lock.json</em>в проекте, установку зависимостей рекомендуется выполнять командой npm ci</p>
16 <h2>Связь с GIT</h2>
16 <h2>Связь с GIT</h2>
17 <p>Программисты не так часто делают проекты "с нуля". Чаще всего они работают с готовыми проектами. Проекты же, в свою очередь, хранятся в git-репозиториях. Что нужно хранить в репозитории, а что нет, когда мы говорим о зависимостях?</p>
17 <p>Программисты не так часто делают проекты "с нуля". Чаще всего они работают с готовыми проектами. Проекты же, в свою очередь, хранятся в git-репозиториях. Что нужно хранить в репозитории, а что нет, когда мы говорим о зависимостях?</p>
18 <p>Код самих зависимостей не является частью исходного кода. Его всегда добавляют в<em>.gitignore</em>. А вот файлы<em>package.json</em>и<em>package-lock.json</em>являются частью исходного кода и именно через них Node.js узнает о том, какие пакеты нужно поставить в систему.</p>
18 <p>Код самих зависимостей не является частью исходного кода. Его всегда добавляют в<em>.gitignore</em>. А вот файлы<em>package.json</em>и<em>package-lock.json</em>являются частью исходного кода и именно через них Node.js узнает о том, какие пакеты нужно поставить в систему.</p>
19 <p>Представьте, что вы клонируете готовый проект с гитхаба на свой компьютер и сразу пробуете запустить. Он упадет с ошибкой, так как код самих зависимостей в<em>node_modules</em>(как и сама директория) отсутствует. Чтобы он там появился, нужно запустить команду установки уже добавленных зависимостей:</p>
19 <p>Представьте, что вы клонируете готовый проект с гитхаба на свой компьютер и сразу пробуете запустить. Он упадет с ошибкой, так как код самих зависимостей в<em>node_modules</em>(как и сама директория) отсутствует. Чтобы он там появился, нужно запустить команду установки уже добавленных зависимостей:</p>
20 <p>Эта команда ничего не меняет в проекте. Она только лишь скачивает зависимости в директорию<em>node_modules</em>, базируясь на содержимом<em>package.json</em>и версиях из<em>package-lock.json</em>.</p>
20 <p>Эта команда ничего не меняет в проекте. Она только лишь скачивает зависимости в директорию<em>node_modules</em>, базируясь на содержимом<em>package.json</em>и версиях из<em>package-lock.json</em>.</p>
21 <h2>Предупреждения</h2>
21 <h2>Предупреждения</h2>
22 <p>Во время установки зависимостей<em>npm</em>выводит много разных сообщений. Среди них встречаются такие:</p>
22 <p>Во время установки зависимостей<em>npm</em>выводит много разных сообщений. Среди них встречаются такие:</p>
23 <p>Большинство подобных сообщений не влияют на работу приложения. Они лишь говорят о том что какие-то версии устарели или пакет больше не используется.</p>
23 <p>Большинство подобных сообщений не влияют на работу приложения. Они лишь говорят о том что какие-то версии устарели или пакет больше не используется.</p>