Что такое npm в node js
Шпаргалка по пакетному менеджеру NPM
Установка npm
Обновление npm
Есть несколько способов чтобы обновить npm. Я предпочитаю:
Поиск пакетов в npm
Подсказка: Можно также использовать search.npmjs.org
Вторая подсказка: Для поиска необходимо знать имя нужного пакета (всё прекрасно ищет по любому слову как в имени пакета, так и в его описании, может неправильно перевёл?)
Просмотр информации о пакете
Локальная установка пакетов
Для демонстрации возьмём пакет http-server.
http-server is a package we’ve written which provides an easy to use wrapper around node’s core http.Server class. This module makes for a good example, since it’s API provides both a CLI binary and a requirable node.js module.
http-server — пакет, который мы написали, предоставляет более простой интерфейс в использовании базового модуля http.Server из node.js. Этот модуль хороший пример использования API как для бинарного CLI, так и для подключаемого модуля node.js.
Так мы установим http-server в нашей рабочей директории.
Вы увидите новую папку в node_modules. Сейчас можете не обращать на это внимание.
Установка пакета в наше приложение
test.js
Обратите внимание, как мы делаем: require(‘http-server’)? Что это за магия? (автор молодец)
http-server не является базовым модулем node.js. Этот пакет мы только что установили из npm. Node.js и npm взаимодействуют и автоматически подключают наши локальные модули из node_modules директории.
Понимание разницы между глобальной и локальной установкой
test.js
теперь запустим наш скрипт
мы получим эту ошибку:
Это вполне логично, мы установили http-server локально в «/mynewapp/», а не в «/anotherapp/».
Есть два решения в этой ситуации:
а) Установить ещё раз пакет, но локально в наше новое приложение
б) Установить пакет глобально
Глобальная установка пакетов
Если вы хотите чтобы пакет был доступен всем приложениям, его нужно установить глобально:
Кроме того, поскольку http-server пакет имеет свой исполняемый файл, то этот файл также будет установлен как исполняемый http-server и доступен в командах.
Теперь вы можете просто запустить команду:
Удаление локально установленного пакета
Удаление глобально установленного пакета
Установка определённой версии пакета
Установка модуля с Github
Важно. В некоторых случаях будут патчи, форки или ветви, которые вы хотите использовать, но которые еще не были опубликованы в npm. К счастью исходные коды для большинства npm модулей также доступна на www.github.com
Теперь наша клонированная версия http-server связана локально.
Связи любых пакетов локально
Если у вас есть отдельный каталог содержащий пакет npm, то можно создать локальную связь для него. Это удобно в ситуациях, когда мы не хотим опубликовать наш пакет в хранилище npm.
На нашу локальную версию http-server создана «связана» для нашей локальной машины. (связь создаётся как «copy-paste», с начало нужно перейти в нужный катало и сделать «copy», потом перейти в нужный каталог и сделать «paste». Так вот сейчас мы изучили как делается «copy», а ниже будет про «paste» этого модуля)
Связи локальных пакетов для нескольких приложений
Как мы видели ранее npm устанавливает пакеты в локальный каталог по умолчанию. Так вот npm ссылка(связь) работает почти так же.
Мы указываем, что теперь создали связь из http-server в наше новое приложение newapp. Если бы мы не выполнили npm link http-server, то получили бы ошибку об отсутствующем модуле. (а вот наш и «paste» о чём я писал выше, теперь вам должна быть понятна логика создания связей)
Отмена связи между пакетами приложения
(здесь мы просто отменяем наш «paste» для этого приложения)
Отмена связи пакета в системе
(здесь мы отменяем наш «copy» для этого пакета)
Создание нового пакета
(от себя хочу лишь заметить, что создание пакета не такая простая задача в одну команду, подробнее можно почитать в другой статье)
Добавление нового пользователя
Публикация пакета в репозиторий npm
Удаление пакета из репозитория npm
Управление правами доступа к пакетам в репозитории npm
Вы можете задать права доступа других пользователей к опубликованному пакету:
Руководство по Node.js, часть 5: npm и npx
Сегодня, в пятой части перевода руководства по Node.js, мы завершим разбор возможностей npm, в частности, коснёмся таких вопросов, как выяснение установленных версий npm-пакетов, установка старых версий пакетов, обновление зависимостей, локальная и глобальная деинсталляция пакетов. Здесь же мы поговорим и об npx.
Выяснение версий установленных npm-пакетов
Для того чтобы узнать версии всех установленных в папке проекта npm-пакетов, включая их зависимости, выполните следующую команду:
В результате, например, может получиться следующее:
То же самое можно узнать и просмотрев файл package-lock.json проекта, но древовидную структуру, которую выводит вышеописанная команда, удобнее просматривать.
Для того чтобы получить подобный список пакетов, установленных глобально, можно воспользоваться следующей командой:
Вывести только сведения о локальных пакетах верхнего уровня (то есть, тех, которые вы устанавливали самостоятельно и которые перечислены в package.json ) можно так:
В результате, если, например, устанавливали вы только пакет cowsay, выведено будет следующее:
Для того чтобы узнать версию конкретного пакета, воспользуйтесь следующей командой:
В результате её выполнения получится примерно следующее:
Эта команда подходит и для выяснения версий зависимостей установленных вами пакетов. При этом в качестве имени пакета, передаваемого ей, выступает имя пакета-зависимости, а вывод команды будет выглядеть следующим образом:
Запись о пакете-зависимости в этой структуре будет выделена.
Если вы хотите узнать о том, каков номер самой свежей версии некоего пакета, доступного в npm-репозитории, вам понадобится команда следующего вида:
В ответ она выдаёт номер версии пакета:
Установка старых версий npm-пакетов
Установка старой версии npm-пакета может понадобиться для решения проблем совместимости. Установить нужную версию пакета из npm можно, воспользовавшись следующей конструкцией:
В случае с используемым нами в качестве примера пакетом cowsay, команда npm install cowsay установит его самую свежую версию (1.3.1 на момент написания этого материала). Если же надо установить его версию 1.2.0, воспользуемся такой командой:
Указывать версии можно и устанавливая глобальные пакеты:
Если вам понадобится узнать о том, какие версии некоего пакета имеются в npm, сделать это можно с помощью такой конструкции:
Вот пример результата её работы:
Обновление зависимостей проекта до их самых свежих версий
Кроме того, устанавливая некий пакет, npm находит и устанавливает его зависимости.
В package-lock.json так же будут внесены сведения об этом пакете. Вот его фрагмент:
Для того чтобы узнать, вышли ли новые версии используемых в проекте пакетов, можно воспользоваться следующей командой:
Вот результаты выполнения этой команды для проекта, зависимости которого давно не обновлялись:
Анализ устаревших зависимостей проекта
Для того чтобы обновиться до новых мажорных версий всех используемых пакетов, глобально установите пакет npm-check-updates :
Затем запустите утилиту, предоставляемую им:
Локальная или глобальная деинсталляция пакетов
), выполните команду следующего вида:
При выполнении подобной команды текущая папка значения не имеет.
О выборе между глобальной и локальной установкой пакетов
Когда и почему пакеты лучше всего устанавливать глобально? Для того чтобы ответить на этот вопрос, вспомним о том, чем различаются локальная и глобальная установка пакетов:
.
Подключение локальных и глобальных пакетов в коде осуществляется одинаково:
Итак, какой же способ установки пакетов лучше всего использовать?
В общем случае, все пакеты следует устанавливать локально. Благодаря этому, даже если у вас имеются десятки Node.js-проектов, можно обеспечить, при необходимости, использование ими различных версий одних и тех же пакетов.
Обновление глобального пакета приводит к тому, что все проекты, в которых он применяется, будут использовать его новый релиз. Несложно понять, что это, в плане поддержки проектов, может привести к настоящему кошмару, так как новые релизы некоторых пакетов могут оказаться несовместимыми с их старыми версиями.
Если у каждого проекта имеется собственная локальная версия некоего пакета, даже при том, что подобное может показаться пустой тратой ресурсов, это — очень небольшая плата за возможность избежать негативных последствий, которые могут быть вызваны несовместимостью новых версий пакетов, обновляемых централизованно, с кодом проектов.
Пакеты следует устанавливать глобально в том случае, когда они представляют собой некие утилиты, вызываемые из командной строки, которые используются во множестве проектов.
Подобные пакеты можно устанавливать и локально, запуская предоставляемые ими утилиты командной строки с использованием npx, но некоторые пакеты, всё же, лучше устанавливать глобально. К таким пакетам, которые вам, вполне возможно, знакомы, можно отнести, например, следующие:
О зависимостях проектов
Когда пакет следует рассматривать как обычную зависимость проекта, необходимую для обеспечения его функционирования, а когда — как зависимость разработки?
При установке пакета с помощью команды вида npm install
Зависимости разработки — это пакеты, которые нужны в процессе разработки проекта, в ходе его обычного функционирования они не требуются. К таким пакетам относятся, например инструменты тестирования, Webpack, Babel.
Утилита npx
Сейчас мы поговорим об одной весьма мощной команде, npx, которая появилась в npm 5.2. Одной из её возможностей является запуск исполняемых файлов, входящих в состав npm-пакетов. Мы уже рассматривали использование npx для запуска подобного файла из пакета cowsay. Теперь поговорим об этом подробнее.
▍Использование npx для упрощения запуска локальных команд
Node.js-разработчики опубликовали множество исполняемых файлов (утилит) в виде пакетов, которые предполагалось устанавливать глобально, что обеспечивало удобный доступ к их возможностям, так как запускать их из командной строки можно было, просто введя имя соответствующей команды. Однако работать в такой среде было весьма некомфортно в том случае, если требовалось устанавливать разные версии одних и тех же пакетов.
▍Выполнение утилит без необходимости их установки
В npx имеется ещё одна интереснейшая возможность, благодаря которой утилиты можно запускать без их предварительной установки. Полезно это, в основном, по следующим причинам:
Если же пакет cowsay не будет установлен глобально, подобная команда выдаст ошибку.
Утилита npx позволяет выполнять подобные команды без их установки. Выглядит это, в рамках нашего примера, так:
Такая команда сработает, но, хотя «говорящая» корова, по большому счёту, особой пользы не приносит, тот же самый подход можно использовать и для выполнения куда более полезных команд. Вот несколько примеров:
▍Запуск JavaScript-кода с использованием различных версий Node.js
Это позволяет отказаться от использования инструментов наподобие nvm или других менеджеров версий Node.js.
▍Запуск произвольных фрагментов кода, доступных по некоему адресу
Npx позволяет запускать не только код, опубликованный в npm. В частности, если у вас есть ссылка на некий фрагмент кода (скажем, опубликованного на GitHub gist), запустить его можно так:
Конечно, при выполнении подобного кода нельзя забывать о безопасности. Npx даёт в руки разработчика большие возможности, но они означают и большую ответственность.
▍Итоги
Сегодня мы поговорили о некоторых полезных механизмах npm и об использовании npx. На данном этапе у вас должно сложиться базовое понимание устройства npm и методов работы с этим пакетным менеджером. Если вы хотите более глубоко изучить npm — обратитесь к странице документации проекта и побольше экспериментируйте.
В следующий раз мы обсудим некоторые базовые механизмы Node.js, понимание которых необходимо для успешной разработки приложений для этой платформы.
Уважаемые читатели! Пользуетесь ли вы npx?
Что Такое npm? Общее Руководство для Начинающих
npm – это менеджер пакетов, который входит в состав Node.js. В течение многих лет Node широко использовался разработчиками JavaScript для обмена инструментами, установки различных модулей и управления их зависимостями. Вот почему людям, работающим с Node.js, очень важно понять, что такое npm.
Нужен недорогой, но надёжный хостинг для вашего нового проекта? Обратите внимание, что в Hostinger действуют скидки на все тарифы хостинга. Воспользуйтесь предложением и разместите сайт до 90% дешевле!
Как Работает npm?
Он работает, выполняя одну из своих двух ролей:
Утилита командной строки npm обеспечивает корректную работу node.js.
Метаданные показывают несколько аспектов проекта в следующем порядке:
Метаданные помогают идентифицировать проект и служат основным источником информации о проекте.
Вот пример того, как вы можете идентифицировать проект по его метаданным:
Как Установить Модули npm и Запустить Проекты?
Убедитесь, что node.js и npm установлены, выполнив несколько простых команд.
Если он не установлен, скачайте Node с сайта node.js и следуйте инструкциям установщика.
npm известен своим однострочным установщиком:
Так как новые версии npm выходят регулярно, позже вы сможете обновить его. Чтобы обновить npm, просто скачайте установщик с сайта node.js и запустите его снова. Последняя версия автоматически заменит версию на вашем компьютере.
Также вы можете обновить его с помощью этой команды:
Инициализация Проекта с npm
Например, давайте создадим каталог с именем test-npm и cd в него. Теперь давайте запустим нашу первую команду npm:
Полезной функцией является то, запуск инициализации менеджера пакетов Node сопровождается объяснениями:
Это выглядит следующим образом:
Установка Модулей npm
Пакет в node.js содержит все файлы, необходимые для модуля. Модули – это библиотеки JavaScript, которые вы можете включить в свой проект.
Установка модулей – одна из самых важных вещей, которую вы должны научиться делать, начиная работу с менеджером пакетов Node. Вот команда для установки модуля в текущий каталог:
В приведенной выше команде замените на имя модуля, который вы хотите установить.
Например, если вы хотите установить Express – наиболее используемый и наиболее известный фреймворк node.js, вы можете выполнить следующую команду:
Приведённая выше команда установит модуль Express в /node_modules в текущий каталог.
Вот как это выглядит после установки модуля в ваш проект:
Выводы
Вот список основных команд, которые следует знать, если вы хотите не только разбираться в том, что такое npm, но и работать с ним:
Если вы планируете работать с JavaScript, npm – незаменимый инструмент в вашем рабочем процессе.
Ольга уже около пяти лет работает менеджером в сфере IT. Написание технических заданий и инструкций — одна из её главных обязанностей. Её хобби — узнавать что-то новое и создавать интересные и полезные статьи о современных технологиях, веб-разработке, языках программирования и многом другом.
Руководство по Node.js, часть 4: npm, файлы package.json и package-lock.json
Основы npm
Npm (node package manager) — это менеджер пакетов Node.js. В первой части этого материала мы уже упоминали о том, что сейчас в npm имеется более полумиллиона пакетов, что делает его самым большим в мире репозиторием кода, написанного на одном языке. Это позволяет говорить о том, что в npm можно найти пакеты, предназначенные для решения практически любых задач.
Изначально npm создавался как система управления пакетами для Node.js, но в наши дни он используется и при разработке фронтенд-проектов на JavaScript. Для взаимодействия с реестром npm используется одноимённая команда, которая даёт разработчику огромное количество возможностей.
▍Загрузка пакетов
С помощью команды npm можно загружать пакеты из реестра. Ниже мы рассмотрим примеры её использования.
▍Установка всех зависимостей проекта
▍Установка отдельного пакета
Отдельный можно установить следующей командой:
Часто можно видеть, как эту команду используют не в таком вот простом виде, а с некоторыми флагами. Рассмотрим их:
▍Обновление пакетов
Для обновления пакетов служит следующая команда:
Обновить можно и отдельный пакет:
▍Загрузка пакетов определённых версий
В дополнение к стандартной загрузке пакетов, npm поддерживает и загрузку их определённых версий. В частности, можно заметить, что некоторые библиотеки совместимы лишь с некими крупными релизами других библиотек, то есть, если бы зависимости таких библиотек устанавливались бы без учёта версий, это могло бы нарушить их работу. Возможность установить определённую версию некоего пакета полезна и в ситуациях, когда, например, вам вполне подходит самый свежий релиз этого пакета, но оказывается, что в нём имеется ошибка. Ожидая выхода исправленной версии пакета, можно воспользоваться и его более старым но стабильным релизом.
Во всех этих случаях возможность указания версий пакетов, необходимых проекту, чрезвычайно полезна. Npm следует стандарту семантического версионирования (semver).
▍Запуск скриптов
Файл package.json поддерживает возможность описания команд (скриптов), запускать которые можно с помощью такой конструкции:
Например, вот как выглядят перечень скриптов, имеющийся в соответствующем разделе файла:
Весьма распространено использование этой возможности для запуска Webpack:
Такой подход даёт возможность заменить ввод длинных команд, чреватый ошибками, следующими простыми конструкциями:
▍Куда npm устанавливает пакеты?
При установке пакетов с использованием npm (или yarn) доступны два варианта установки: локальная и глобальная.
Выполняя такую команду, npm не устанавливает пакет в локальную папку проекта. Вместо этого он копирует файлы пакета в некое глобальное расположение. Куда именно попадают эти файлы?
Для того чтобы это узнать, воспользуйтесь следующей командой:
Однако если вы используете для управления версиями Node.js nvm, путь к папке с глобальными пакетами может измениться.
▍Использование и выполнение пакетов, установленных с помощью npm
Для того чтобы использовать её в своём коде, достаточно импортировать её с применением команды require :
Как быть, если пакет представляет собой исполняемый файл?
Посмотреть на то, как выглядит работа этого механизма можно, установив пакет cowsay. Он представляет собой шуточную программу, написанную для командной строки. Если передать этому пакету какой-нибудь текст, в консоли, в стиле ASCII-арта, будет выведено изображение коровы, которая «произносит» соответствующий текст. «Озвучивать» текст могут и другие существа.
Путь к пакету npx найдёт автоматически.
Файл package.json
Файл package.json является важнейшим элементов множества проектов, основанных на экосистеме Node.js. Если вы программировали на JavaScript, была ли это серверная или клиентская разработка, то вы, наверняка, уже встречались с этим файлом. Зачем он нужен? Что вам следует о нём знать и какие возможности он вам даёт?
Package.json представляет собой нечто вроде файла-манифеста для проекта. Он даёт в распоряжение разработчика множество разноплановых возможностей. Например, он представляет собой центральный репозиторий настроек для инструментальных средств, используемых в проекте. Кроме того, он является тем местом, куда npm и yarn записывают сведения об именах и версиях установленных пакетов.
▍Структура файла
Вот пример простейшего файла package.json :
Как видите, он пуст. Нет жёстких требований, касающихся того, что должно присутствовать в подобном файле для некоего приложения. Единственное требование к структуре файла заключается в том, что она должна следовать правилам формата JSON. В противном случае этот файл не сможет быть прочитан программами, которые попытаются получить доступ к его содержимому.
Если вы создаёте Node.js-пакет, который собираетесь распространять через npm, то всё радикальным образом меняется, и в вашем package.json должен быть набор свойств, которые помогут другим людям пользоваться пакетом. Подробнее мы поговорим об этом позже.
Вот ещё один пример package.json :
Вот пример посложнее, который я взял из приложения-примера, написанного с использованием Vue.js:
Как видите, тут прямо-таки немеряно всего интересного. А именно, здесь можно выделить следующие свойства:
▍Свойства, используемые в package.json
Большинство свойств, которые мы опишем, используются лишь для нужд репозитория npm, некоторые используются программами, которые взаимодействуют с кодом, вроде того же npm.
Свойство name
Свойство name задаёт имя пакета:
Подобные ограничения существуют из-за того, что когда пакет публикуется в 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 указывает на то, где находится репозиторий пакета:
Используемую при разработке пакета систему контроля версий можно задать и в явном виде:
Один и тот же пакет может использовать разные системы контроля версий:
Свойство main
Свойство main задаёт точку входа в пакет:
Когда пакет импортируют в приложение, именно здесь будет осуществляться поиск того, что экспортирует соответствующий модуль.
Свойство private
Свойство scripts
Свойство scripts задаёт список скриптов или утилит, которые можно запускать средствами npm:
Скрипты можно называть так, как вам хочется, делать они могут практически всё, чего может пожелать разработчик.
Свойство dependencies
Свойство dependencies содержит список npm-пакетов, установленных в виде зависимостей пакета:
При установке пакета с использованиеме npm или yarn используются команды такого вида:
Эти пакеты автоматически добавляются в список зависимостей разрабатываемого пакета.
Свойство devDependencies
Свойство devDependencies содержит список npm-пакетов, установленных как зависимости разработки:
Пакеты попадают в этот список при их установке с помощью npm или yarn, выполняемой следующим образом:
Свойство engines
Свойство engines указывает, какие версии Node.js и других программных продуктов используются для обеспечения работы пакета:
Свойство browserlist
Свойство browserlist позволяет сообщить о том, какие браузеры (и их версии) собирается поддерживать разработчик пакета:
Этим свойством пользуются Babel, Autoprefixer и другие инструменты. Анализ этого списка позволяет им добавлять в пакет только те полифиллы и вспомогательные механизмы, которые нужны для перечисленных браузеров.
Показанное здесь в качестве примера значение свойства browserlist означает, что вы хотите поддерживать как минимум 2 мажорные версии всех браузеров с как минимум 1% использования (эти данные берутся с ресурса CanIUse.com), за исключением IE 8 и более старых версий этого браузера (подробнее об этом можно узнать на странице пакета browserlists).
▍Хранение в package.json настроек для различных программных инструментов
В package.json можно хранить настройки для различных вспомогательных инструментов вроде Babel или ESLint.
▍О версиях пакетов и семантическом версионировании
Учитывая то, что при использовании семантического версионирования все номера версий пакетов состоят из последовательностей, представляющих собой три числа, о смысле которых мы говорили выше, опишем следующие правила использования спецификаторов версий:
: если вы задаёте версию в виде
Файл package-lock.json
Цель этого файла заключается в отслеживании точных версий установленных пакетов, что позволяет сделать разрабатываемый продукт стопроцентно воспроизводимым в его исходном виде даже в случае, если те, кто занимается поддержкой пакетов, их обновили.
в применении к версии некоего пакета, вышел его патч-релиз, установлен будет не тот пакет, который использовался при разработке, а именно этот патч-релиз.
Эта концепция не нова, менеджеры пакетов, применяемые в других языках программирования (вроде менеджера Composer в PHP) используют похожую систему многие годы.
Файл package-lock.json нужно отправить в Git-репозиторий, что позволит другим людям скачать его в том случае, если проект является общедоступным, или тогда, когда его разработкой занимается команда программистов, или если вы используете Git для развёртывания проекта.
▍Пример файла package-lock.json
Разберём этот файл. Мы устанавливаем пакет cowsay, который зависит от следующих пакетов:
Итоги
Уважаемые читатели! Какой менеджер пакетов вы предпочитаете — npm или yarn?