npm init
npm init -y # пропускаем вопросы
# установка всех зависимостей проекта (если имеется package.json)
npm install
# установка отдельного пакета
npm i <package>
# установка нескольких пакетов сразу
npm i <package_1> <package_2> <package_3>
# добавим пакет в список зависимостей для разработки
npm i -D <package>
Флаг --save-dev
или -D
позволяет установить пакет и добавить запись о нём в раздел, содержащий перечень зависимостей разработки (то есть — пакетов, которые нужны в ходе разработки проекта, вроде библиотек для тестирования, но не требуются для его работы) файла package.json, который называется devDependencies.
- dependencies — содержит список npm-пакетов, от которых зависит приложение.
- devDependencies — содержит список npm-пакетов, используемых при разработке проекта, но не при его реальной работе.
Ключ -g
говорит о том, что пакет установится в систему глобально, то-есть в систему, а не в папку проекта.
Файл package.json является файлом манифеста нашего проекта, который описывает помимо той информации, что мы внесли в терминале, еще и информацию об используемых пакетах в нашем проекте.
Например, если мы установим в проект Gulp с ключом --save-dev, то пакет и используемая версия автоматически добавится в наш package.json. Такой учет позволит быстро разворачивать новый проект с использованием уже имеющегося package.json и устанавливать необходимые модули с зависимостями, которые прописаны в package.json в новых проектах.
npm update # обновление пакетов
Получив эту команду, npm проверит все пакеты на наличие их новых версий, и, если найдёт их новые версии, соответствующие ограничениям на версии пакетов, заданным в package.json, установит их.
npm update <package> # обновить отдельный пакет
Даже если, следуя правилам семантического версионирования, минорные релизы и патч-релизы не должны содержать в себе изменений, препятствующих обратной совместимости, все мы знаем, что ошибки способны проникать (и проникают) куда угодно.
# удаляет модуль из node_modules, но оставляет запись в package.json
npm uninstall <package>
# удаляет также из dependencies
npm uninstall <package> --save
# удаляет также из devDependencies
npm uninstall <package> --save-dev
# удаляет глобально, при этом текущая папка значения не имеет
npm uninstall -g <package> --save
Узнать версии всех установленных в папке проекта npm-пакетов, включая их зависимости:
> npm list
/Users/flavio/dev/node/cowsay
└─┬ [email protected]
├── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ └── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ └─┬ [email protected]
│ └── [email protected]
└── [email protected]
То же самое можно узнать и просмотрев файл package-lock.json проекта, но древовидную структуру, которую выводит вышеописанная команда, удобнее просматривать.
Установленных глобально:
npm list -g
Вывести только сведения о локальных пакетах верхнего уровня (которые устанавливали самостоятельно и которые перечислены в package.json):
npm list --depth=0
Узнать версию конкретного пакета:
npm list cowsay
Узнать номер самой свежей версии некоего пакета, доступного в npm-репозитории:
npm view <package> version
Узнать, какие версии некоего пакета имеются в npm:
npm view <package> versions
Узнать, вышли ли новые версии используемых пакетов:
npm outdated
Установить нужную версию пакета из npm можно, воспользовавшись следующей конструкцией:
npm install <package>@<version>
Указывать версии можно и устанавливая глобальные пакеты:
npm install -g [email protected]
Когда вы устанавливаете пакет командой вида npm install <packagename>
, из репозитория загружается самая свежая из доступных версий и помещается в папку node_modules. При этом соответствующие записи добавляются в файлы package.json и package-lock.json, находящиеся в папке проекта.
Правило обновления пакета в виде ^1.3.1
означает, что npm может обновлять пакет при выходе его минорных и патч-версий.
Некоторые из доступных обновлений пакетов представляют собой их мажорные релизы, обновления до которых не произойдёт при выполнении команды npm update. Обновление до мажорных релизов этой командой не производится, так как они (по определению) могут содержать серьёзные изменения, не отличающиеся обратной совместимостью с предыдущими мажорными релизами.
Для того чтобы обновиться до новых мажорных версий всех используемых пакетов, глобально установите пакет npm-check-updates
:
npm install -g npm-check-updates
Затем запустите утилиту, предоставляемую им:
ncu -u
Эта команда обновит файл package.json, внеся изменения в указания о подходящих версиях пакетов в разделы dependencies и devDependencies. Это позволит npm обновить пакеты, используемые в проекте, до новых мажорных версий после запуска команды npm update
.
Если вы хотите установить самые свежие версии пакетов для только что только что загруженного проекта, в котором пока нет папки node_modules, то, вместо npm update
, выполните команду npm install
.
В общем случае, все пакеты следует устанавливать локально. Благодаря этому, даже если у вас имеются десятки nodejs-проектов, можно обеспечить, при необходимости, использование ими различных версий одних и тех же пакетов. Обновление глобального пакета приводит к тому, что все проекты, в которых он применяется, будут использовать его новый релиз. Несложно понять, что это, в плане поддержки проектов, может привести к настоящему кошмару, так как новые релизы некоторых пакетов могут оказаться несовместимыми с их старыми версиями.
Пакеты следует устанавливать глобально, когда они представляют собой некие утилиты, вызываемые из командной строки, которые используются во множестве проектов. Подобные пакеты можно устанавливать и локально, запуская предоставляемые ими утилиты командной строки с использованием npx, но некоторые пакеты, всё же, лучше устанавливать глобально. Например, следующие:
- npm
- create-react-app
- vue-cli
- grunt-cli
- mocha
- react-native-cli
- gatsby-cli
- forever
- nodemon
Не исключено, что в вашей системе уже имеются пакеты, установленные глобально. Для того чтобы об этом узнать, воспользуйтесь следующей командой:
npm list -g --depth 0
Когда пакет следует рассматривать как обычную зависимость проекта, необходимую для обеспечения его функционирования, а когда — как зависимость разработки?
При установке пакета с помощью команды вида npm install <package-name>
он устанавливается как обычная зависимость. Запись о таком пакете делается в разделе dependencies файла package.json.
Использование флага --save-dev
позволяет установить пакет как зависимость разработки. Запись о нём при этом делается в разделе devDependencies файла package.json.
Зависимости разработки — это пакеты, которые нужны в процессе разработки проекта, в ходе его обычного функционирования они не требуются. К таким пакетам относятся, например инструменты тестирования, Webpack, Babel.
Когда проект разворачивают, используя команду npm install
в его папке, в которой имеется папка, содержащая файл package.json, это приведёт к установке всех зависимостей, так как npm предполагает, что подобная установка выполняется для целей работы над проектом.
Поэтому, если пакет требуется развернуть в продакшне, то, при его развёртывании, нужно использовать команду
npm install --production
Благодаря флагу --production
зависимости разработки устанавливаться не будут.
Сейчас мы поговорим об одной весьма мощной команде, npx
, которая появилась в npm 5.2. Одной из её возможностей является запуск исполняемых файлов, входящих в состав npm-пакетов. Мы уже рассматривали использование npx для запуска подобного файла из пакета cowsay. Теперь поговорим об этом подробнее.
Node.js-разработчики опубликовали множество исполняемых файлов (утилит) в виде пакетов, которые предполагалось устанавливать глобально, что обеспечивало удобный доступ к их возможностям, так как запускать их из командной строки можно было, просто введя имя соответствующей команды. Однако работать в такой среде было весьма некомфортно в том случае, если требовалось устанавливать разные версии одних и тех же пакетов.
Применение команды вида npx commandname
приводит к автоматическому поиску нужного файла в папке проекта node_modules. Это избавляет от необходимости знания точного пути к подобному файлу. Так же это делает ненужной глобальную установку пакета с обеспечением доступа к нему из любого места файловой системы благодаря использованию системной переменной PATH.