- Что такое npm? Гайд по Node Package Manager для начинающих
- 1. Что такое npm?
- 1.1. Файл package.json
- 1.2. Скрипты npm
- 1.3. dependencies и devDependencies
- 1.4. Файл package-lock.json
- 2. Установка пакетов
- 2.1. npm install
- 2.2. npm ci
- 2.3. npm audit
- 3. Размещение пакетов
- 3.1. npm publish
- Заключение
- Использование NPM
- Node Hero: Глава 2
- NPM в двух словах
- Вебсайт
- Интерфейс командной строки
- Использование NPM: Учебное пособие
- Добавление зависимостей
- Добавление зависимостей для разработки
- NPM-скрипты
- Ограничение области видимости и приватные пакеты
- NPM. Package.json. Установка модулей. Определение команд¶
- Файл package.json¶
- devDependencies¶
- Удаление пакетов¶
- Семантическое версионирование¶
- Команды npm¶
Что такое npm? Гайд по Node Package Manager для начинающих
Как установить, опубликовать и проверить JavaScript-пакеты на уязвимость с помощью npm – менеджера пакетов Node.js, рассказал сайт proglib.io в своем переводе статьи «What is npm? A Node Package Manager Tutorial for Beginners».
Программная платформа Node.js появилась в 2009 г., и с тех пор на ней были построены сотни тысяч приложений. Одной из причин успеха стал npm – популярный пакетный менеджер, позволяющий JS-разработчикам быстро делиться пакетами.
На момент написания статьи в npm содержится 1.3 млн пакетов с общим количеством скачиваний 16 млрд.
1. Что такое npm?
npm (Node Package Manager) – дефолтный пакетный менеджер для JavaScript, работающий на Node.js. Менеджер npm состоит из двух частей:
- CLI (интерфейс командной строки) – средство для размещения и скачивания пакетов,
- онлайн-репозитории, содержащие JS пакеты.
Структуру репозитория npmjs.com можно представить, как центр исполнения заказов, который получает товары (npm-пакеты) от продавцов (авторы пакетов) и распространяет эти товары среди покупателей (пользователи пакетов).
В центре исполнения заказов (npmjs.com) в качестве персональных менеджеров для каждого покупателя работает армия вомбатов ( npm CLI ).
Зависимости поставляются следующим образом (Рис. 1).
Процесс размещения пакета выглядит, как показано на Рис. 2.
Теперь детально рассмотрим работу вомбатов.
1.1. Файл package.json
Каждый проект в JavaScript – будь то Node.js или веб-приложение – может быть скопирован? как npm-пакет с собственным описанием и файлом package.json .
package.json можно представить, как стикеры (список пакетов нужных версий) на npm-коробке (проект). Файл генерируется командой npm init при создании JavaScript/Node.js проекта со следующими метаданными:
- name : название JS библиотеки/проекта.
- version : версия проекта.
- description : описание проекта.
- license : лицензия проекта.
1.2. Скрипты npm
В package.json включено поле scripts для автоматизации сборки, например:
eslint , prettier , ncc , jest могут быть установлены глобально или локально для проекта внутри node_modules/.bin/ .
1.3. dependencies и devDependencies
dependencies и devdependencies представляют собой словари с именами npm-библиотек (ключ) и их семантические версии (значение). Пример из шаблона TypeScript Action:
Эти зависимости устанавливаются командной npm install с флагами —save и —save-dev . Они предназначены соответственно для использования в продакшене и разработке.
- ^ : последний минорный релиз. Например, ^1.0.4 установит версию 1.3.0 , если это последний минорный релиз в серии 1 мажорного релиза.
1.0.4 установит 1.0.7 , если эта последняя минорная версия в серии минорных релизов 1.0 .
Все версии пакетов будут отображены в сгенерированном файле package-lock.json .
1.4. Файл package-lock.json
Файл package-lock.json описывает версии пакетов, используемые в JavaScript-проекте. Если package.json включает общее описание зависимостей (название товара), то package-lock.json более детальный – всё дерево зависимостей.
package-lock.json генерируется командой npm install и читается npm CLI, чтобы обеспечить воспроизведение окружения для проекта через npm ci .
2. Установка пакетов
Так как пользователи чаще скачивают пакеты (16 млрд скачиваний против 13 млн публикаций), хорошо бы разобраться, как их устанавливать.
2.1. npm install
npm install – команда, устанавливающая пакеты.
По умолчанию npm install
со знаком ^ установит последнюю версию пакета. npm install скачает пакет в папку проекта node_modules в соответствии с конфигурацией в файле package.json , обновив версию пакета везде, где это возможно (и, в свою очередь, обновив package-lock.json ). При необходимости установки пакета глобально можно указать флаг -g .
npm сделал установку пакетов JavaScript настолько простой, что команда часто используется некорректно и в сообществе разрабов появились мемы на эту тему:
При добавлении флага —production установятся только нужные для работы приложения зависимости из dependencies , не раздувая node_modules .
2.2. npm ci
Если npm install —production оптимален для продакшена, существует ли аналогичная команда для локальной разработки? Да, она называется npm ci .
Как и раньше, если package-lock.json еще не существует в проекте, он будет сгенерирован при вызове npm install . npm ci обращается к Lock-файлу для загрузки точной версии пакетов. Таким образом, на разных машинах набор пакетов останется неизменным.
2.3. npm audit
Чтобы избежать добавления в репозитории вредоносных пакетов, организация npm.js пришла к идее аудита экосистемы, создав модуль npm audit . Он предоставляет информацию об уязвимостях в пакетах и о существовании версий с исправлениями.
Если исправления доступны в следующих версиях пакета, npm audit fix автоматически обновит версии затронутых зависимостей.
3. Размещение пакетов
Перейдем от потребления пакетов к их размещению.
3.1. npm publish
Отправить пакет в npmjs.com очень просто – нужно набрать в консоли npm publish . Важная часть, которой пренебрегают авторы – версионирование. Вот набор эмпирические правил semver.org, указывающих, когда следует увеличить номер версии:
- Мажорная версия: когда сделаны обратно несовместимые изменения API.
- Минорная версия: когда вы добавляете новую функциональность, не нарушая обратной совместимости.
- Патч-версия: когда вы делаете обратно совместимые исправления.
Еще более важно следовать вышеуказанным правилам при публикации собственных пакетов, чтобы гарантировать, что вы не нарушаете чью-либо совместимость, так как по умолчанию в npm берется версия ^ (следующая младшая версия).
Заключение
В этой публикации мы познакомились со структурой npm и узнали:
Источник
Использование NPM
Node Hero: Глава 2
Перевод книги Node Hero от RisingStack . Переведено с разрешения правообладателей.
В этой главе вы узнаете, что такое NPM и как его использовать. Давайте приступим к изучению!
NPM в двух словах
NPM — это менеджер пакетов, используемый Node.js-приложениями. В нём вы можете найти массу готовых модулей, поэтому вам не нужно изобретать колесо. Это похоже на Maven для Java или Composer для PHP. Существует два основных интерфейса, с которыми вы будете взаимодействовать: сайт NPM и набор инструментов командной строки (CLI).
И веб-сайт, и CLI используют один и тот же реестр, чтобы искать и отображать модули.
Вебсайт
Сайт NPM можно найти по адресу https://npmjs.com. Здесь вы можете зарегистрироваться как новый пользователь или поискать нужные пакеты.
Интерфейс командной строки
Чтобы запустить CLI, достаточно написать:
Обратите внимание, что NPM поставляется вместе с бинарным файлом Node.js, поэтому вам не нужно его устанавливать, однако если вы хотите использовать определенную версию NPM, вы можете его обновить. Если вы хотите установить NPM версии 3, вы можете сделать это с помощью: npm install npm@3 -g .
Использование NPM: Учебное пособие
Вы уже встречались с NPM в предыдущей главе, когда создавали файл package.json . Давайте расширим наши знания!
Добавление зависимостей
В этом разделе вы узнаете, как добавлять рантайм зависимости к вашему приложению.
Когда у вас есть файл package.json , вы можете добавить зависимости к вашему приложению. Давайте добавим одну! Попробуйте следующее:
С помощью этой единственной команды мы достигли двух вещей: во-первых, lodash загружен и помещён в папку node_modules . Это папка, в которой будут находиться все ваши внешние зависимости. Обычно вы не хотите добавлять её в свою систему управления версиями, поэтому, если вы используете git, обязательно добавьте node_modules в файл .gitignore .
Это может быть хорошей отправной точкой для вашего .gitignore (ссылка на GitHub).
Давайте посмотрим, что происходит в файле package.json ! Появилось новое свойство, называемое dependencies :
Это означает, что lodash версии 4.6.1 теперь установлен и готов к использованию. Обратите внимание, что NPM следует правилам SemVer для версионирования пакетов.
Используя нумерацию версий вида MAJOR.MINOR.PATCH, повышайте MAJOR-версию, когда вы делаете несовместимые изменения API, MINOR-версию, когда вы добавляете функциональность обратно-совместимым образом, и PATCH-версию, когда вы делаете исправления ошибок с обратной совместимостью. Для получения дополнительной информации: http://semver.org/
Поскольку lodash готов к использованию, давайте посмотрим, как мы можем им воспользоваться! Вы можете сделать это так же, как и с вашим собственным модулем, но теперь вам не нужно указывать полный путь, достаточно только имени модуля:
Добавление зависимостей для разработки
В этом разделе вы узнаете, как добавлять зависимости, необходимые только во время сборки приложения.
Когда вы собираете веб-приложения, вам может потребоваться минимизировать ваши JavaScript-файлы, объединить CSS-файлы и так далее. Модули, которые это сделают, будут выполняться только во время создания ресурсов, поэтому работающее приложение не нуждается в них.
Вы можете установить такие скрипты с помощью:
После этого в вашем файле package.json появится новый раздел, называемый devDependencies . Все модули, которые вы устанавливаете с помощью —save-dev , будут описаны там, а также они будут помещены в тот же самый каталог node_modules .
NPM-скрипты
NPM-скрипты — очень мощная концепция, с их помощью вы можете создавать небольшие утилиты или даже описывать сложные системы сборки.
Наиболее распространенными являются скрипты start и test . С помощью start вы можете описать, как нужно запускать приложение, а test используется для запуска тестов. В вашем package.json они могут выглядеть примерно так:
Что следует здесь отметить:
- start : просто описывает начальную точку для запуска вашего приложения, этот скрипт можно вызвать с помощью npm start .
- test : цель этого скрипта заключается в том, чтобы запускать ваши тесты: одно из удобств такого запуска тестов заключается в том, что в этом случае mocha не нужно устанавливать глобально, так как NPM будет искать её в папке node_modules/.bin , а mocha будет размещена там же. Запуск тестов может быть вызван с помощью npm test .
- your-custom-script : всё, что вы захотите (вы можете выбрать любое имя). Его можно вызвать с помощью npm run your-custom-script — не забывайте про run в этом случае!
Ограничение области видимости и приватные пакеты
Первоначально у NPM было глобальное пространство имен для названий модулей, и с более чем 250 000 модулями в реестре большинство простых имен уже заняты. Кроме того, глобальное пространство имен содержит только общедоступные модули.
В NPM урегулировали эту проблему внедрением пакетов с ограниченной областью видимости ( scoped packages), они имеют следующий шаблон именования:
Вы можете устанавливать пакеты с ограниченной областью видимости так же, как и раньше:
Они будут отображаться в вашем package.json следующим образом:
Подключения пакетов с ограниченной областью видимости работает должным образом:
Источник
NPM. Package.json. Установка модулей. Определение команд¶
Кроме встроенных и кастомных модулей Node.js существует огромный пласт различных библиотек и фреймворков, разнообразных утилит, которые создаются сторонними производителями и которые также можно использовать в проекте, например, express, grunt, gulp и так далее. И они тоже нам доступны в рамках Node.js. Чтобы удобнее было работать со всеми сторонними решениями, они распространяются в виде пакетов. Пакет по сути представляет набор функциональностей.
Для автоматизации установки и обновления пакетов, как правило, применяются систему управления пакетами или менеджеры. Непосредственно в Node.js для этой цели используется пакетный менеджер NPM (Node Package Manager). NPM по умолчанию устанавливается вместе с Node.js, поэтому ничего доустанавливать не требуется. Но можно обновить установленную версию до самой последней. Для этого в командной строке/терминале надо запустить следующую команду:
Чтобы узнать текущую версию npm , в командной строке/терминале надо ввести следующую команду:
Для нас менеджер npm важен в том плане, что с его помощью легко управлять пакетами. К примеру, создадим на жестком диске новую папку modulesapp (В моем случае папка будет находиться по пути C:\node\modulesapp ).
Далее для примера установим в проект express . Express представляет легковесный веб-фреймворк для упрощения работы с Node.js. В данном случае мы не будем пока подробно рассматривать фреймворк Express, так как это отдельная большая тема. А используем его лишь для того, чтобы понять, как устанавливаются сторонние модули в проект.
Для установки функциональности Express в проект вначале перейдем к папке проекта с помощью команды cd . Затем введем команду
После установки express в папке проекта modulesapp появится подпапка node_modules , в которой будут хранится все установленные внешние модули. В частности, в подкаталоге node_modules/express будут располагаться файлы фреймворка Express.
Далее определим файл простейшего сервера. Для этого в корневую папку проекта modulesapp добавим новый файл app.js :
Первая строка получает установленный модуль express , а вторая создает объект приложения.
В Express мы можем связать обработку запросов с определенными маршрутами. Например, / — представляет главную страницу или корневой маршрут. Для обработки запроса вызывается функция app.get() . Первый параметр функции — маршрут, а второй — функция, которая будет обрабатывать запрос по этому маршруту.
И чтобы сервер начал прослушивать подключения, надо вызвать метод app.listen() , в который передается номер порта.
Запустим сервер командой node app.js :
И в адресной строке браузера введем адрес http://localhost:3000/ :
Файл package.json¶
Для более удобного управления конфигурацией и пакетами приложения в npm применяется файл конфигурации package.json . Так, добавим в папку проекта modulesapp новый файл package.json :
Здесь определены только две секции: имя проекта — modulesapp и его версия — 1.0.0 . Это минимально необходимое определение файла package.json . Данный файл может включать гораздо больше секций. Подробнее можно посмотреть в документации.
Далее удалим из проекта каталог node_modules . То есть в папке проекта modulesapp будут два файла app.js и package.json .
Теперь снова добавим express с помощью следующей команды:
Флаг —save указывает, что информацию о добавленном пакете надо добавить в файл package.json .
И после выполнения команды, если мы откроем файл package.json , то мы увидим информацию о пакете:
Информация обо всех добавляемых пакетах, которые используются при запуске приложения, добавляется в секцию dependencies .
Файл package.json играет большую роль и может облегчить разработку в различных ситуациях. Например, при размещении в разных репозиториях нередко мы ограничены выделяемым дисковым пространством, тогда как папка node_modules со всеми загруженными пакетами может занимать довольно приличное пространство. В этом случае удобнее разместить основной код проекта без node_modules . В этом случае мы можем определить все пакеты в файле package.json , а затем для загрузки всех пакетов выполнить команду
Эта команда возьмет определение всех пакетов из секций dependencies и загрузит их в проект.
devDependencies¶
Кроме пакетов, которые применяются в приложении, когда оно запущено, например, express, то есть в состоянии «production», есть еще пакеты, которые применяются при разработке приложения и его тестировании. Такие пакеты добавляются в другую секцию — devDependencies . В вышеприведенном примере она не определена, но если бы мы добавили какой-нибудь grunt или gulp, то они бы были именно в секции devDependencies .
Например, загрузим в проект пакет jasmine-node , который используется для тестирования приложения:
Флаг —save-dev указывается, что информацию о пакете следует сохранить в секции devDependencies файла package.json :
Удаление пакетов¶
Для удаления пакетов используется команда npm uninstall . Например:
Эта команда удаляет пакет из папки node_modules , в то же время в файле package.json информация о данном пакете остается. Чтобы удалить информацию также и из package.json , применяется флаг —save :
Семантическое версионирование¶
При определении версии пакета применяется семантическое версионирование. Номер версии, как правило, задается в следующем формате major.minor.patch . Если в приложении или пакете обнаружен какой-то баг и он исправляется, то увеличивается на единицу число patch . Если в пакет добавляется какая-то новая функциональность, которая совместима с предыдущей версией пакета, то это небольшое изменение, и увеличивается число minor . Если же в пакет вносятся какие-то большие изменения, которые несовместимы с предыдущей версией, то увеличивается число major . То есть глядя на разные версии пакетов, мы можем предположить, насколько велики в них различия.
В примере с express версия пакета содержала, кроме того, дополнительный символ карет: ^4.14.0 . Этот символ означает, что при установке пакета в проект с помощью команды npm install будет устанавливаться последняя доступная версия от 4.14.0 . Фактически это будет последняя доступная версия в промежутке от 4.14.0 до 5.0.0 ( >=4.14.0 и ). Более подробно про сематическое версионирование в npm можно посмотреть здесь.
Команды npm¶
NPM позволяет определять в файле package.json команды, которые выполняют определенные действия. Например, определим следующий файл app.js :
В данном случае мы получаем переданные при запуске приложению параметры.
И определим следующий файл package.json :
Здесь добавлена секция scripts , которая определяет две команды. Вообще команд может быть много в соответствии с целями и задачами разработчика.
Первая команда называется start . Она по сути выполняет команду node app.js , которая выполняет код в файле app.js
Вторая команда назвывается dev . Она также выполняет тот же файл, но при этом также передает ему два параметра.
Названия команд могут быть произвольными. Но здесь надо учитывать один момент. Есть условно говоря есть зарезервированные названия для команд, например, start , test , run и ряд других. Их не очень много. И как раз первая команда из выше определенного файла package.json называется start . И для выполнения подобных команд в терминале/командной строке надо выполнить команду
Например, для запуска команды start
Команды с остальными названия, как например, dev в вышеопределенном файле, запускаются так:
Например, последовательно выполним обе команды:
Источник