Менеджер зависимостей NPM
Дмитрий Фитискин Нетология

Дмитрий Фитискин
руководитель направления «Программирование»
Пример использования сторонних библиотек
Задача
Получить курс валют и вывести в консоль курс Евро и Доллара США.
Простое решение
Решение с использованием модуля request
Но модуля request нет в ядре Node.js. Это сторонний модуль. Как нам его получить?
Установка request
Шаг 1: выполним команду в консоли:
Шаг 2: наше приложение готово к запуску:
Как мне кажется, польза и мощь пакетов очевидна.
Менеджер пакетов NPM

Система управления пакетами — набор программного обеспечения, позволяющего управлять процессом установки, удаления, настройки и обновления различных компонентов программного обеспечения. Системы управления пакетами активно используются в различных дистрибутивах операционной системы Linux и других UNIX-подобных операционных системах.
Зачем нужен менеджер пакетов?
- Позволяет использовать в вашем проекте различные библиотеки и плагины (зависимости)
- Позволяет легко устанавливать, обновлять, удалять зависимости
- Позволяет легко понять, какие зависимости используются в вашем проекте
- Позволяют автоматизировать рутинные задачи
Что умеет NPM?
- Поиск пакетов
- Просмотр информации о пакете
- Установка пакетов
- Удаление установленных пакетов
- Создание и публикация нового пакета
Команды NPM
Поиск пакетов в NPM
Также можно искать пакеты на npmjs.com
Просмотр информации о пакете
Команда show . Показывает информацию в JSON формате:
Установка пакетов
Есть несколько вариантов установки:
- Простая установка пакета
- Глобальная установка пакета в систему
- Установка пакета в качестве зависимости для вашего приложения
Простая установка пакета
Команда install или сокращенный вариант i
После этого в текущей директории появится новая директория node_modules , а в ней директория nodemon .
При установке пакетов в директории node_modules могут появляться не только директории установленных вами пакетов, но и их зависимостей. В случае nodemon в node_modules появится также директория chokidar , minimatch , undefsafe и другие.
Глобальная установка пакета
При этом пакет nodemon будет установлен не в текущую директорию, а в директорию для глобально установленных пакетов. Она одна для пользователя в системе.
Устанавливайте глобально только те пакеты, которые специально для этого созданы. Как правило, глобально устанавливаются пакеты, предоставляющие исполняемый файл (приложение для командной строки, например nodemon ).
Установка пакета в качестве зависимости
Установка с флагом —save или -S :
Для установки пакетов, которые необходимы только при разработке проекта, и не актуальны при использовании, можно подключить как зависимость для разработки с флагом —save-dev или -D :
Установка всех зависимостей
Команда install без дополнительных параметров устанавливает все зависимости:
Зависимости прописываются в файле package.json , который мы изучим далее.
Обновление ранее установленных зависимостей
Команда update позволяет установить более новые версии тех пакетов, которые прописаны как зависимости.
Обновление происходит с учетом ограничения по версиям, заданным в package.json .
Удаление установленных пакетов
Команда uninstall удаляет ранее установленный пакет:
Для того, чтобы удалить пакет и из зависимостей тоже, используйте ключи —save или —save-dev :
Описание проекта в package.json
Ошибка при установке пакета в качестве зависимости
Что такое package.json и для чего он нужен?
package.json
Если коротко, то package.json — это JSON-файл с «аннотацией» вашего проекта (название, версия, зависимости и многое другое). Его можно создать вручную или же воспользоваться командой:
Название проекта name
Уникальное имя вашего проекта, записанное в нижнем регистре. Это свойство — обязательное.
Это же свойство задаёт имя проекта в публичном каталоге, когда проект будет опубликован.
Версия проекта version
Записывается в формате MAJOR.MINOR.PATCH, части которого увеличиваются, когда в проекте появились изменения:
- MAJOR — не имеющие обратной совместимости с предыдущими версиями.
- MINOR — изменения с обратной совместимостью или новые функции.
- PATCH — обратно-совместимые исправления ошибок.
Основной файл проекта main
То, что вы обычно запускаете node server/app.js . Основная точка входа:
Подключив пакет require(‘my-cool-package’) , мы получим именно этот файл. Рекомендуется не делать побочных действий (например, запуск веб-сервера). Также, если в папке проекта запускать node . , то запустится именно этот файл.
Автор проекта author
Ваше имя и контактные данные:
NPM скрипты
Что такое npm-скрипт
Одним из параметров в файле package.json является параметр scripts . Этот параметр описывает команды, которые доступны при использовании вашего пакета.
Частью ядра NPM является команда npm run-script (или npm run ). Эта команда позволяет вызвать команды из scripts , прописанные в файле package.json .
Получаем список скриптов
Команда run без параметров выведет все доступные скрипты, описанные в package.json
Запускаем скрипт
Указав после команды run название скрипта из package.json :
Создадим свой скрипт
Добавим в файл package.json следующий фрагмент:
И вызовем наш новый скрипт hw :
Глобальная установка пакетов
- Некоторые пакеты предоставляют консольные утилиты для использования (например, nodemon ).
- Чтобы использовать эти утилиты в командной строке, необходимо установить эти пакеты глобально (с флагом -g ).
- Если же вы планируете их использовать как npm-скрипты, то глобальная установка не требуется.
Вызов npm скрипта из другого скрипта
Так как в качестве скрипта мы можем вызвать любую команду, доступную в консоли, то мы можем вызывать одни скрипты из других:
Как установить зависимости из package json
npm — это менеджер пакетов, который управляет модулями и зависимостями проекта. В Node.js npm уже имеется по умолчанию, поэтому его отдельная установка не требуется.
Все пакеты хранятся в облачном репозитории на официальном сайте. Вы также можете создать свой модуль и опубликовать его в репозитории для общего использования.
Прежде, чем начинать разрабатывать собственный модуль, попробуйте поискать его в npm репозитории. Наверняка уже будет существовать готовое решение, которое сэкономит ваше время.
Node.js npm также избавляет разработчика от необходимости хранить все используемые сторонние модули в удаленных репозиториях. За это отвечает файл package.json .
package.json¶
В npm файл package.json используется для описания модулей, от которых зависимо ваше приложение, и содержит ряд метаданных о приложении. Рассмотрим на примере. Предположим, у вас есть проект, корневая директория которого называется app . Перейдите в app через командную строку и введите команду.
Вам будет предложено ввести некоторые данные, на основе которых Node.js npm сгенерирует файл package.json . Структура файла:
- name — название приложения;
- version — версия;
- description — описание;
- main — главный файл приложения, который отвечает за его запуск (хорошей практикой считается давать название app.js или index.js );
- scripts — объект, описывающий команды, которые часто приходится выполнять в процессе разработки и упрощающий их использование;
- repository — ссылка на Git репозиторий, где хранится проект;
- keywords — массив ключевых слов, по которым будет осуществляться поиск модуля на сайте npm (если он будет там опубликован);
- author — разработчик;
- license — лицензия, под которой будет распространяться приложение.
Пример, как может выглядеть package.json .
Если вы не планируете публиковать свое приложение в общем репозитории npm, то заполнять все поля совсем не обязательно. Вполне будет достаточно для собственного удобства указать name , version и description .
Управление модулями npm¶
Модули — это приложения, которые реализовывают некоторый функционал и могут быть использованы для разработки более сложных приложений. Например, фреймворк Express является устанавливаемым модулем. Рассмотрим установку пакета на примере Express. Из корневой директории проекта необходимо выполнить команду.
Все модули устанавливаются в директорию node_modules той директории, откуда была вызвана команда npm install .
Флаг —save указывает на то, что мы хотим внести данный модуль в список зависимостей в файл package.json . И когда возникнет необходимость запустить приложение в другой среде, то совсем не обязательно также переносить и папку node_modules . Перенесите только файл package.json и выполните в командной строке.
И все указанные в package.json Node.js npm модули будут установлены в папку node_modules .
Если при установке пакета вы не хотите, чтобы он добавлялся в список зависимостей, то просто не указывайте флаг —save .
После установки модуля с —save в package.json появится объект dependencies со списком зависимостей вашего проекта.
Для задания установки определенной версии или версии из какого-либо диапазона, используйте оператор @ .
При указании диапазона версий задаваемое значение должно быть заключено в двойные кавычки.
Установка самой последней версии модуля может быть выполнена так.
В процессе разработки, например для тестирования или измерения показателей производительности, вам могут понадобиться Node.js npm модули, которые не будут использоваться и даже не должны устанавливаться в среде production . Чтобы установить npm модуль только для среды разработки, укажите флаг —save-dev .
Теперь в package.json должен появиться новый блок devDependencies .
Теперь рассмотрим глобальную установку пакетов. Допустим, на вашем сервере одновременно работают несколько разных Node.js приложений, но которые имеют общие зависимости. Чтобы не дублировать пакет в директории каждого проекта, вы можете установить его в вашу систему глобально с помощью флага -g и он будет доступен для использования во всей системе.
С течением времени Node.js npm модули дорабатываются и улучшаются, а следовательно выходят их новые версии. Чтобы обновить все пакеты, описанные в package.json , используйте такую команду.
Обновление конкретного модуля, например Express, выглядит так.
Для удаления пакет из зависимостей вашего проекта, используйте uninstall .
How to install npm packages?
Generate a package.json file — manually or automatically
![]()
This story was originally published here.
Installing dependencies is a core part of working with any Node.js project.
Installing dependencies
Before an application can run, you need to install all existing dependencies from the package.json file. You can also add new packages as dependencies or devDependencies.
Installing dependencies from package.json
The most common way to interact with the npm CLI is through installing packages with npm install <package> command from npmjs.com. When you check out a new project repository and try to start the application with npm start , you will likely get this error — Error: Cannot find module . This means, you forgot to install the project's dependencies.
To install a project’s dependencies, navigate in the root folder of the application, and run:
You’ll see a progress bar as npm begins downloading the dependencies, and a node_modules/ folder will be created in the project's root directory. A package-lock.json file will also be created, if none existed in the project already. Check out the article — What is package-lock.json, if you are not familiar with this file.
Basically running npm install (with no arguments) reads the list of dependencies from the package.json with the applicable package versions and version locks( package-lock.json ), downloads the dependencies, and puts them into the node_modules/ folder. Once the dependencies are added into the node_modules folder, they are found by the application.
Most npm commands have an alias, so you don’t have to type the entire command. Just type npm i and npm install will be executed.
Installing new dependencies
The command npm install can also be used to add new dependencies. You can find packages on npmjs.com. Just run npm install <package-name> to add the new dependency. For example, to install the popular Express server framework as a dependency:
After running the command npm install express , you will see a progress bar as npm fetches the package. The package will be downloaded from NPM, installed to your node_modules/ folder, and added to the dependencies in package.json . The package-lock.json file also updated, which will happen whenever you add or update dependencies. If express is added to a fresh package.json, after npm init , the package.json might look like this:
Install new devDependency
When installing a package we can choose to record it in the package.json as an entry to dependencies or devDependencies. You can learn more about the difference between dependencies and devDependencies in the article — what is package.json. To sum up, dependencies are used during production, and devDependencies are used only in development or during a build step.
By default, npm install adds the package as an entry to dependencies , when the flag —save-dev , or it's alias -D , is added, the package will be installed as a devDependency . ESLint would be a typical devDependency.
After running this command, an entry should be added to devDependencies in the package.json:
You can also install packages globally. This will be covered in a separate article, since there can be errors, like EACCES , and npx is a great addition to run an arbitrary command from an NPM package. Maybe you don't need to install a package globally, since it can only be used with one installed Node.js version (another Node.js version, would require a new global install).
- Installing dependencies is a core part of working with any Node.js project.
- Install the project dependencies listed in the package.json with npm install .
- Some NPM cli commands have an alias ( npm i for npm install ).
- Install a new dependency with npm install <package> .
- Install a new devDependency by passing the flag —save-dev , like npm install <package> —save-dev .
Thanks for reading and if you have any questions, use the comment function or send me a message @mariokandut.
If you want to know more about Node, have a look at these Node Tutorials.
Руководство по Node.js, часть 4: npm, файлы package.json и package-lock.json
Сегодня мы публикуем четвёртую часть перевода руководства по Node.js. В этом материале мы начнём разговор об npm а также рассмотрим особенности файлов package.json и package-lock.json .

Основы npm
Npm (node package manager) — это менеджер пакетов Node.js. В первой части этого материала мы уже упоминали о том, что сейчас в npm имеется более полумиллиона пакетов, что делает его самым большим в мире репозиторием кода, написанного на одном языке. Это позволяет говорить о том, что в npm можно найти пакеты, предназначенные для решения практически любых задач.
Изначально npm создавался как система управления пакетами для Node.js, но в наши дни он используется и при разработке фронтенд-проектов на JavaScript. Для взаимодействия с реестром npm используется одноимённая команда, которая даёт разработчику огромное количество возможностей.
▍Загрузка пакетов
С помощью команды npm можно загружать пакеты из реестра. Ниже мы рассмотрим примеры её использования.
▍Установка всех зависимостей проекта
Если в проекте имеется файл package.json , то установить все зависимости этого проекта можно такой командой:
Эта команда загрузит всё, что нужно проекту, и поместит эти материалы в папку node_modules , создав её в том случае, если она не существует в директории проекта.
▍Установка отдельного пакета
Отдельный можно установить следующей командой:
Часто можно видеть, как эту команду используют не в таком вот простом виде, а с некоторыми флагами. Рассмотрим их:
- Флаг —save позволяет установить пакет и добавить запись о нём в раздел dependencies файла package.json , который описывает зависимости проекта. Эти зависимости используются проектом для реализации его основного функционала, они устанавливаются в ходе его развёртывания на сервере (после выхода npm 5 записи об устанавливаемых пакетах в разделе зависимостей делаются автоматически, и без использования этого флага).
- Флаг —save-dev позволяет установить пакет и добавить запись о нём в раздел, содержащий перечень зависимостей разработки (то есть — пакетов, которые нужны в ходе разработки проекта, вроде библиотек для тестирования, но не требуются для его работы) файла package.json , который называется devDependencies .
▍Обновление пакетов
Для обновления пакетов служит следующая команда:
Получив эту команду, npm проверит все пакеты на наличие их новых версий, и, если найдёт их новые версии, соответствующие ограничениям на версии пакетов, заданным в package.json , установит их.
Обновить можно и отдельный пакет:
▍Загрузка пакетов определённых версий
В дополнение к стандартной загрузке пакетов, npm поддерживает и загрузку их определённых версий. В частности, можно заметить, что некоторые библиотеки совместимы лишь с некими крупными релизами других библиотек, то есть, если бы зависимости таких библиотек устанавливались бы без учёта версий, это могло бы нарушить их работу. Возможность установить определённую версию некоего пакета полезна и в ситуациях, когда, например, вам вполне подходит самый свежий релиз этого пакета, но оказывается, что в нём имеется ошибка. Ожидая выхода исправленной версии пакета, можно воспользоваться и его более старым но стабильным релизом.
Возможность задавать конкретные версии необходимых проекту библиотек полезна в командной разработке, когда все члены команды пользуются в точности одними и теми же библиотеками. Переход на их новые версии так же осуществляется централизованно, путём внесения изменений в файл проекта package.json .
Во всех этих случаях возможность указания версий пакетов, необходимых проекту, чрезвычайно полезна. Npm следует стандарту семантического версионирования (semver).
▍Запуск скриптов
Файл package.json поддерживает возможность описания команд (скриптов), запускать которые можно с помощью такой конструкции:
Например, вот как выглядят перечень скриптов, имеющийся в соответствующем разделе файла:
Весьма распространено использование этой возможности для запуска Webpack:
Такой подход даёт возможность заменить ввод длинных команд, чреватый ошибками, следующими простыми конструкциями:
▍Куда npm устанавливает пакеты?
При установке пакетов с использованием npm (или yarn) доступны два варианта установки: локальная и глобальная.
По умолчанию, когда для установки пакета используют команду наподобие npm install lodash , пакет оказывается в папке node_modules , расположенной в папке проекта. Кроме того, если была выполнена вышеописанная команда, npm также добавит запись о библиотеке lodash в раздел dependencies файла package.json , который имеется в текущей директории.
Глобальная установка пакетов выполняется с использованием флага -g :
Выполняя такую команду, npm не устанавливает пакет в локальную папку проекта. Вместо этого он копирует файлы пакета в некое глобальное расположение. Куда именно попадают эти файлы?
Для того чтобы это узнать, воспользуйтесь следующей командой:
В macOS или Linux файлы пакетов могут оказаться в директории /usr/local/lib/node_modules . В Windows это может быть нечто вроде C:\Users\YOU\AppData\Roaming\npm\node_modules .
Однако если вы используете для управления версиями Node.js nvm, путь к папке с глобальными пакетами может измениться.
Я, например, использую nvm, и вышеописанная команда сообщает мне о том, что глобальные пакеты устанавливаются по такому адресу: /Users/flavio/.nvm/versions/node/v8.9.0/lib/node_modules .
▍Использование и выполнение пакетов, установленных с помощью npm
Как использовать модули, установленные с помощью npm, локально или глобально, попадающие в папки node_modules ? Предположим, вы установили популярную библиотеку lodash , содержащую множество вспомогательных функций, используемых в JavaScript-разработке:
Такая команда установит библиотеку в локальную папку проекта node_modules .
Для того чтобы использовать её в своём коде, достаточно импортировать её с применением команды require :
Как быть, если пакет представляет собой исполняемый файл?
В таком случае исполняемый файл попадёт в папку node_modules/.bin/ folder .
Посмотреть на то, как выглядит работа этого механизма можно, установив пакет cowsay. Он представляет собой шуточную программу, написанную для командной строки. Если передать этому пакету какой-нибудь текст, в консоли, в стиле ASCII-арта, будет выведено изображение коровы, которая «произносит» соответствующий текст. «Озвучивать» текст могут и другие существа.
Итак, после установки пакета с использованием команды npm install cowsay , он, вместе со своими зависимостями, попадёт в node_modules . А в скрытую папку .bin будут записаны символические ссылки на бинарные файлы cowsay.
Как их выполнять?
Конечно, можно, для вызова программы, ввести в терминале нечто вроде ./node_modules/.bin/cowsay , это рабочий подход, но гораздо лучше воспользоваться npx, средством для запуска исполняемых файлов npm-пакетов, включаемым в npm начиная с версии 5.2. А именно, в нашем случае понадобится такая команда:
Путь к пакету npx найдёт автоматически.
Файл package.json
Файл package.json является важнейшим элементов множества проектов, основанных на экосистеме Node.js. Если вы программировали на JavaScript, была ли это серверная или клиентская разработка, то вы, наверняка, уже встречались с этим файлом. Зачем он нужен? Что вам следует о нём знать и какие возможности он вам даёт?
Package.json представляет собой нечто вроде файла-манифеста для проекта. Он даёт в распоряжение разработчика множество разноплановых возможностей. Например, он представляет собой центральный репозиторий настроек для инструментальных средств, используемых в проекте. Кроме того, он является тем местом, куда npm и yarn записывают сведения об именах и версиях установленных пакетов.
▍Структура файла
Вот пример простейшего файла package.json :
Как видите, он пуст. Нет жёстких требований, касающихся того, что должно присутствовать в подобном файле для некоего приложения. Единственное требование к структуре файла заключается в том, что она должна следовать правилам формата JSON. В противном случае этот файл не сможет быть прочитан программами, которые попытаются получить доступ к его содержимому.
Если вы создаёте Node.js-пакет, который собираетесь распространять через npm, то всё радикальным образом меняется, и в вашем package.json должен быть набор свойств, которые помогут другим людям пользоваться пакетом. Подробнее мы поговорим об этом позже.
Вот ещё один пример package.json :
В нём задано свойство name , значением которого является имя приложения или пакета, материалы которого содержатся в той же папке, где находится этот файл.
Вот пример посложнее, который я взял из приложения-примера, написанного с использованием Vue.js:
Как видите, тут прямо-таки немеряно всего интересного. А именно, здесь можно выделить следующие свойства:
- name — задаёт имя приложения (пакета).
- version — содержит сведения о текущей версии приложения.
- description — краткое описание приложения.
- main — задаёт точку входа в приложение.
- private — если данное свойство установлено в true , это позволяет предотвратить случайную публикацию пакета в npm.
- scripts — задаёт набор Node.js-скриптов, которые можно запускать.
- dependencies — содержит список npm-пакетов, от которых зависит приложение.
- devDependencies — содержит список npm-пакетов, используемых при разработке проекта, но не при его реальной работе.
- engines — задаёт список версий Node.js, на которых работает приложение.
- browserlist — используется для хранения списка браузеров (и их версий), которые должно поддерживать приложение.
▍Свойства, используемые в package.json
Поговорим о свойствах, которые можно использовать в package.json . Здесь мы будем использовать термин «пакет», но всё, что сказано о пакетах, справедливо и для локальных приложений, которые не планируется использовать в роли пакетов.
Большинство свойств, которые мы опишем, используются лишь для нужд репозитория npm, некоторые используются программами, которые взаимодействуют с кодом, вроде того же npm.
Свойство name
Свойство name задаёт имя пакета:
Имя должно быть короче 214 символов, не должно включать в себя пробелы, должно состоять только из прописных букв, дефисов ( — ) и символов подчёркивания ( _ ).
Подобные ограничения существуют из-за того, что когда пакет публикуется в npm, его имя используется для формирования URL страницы пакета.
Если вы публиковали код пакета на GitHub, в общем доступе, то хорошим вариантом имени пакета является имя соответствующего GitHub-репозитория.
Свойство author
Свойство author содержит сведения об авторе пакета:
Оно может быть представлено и в таком формате:
Свойство contributors
Свойство contributors содержит массив со сведениями о людях, внёсших вклад в проект:
Это свойство может выглядеть и так:
Свойство bugs
В свойстве bugs содержится ссылка на баг-трекер проекта, весьма вероятно то, что такая ссылка будет вести на страницу системы отслеживания ошибок GitHub:
Свойство homepage
Свойство homepage позволяет задать домашнюю страницу пакета:
Свойство version
Свойство version содержит сведения о текущей версии пакета:
При формировании значения этого свойства нужно следовать правилам семантического версионирования. Это означает, в частности, что номер версии всегда представлен тремя цифрами: x.x.x.
Первое число — это мажорная версия пакета, второе — минорная версия, третье — патч-версия.
Изменение этих чисел несёт в себе определённый смысл. Так, релиз пакета, в котором лишь исправляются ошибки, приводит к увеличению значения патч-версии. Если выходит релиз пакета, изменения, внесённые в который, отличаются обратной совместимостью с предыдущим релизом — то меняется минорная версия. В мажорных версиях пакетов могут присутствовать изменения, которые делают эти пакеты несовместимыми с пакетами предыдущих мажорных версий.
Свойство license
Свойство license содержит сведения о лицензии пакета:
Свойство keywords
Свойство keywords содержит массив ключевых слов, имеющих отношение к функционалу пакета:
Правильный подбор ключевых слов помогает людям находить то, что им нужно, при поиске пакетов для решения неких задач, позволяет группировать пакеты и быстро оценивать их возможный функционал при просмотре сайта npm.
Свойство description
Свойство description содержит краткое описание пакета:
Это свойство особенно важно в том случае, если вы планируете публиковать пакет в npm, так как оно позволяет пользователям сайта npm понять предназначение пакета.
Свойство repository
Свойство repository указывает на то, где находится репозиторий пакета:
Обратите внимание, что у значения этого свойства имеется префикс github . Npm поддерживает префиксы и для некоторых других популярных сервисов подобного рода:
Используемую при разработке пакета систему контроля версий можно задать и в явном виде:
Один и тот же пакет может использовать разные системы контроля версий:
Свойство main
Свойство main задаёт точку входа в пакет:
Когда пакет импортируют в приложение, именно здесь будет осуществляться поиск того, что экспортирует соответствующий модуль.
Свойство private
Свойство private , установленное в true , позволяет предотвратить случайную публикацию пакета в npm:
Свойство scripts
Свойство scripts задаёт список скриптов или утилит, которые можно запускать средствами npm:
Эти скрипты являются приложениями командной строки. Запускать их можно с помощью npm или yarn, выполняя, соответственно, команды вида npm run XXXX или yarn XXXX , где XXXX — имя скрипта. Например, выглядеть это может так:
Скрипты можно называть так, как вам хочется, делать они могут практически всё, чего может пожелать разработчик.
Свойство dependencies
Свойство dependencies содержит список npm-пакетов, установленных в виде зависимостей пакета:
При установке пакета с использованиеме npm или yarn используются команды такого вида:
Эти пакеты автоматически добавляются в список зависимостей разрабатываемого пакета.
Свойство devDependencies
Свойство devDependencies содержит список npm-пакетов, установленных как зависимости разработки:
Этот список отличается от того, который хранится в свойстве dependencies , так как имеющиеся в нём пакеты устанавливаются лишь в системе разработчика пакета, при практическом использовании пакета они не применяются.
Пакеты попадают в этот список при их установке с помощью npm или yarn, выполняемой следующим образом:
Свойство engines
Свойство engines указывает, какие версии Node.js и других программных продуктов используются для обеспечения работы пакета:
Свойство browserlist
Свойство browserlist позволяет сообщить о том, какие браузеры (и их версии) собирается поддерживать разработчик пакета:
Этим свойством пользуются Babel, Autoprefixer и другие инструменты. Анализ этого списка позволяет им добавлять в пакет только те полифиллы и вспомогательные механизмы, которые нужны для перечисленных браузеров.
Показанное здесь в качестве примера значение свойства browserlist означает, что вы хотите поддерживать как минимум 2 мажорные версии всех браузеров с как минимум 1% использования (эти данные берутся с ресурса CanIUse.com), за исключением IE 8 и более старых версий этого браузера (подробнее об этом можно узнать на странице пакета browserlists).
▍Хранение в package.json настроек для различных программных инструментов
В package.json можно хранить настройки для различных вспомогательных инструментов вроде Babel или ESLint.
Каждому из таких инструментов соответствует особое свойство, наподобие eslintConfig или babel . Подробности об использовании подобных свойств можно найти в документации соответствующих проектов.
▍О версиях пакетов и семантическом версионировании
3.0.0 или ^0.13.0 . Здесь использованы так называемые спецификаторы версий, которые определяют диапазон версий пакетов, подходящих для использования в нашем пакете.
Учитывая то, что при использовании семантического версионирования все номера версий пакетов состоят из последовательностей, представляющих собой три числа, о смысле которых мы говорили выше, опишем следующие правила использования спецификаторов версий:
: если вы задаёте версию в виде
- отсутствие дополнительных символов: если используется номер версии пакета без дополнительных символов, это значит, что вашему пакету нужна только заданная версия пакета-зависимости и никакая другая.
- latest : указывает на то, что вам требуется самая свежая версия некоего пакета.
Файл package-lock.json
Файл package-lock.json используется с момента появления npm версии 5. Он создаётся автоматически при установке Node.js-пакетов. Что это за файл? Возможно, вы не знакомы с ним даже если знали о package.json , который существует гораздо дольше него.
Цель этого файла заключается в отслеживании точных версий установленных пакетов, что позволяет сделать разрабатываемый продукт стопроцентно воспроизводимым в его исходном виде даже в случае, если те, кто занимается поддержкой пакетов, их обновили.
Этот файл решает весьма специфическую проблему, которая не решается средствами package.json . В package.json можно указать, какие обновления некоего пакета вам подходят (патч-версии или минорные версии) с использованием вышеописанных спецификаторов версий.
В Git не коммитят папку node_modules , так как обычно она имеет огромные размеры. Когда вы пытаетесь воссоздать проект на другом компьютере, то использование команды npm install приведёт к тому, что, если, при использовании спецификатора
в применении к версии некоего пакета, вышел его патч-релиз, установлен будет не тот пакет, который использовался при разработке, а именно этот патч-релиз.
То же самое касается и спецификатора ^ . Если же при указании версии пакета спецификаторы не использовались, то будет установлена именно его указанная версия и проблема, о которой идёт речь, окажется в такой ситуации неактуальной.
Итак, кто-то пытается инициализировать проект, пользуясь командой npm install . При выходе новых версий пакетов окажется, что этот проект отличается от исходного. Даже если, следуя правилам семантического версионирования, минорные релизы и патч-релизы не должны содержать в себе изменений, препятствующих обратной совместимости, все мы знаем, что ошибки способны проникать (и проникают) куда угодно.
Файл package-lock.json хранит в неизменном виде сведения о версии каждого установленного пакета и npm будет использовать именно эти версии пакетов при выполнении команды npm install .
Эта концепция не нова, менеджеры пакетов, применяемые в других языках программирования (вроде менеджера Composer в PHP) используют похожую систему многие годы.
Файл package-lock.json нужно отправить в Git-репозиторий, что позволит другим людям скачать его в том случае, если проект является общедоступным, или тогда, когда его разработкой занимается команда программистов, или если вы используете Git для развёртывания проекта.
Версии зависимостей будут обновлены в package-lock.json после выполнения команды npm update .
▍Пример файла package-lock.json
В этом примере продемонстрирована структура файла package-lock.json , который входит в состав пакет cowsay, устанавливаемого в пустой папке командой npm install cowsay :
Сегодня мы начали разговор об npm и разобрались со структурой и назначением файлов package.json и package-lock.json . В следующий раз продолжим разбирать возможности npm и коснёмся использования npx.
Уважаемые читатели! Какой менеджер пакетов вы предпочитаете — npm или yarn?