Это пошаговое руководство покажет вам, как установить npm и освоить общие команды в интерфейсе командной строки Node Package Manager (npm).
Node.js позволяет писать приложения на JavaScript на сервере. Он построен на среде выполнения JavaScript V8 и написан на C++, поэтому работает быстро. Первоначально он задумывался как серверная среда для приложений, но разработчики начали использовать его для создания инструментов, помогающих им в автоматизации локальных задач. С тех пор совершенно новая экосистема инструментов на основе Node (таких как Grunt, Gulp и webpack) эволюционировала, чтобы изменить лицо
Чтобы использовать эти инструменты (или пакеты) в Node.js, нам нужно иметь возможность устанавливать их и управлять ими удобным способом. Здесь на помощь приходит npm, менеджер пакетов Node. Он устанавливает пакеты, которые вы хотите использовать, и предоставляет удобный интерфейс для работы с ними.
В этом руководстве мы рассмотрим основы работы с npm. Мы покажем вам, как устанавливать пакеты в локальном и глобальном режиме, а также удалять, обновлять и устанавливать определенную версию пакета. Мы также покажем вам, как работать с package.jsonзависимостями проекта. Если вы больше любите видео, почему бы не подписаться на SitePoint Premium и не посмотреть наш бесплатный скринкаст: Что такое npm и как его использовать?
Но прежде чем мы сможем начать использовать npm, нам сначала нужно установить Node.js в нашей системе. Давайте сделаем это сейчас.
Установите npm с Node.js
Перейдите на страницу загрузки Node.js и скачайте нужную версию. Доступны установщики для Windows и Mac, а также предварительно скомпилированные двоичные файлы и исходный код Linux. Для Linux вы также можете установить Node через менеджер пакетов, как описано здесь.
В этом уроке мы будем использовать версию 12.15.0. На момент написания это текущая версия Node с долгосрочной поддержкой (LTS).
Совет: вы также можете установить Node с помощью менеджера версий. Это устраняет проблему с разрешениями, описанную в следующем разделе.
Посмотрим, куда был установлен узел и проверим версию:
$ which node
/usr/bin/node
$ node —version
v12.15.0
Чтобы убедиться, что ваша установка прошла успешно, давайте попробуем Node REPL:
$ node
> console.log ('Node is running’) ;
Node is running
>.help
.break Sometimes you get stuck, this gets you out
.clear Alias for.break
.editor Enter editor mode
.exit the repl
.help Print this help message
.load JS from a file into the REPL session
.save all evaluated commands in this REPL session to a file
Press ^C to abort current expression, ^D to exit the repl
Установка Node.js сработала, поэтому теперь мы можем сосредоточить внимание на npm, который был включен в установку:
$ which npm
/usr/bin/npm
$ npm —version
6.13.7
Установите обновления npm
npm, изначально обозначавший Node Package Manager, — это отдельный от Node.js проект. Он имеет тенденцию обновляться чаще. Вы можете проверить последнюю доступную версию npm на этой странице. Если вы понимаете, что у вас более старая версия, вы можете обновить ее следующим образом.
Для пользователей Linux и Mac используйте следующую команду:
npm install -g npm@latest
Установите пакеты npm в глобальном режиме
На данный момент у нас глобально установлен только один пакет — сам пакет npm. Итак, давайте изменим это и установим UglifyJS (инструмент минификации JavaScript). Мы используем —globalфлаг, но его можно сократить до -g:
$ npm install
/home/sitepoint/.node_modules_global/bin/uglifyjs → /home/sitepoint/.node_modules_global/lib/node_modules/
+
added 3 packages from 38 contributors in 0.259s
Как видно из вывода, дополнительные пакеты установлены. Это зависимости UglifyJS.
Список установленных глобальных пакетов npm
Мы можем перечислить глобальные пакеты, которые мы установили, с помощью npm listкоманды:
$ npm list —global
home/sitepoint/.node_modules_global/lib
├─┬ npm@6.9.0
│ ├── abbrev@1.1.1
│ ├── ansicolors@0.3.2
│ ├── ansistyles@0.1.3
│ ├── aproba@2.0.0
│ ├── archy@1.0.0
...................
└─┬
├── commander@2.19.0
└──
Вывод, однако, довольно подробный. Мы можем изменить это с помощью —depth=0опции:
$ npm list -g —depth=0
/home/sitepoint/.node_modules_global/lib
├── npm@6.13.7
└──
Любые пакеты, установленные глобально, станут доступны из командной строки. Например, вот как вы могли бы использовать пакет Uglify для минимизации example.jsв example.min.js:
$ uglifyjs example.js -o example.min.js
Установите пакеты npm в локальном режиме
Когда вы устанавливаете пакеты локально, вы обычно делаете это с помощью package.jsonфайла. Давайте продолжим и создадим его:
$ mkdir project && cd project
$ npm init
package name: (project)
version: (1.0.0)
description: Demo of package.json
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
Нажмите Return, чтобы принять значения по умолчанию, затем нажмите еще раз, чтобы подтвердить свой выбор. Это создаст package.jsonфайл в корне проекта:
{
«name»: «project»,
«version»: «1.0.0»,
«description»: «»,
«main»: «index.js»,
«scripts»: {
«test»: «echo \»Error: no test specified\» && exit 1»
},
«author»: «»,
«license»: «ISC»
}
Совет: если вам нужен более быстрый способ создания package.jsonфайла, используйте npm init —y.
Мы надеемся, что поля не требуют пояснений, за исключением mainи scripts. Это mainполе является основной точкой входа в вашу программу, и оно scriptsпозволяет указать команды сценария, которые выполняются в разное время в жизненном цикле вашего пакета. Мы можем пока оставить их как есть, но если вы хотите узнать больше, см. документацию package.json по npm и эту статью об использовании npm в качестве инструмента сборки.
Теперь давайте попробуем установить Underscore:
$ npm install underscore
npm notice created a lockfile as
npm WARN project@1.0.0 No repository
Как видите, в нашем проекте был установлен Underscore v1.9.2. Символ вставки (^) перед номером версии указывает, что при установке npm выберет самую старшую версию пакета, которую сможет найти, где должна совпадать только основная версия (если
Также обратите внимание, что подчеркивание было сохранено как свойство dependenciesполя. Это стало значением по умолчанию в последней версии npm и используется для пакетов (таких как Underscore), необходимых для запуска приложения. Также можно было бы сохранить пакет как файл devDependency, указав —
Совет: вы также можете добавить private: trueдля package.jsonпредотвращения случайной публикации частных репозиториев, а также для подавления любых предупреждений, генерируемых при запуске npm install.
Безусловно, самой большой причиной использования package.jsonдля указания зависимостей проекта является переносимость. Например, когда вы клонируете чужой код, все, что вам нужно сделать, это запустить npm iего в корне проекта, и npm разрешит и получит все необходимые пакеты для запуска приложения. Мы рассмотрим это более подробно позже.
Прежде чем закончить этот раздел, давайте быстро проверим, работает ли Underscore. Создайте файл с именем test.jsв корне проекта и добавьте следующее:
const _ = require («underscore») ;
console.log (_.range (5));
Запустите файл с помощью node test.js, и вы должны увидеть [0, 1, 2, 3, 4]вывод на экран.
Удалить локальные пакеты npm
npm — это менеджер пакетов, поэтому он должен иметь возможность удалять пакеты. Предположим, что текущий пакет Underscore вызывает у нас проблемы с совместимостью. Мы можем удалить пакет и установить более старую версию, например:
$ npm uninstall underscore
removed 1 package in 0.386s
$ npm list
project@1.0.0 /home/sitepoint/project
└── (empty)
Установите определенную версию пакета npm
Теперь мы можем установить пакет Underscore в нужной нам версии. Мы делаем это, используя знак @ для добавления номера версии:
$ npm install underscore@1.9.1
+ underscore@1.9.1
added 1 package in 1.574s
$ npm list
project@1.0.0 /home/sitepoint/project
└── underscore@1.9.1
Обновите пакет npm
Давайте проверим, есть ли обновление для пакета Underscore:
$ npm outdated
Package Current Wanted Latest Location
underscore 1.9.1 1.9.2 1.9.2 project
Столбец Current показывает нам версию, установленную локально. Столбец Latest сообщает нам последнюю версию пакета. А столбец Wanted сообщает нам о последней версии пакета, до которой мы можем обновиться, не нарушая существующий код.
Помните
Вы можете пойти дальше и попробовать это, если хотите. Удалите node_modulesпапку, затем запустите заново npm i (это сокращение от npm install). npm переустановит Underscore v1.9.1, хотя мы только что увидели, что v1.9.2 доступна. Это потому, что мы указали версию 1.9.1 в
{
«name»: «project»,
«version»: «1.0.0»,
«lockfileVersion»: 1,
«requires»: true,
«dependencies»: {
«underscore»: {
«version»: «1.9.1»,
«resolved»: «https: //registry.npmjs.org/underscore/-/
«integrity»: «sha512−5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==»
}
}
}
До появления
Теперь предположим, что последняя версия Underscore исправила ошибку, которая была у нас ранее, и мы хотим обновить наш пакет до этой версии:
$ npm update underscore
+ underscore@1.9.2
updated 1 package in 0.236s
$ npm list
project@1.0.0 /home/sitepoint/project
└── underscore@1.9.2
Совет: чтобы это работало, Underscore должен быть указан как зависимость в package.json. Мы также можем выполнить npm update, если у нас есть много устаревших модулей, которые мы хотим обновить.
Поиск пакетов npm
Мы использовали mkdirкоманду пару раз в этом уроке. Есть ли пакет Node с такой функциональностью? Давайте использовать npm search:
$ npm search mkdir
NAME | DESCRIPTION | AUTHOR | DATE
mkdir | Directory creation... | =joehewitt |
mkdirp | Recursively mkdir,... | =isaacs... |
...
Есть (mkdirp). Давайте установим его:
$ npm install mkdirp
+ mkdirp@1.0.3
added 1 package and audited 2 packages in 0.384s
Теперь создайте mkdir.jsфайл и
const mkdirp = require ('mkdirp’) ;
const made = mkdirp.sync ('/tmp/foo/bar/baz’) ;
console.log (`made directories, starting with ${made}`) ;
Далее запускаем его из терминала:
$ node mkdir.js
made directories, starting with /tmp/foo
Используйте npm для переустановки зависимостей проекта
Давайте сначала установим еще один пакет:
$ npm install request
+ request@2.88.0
added 48 packages from 59 contributors and audited 65 packages in 2.73s
found 0 vulnerabilities
Проверьте package.json:
«dependencies»: {
«mkdirp»: «^1.0.3»,
«request»: «^2.88.0»,
«underscore»: «^1.9.2»
},
Обратите внимание, что список зависимостей обновляется автоматически. Если вы хотите установить пакет, не сохраняя его в package.json, просто используйте —
Предположим, вы клонировали исходный код своего проекта на другую машину, и мы хотим установить зависимости. Давайте node_modulesсначала удалим папку, затем выполним npm install:
$ rm -R node_modules
$ npm list —depth=0
project@1.0.0 /home/sitepoint/project
├── UNMET DEPENDENCY mkdirp@1.0.3
├─┬ UNMET DEPENDENCY request@2.88.0
...
└── UNMET DEPENDENCY underscore@1.9.2
npm ERR! missing: mkdirp@1.0.3, required by project@1.0.0
npm ERR! missing: request@2.88.0, required by project@1.0.0
npm ERR! missing: underscore@1.9.2, required by project@1.0.0
...
$ npm install
added 50 packages from 60 contributors and audited 65 packages in 1.051s
found 0 vulnerabilities
Если вы посмотрите на свою node_modulesпапку, вы увидите, что она снова создается заново. Таким образом, вы можете легко делиться своим кодом с другими, не перегружая свой проект и исходные репозитории зависимостями.
Управление кешем npm
Когда npm устанавливает пакет, он сохраняет копию, поэтому в следующий раз, когда вы захотите установить этот пакет, ему не нужно будет подключаться к сети. Копии кэшируются в.npmкаталоге по вашему домашнему пути:
$ ls ~/.npm
anonymous-cli-metrics.json _cacache
Этот каталог со временем будет загроможден старыми пакетами, поэтому полезно время от времени очищать его:
$ npm cache clean —force
Вы также можете очистить все node_moduleпапки из своей рабочей области, если в вашей системе есть несколько проектов узлов, которые вы хотите очистить:
find. -name «node_modules» -type d -exec rm -rf '{}' +
Используйте npm Audit для сканирования зависимостей на наличие уязвимостей
Вы заметили, что все они found 0 vulnerabilitiesразбросаны по выходным данным CLI? Причина этого в том, что в npm была введена новая функция, которая позволяет разработчикам сканировать зависимости на наличие известных уязвимостей безопасности.
Давайте попробуем эту функцию, установив старую версию express:
$ npm install express@4.8.0
express@4.8.0
added 36 packages from 24 contributors and audited 123 packages in 2.224s
found 21 vulnerabilities (8 low, 9 moderate, 4 high)
run `npm audit fix` to fix them, or `npm audit` for details
Как только мы закончим установку, мы получим краткий отчет о том, что найдено несколько уязвимостей. Вы можете запустить команду npm auditдля просмотра более подробной информации:
$ npm audit
=== npm audit security report ===
# Run npm install express@4.17.1 to resolve 21 vulnerabilities
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ High │ Regular Expression Denial of Service │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package │ negotiator │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ express │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path │ express > accepts > negotiator │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info │ https://nodesecurity.io/advisories/106 │
└───────────────┴──────────────────────────────────────────────────────────────┘
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Moderate │ Timing Attack │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ express │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path │ express >
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info │ https://nodesecurity.io/advisories/134 │
└───────────────┴──────────────────────────────────────────────────────────────┘
Вы получите подробный список пакетов с уязвимостями. Если вы посмотрите на Pathполе, оно показывает путь зависимости. Например, Path express > accepts > negotiatorозначает, что Express зависит от Acceptsпакета. Пакет Acceptsзависит от negotiatorпакета, содержащего уязвимость.
Есть два способа решить все эти проблемы. Мы можем либо выполнить команду npm install express@4.17.1, как было предложено, либо запустить npm audit fix. Сделаем последнее:
$ npm audit fix
+ express@4.17.1
added 20 packages from 14 contributors, removed 7 packages and updated 29 packages in 1.382s
fixed 21 of 21 vulnerabilities in 122 scanned packages
Команда npm audit fixавтоматически устанавливает любые совместимые обновления для уязвимых зависимостей. Хотя это может показаться волшебством, обратите внимание, что уязвимости не всегда могут быть исправлены автоматически. Это может произойти, если вы используете пакет, который претерпел серьезные изменения, которые могут нарушить ваш текущий проект в случае обновления. В подобных ситуациях вам придется просмотреть свой код и вручную применить исправление.
Вы также можете запустить npm audit fix —force, если не возражаете против обновления пакетов с критическими изменениями. После выполнения команды запустите, npm auditчтобы убедиться, что все уязвимости устранены.
npm псевдонимы
Как вы могли заметить, существует несколько способов запуска команд npm. Вот краткий список некоторых часто используемых псевдонимов npm:
npm i
npm i -g
npm un
npm up: пакеты обновлений npm
npm t: запустить тесты
npm ls: список установленных модулей
npm llили npm la: распечатать дополнительную информацию о пакете при перечислении модулей
Вы также можете установить несколько пакетов одновременно, например:
$ npm i express momemt lodash mongoose
Если вы хотите просмотреть все распространенные команды npm, просто выполните npm helpдля полного списка. Вы также можете узнать больше в нашей статье 10 советов и приемов, которые сделают вас
Выполнение пакетов с помощью npx
Вы также можете услышать разговоры о npx в своих путешествиях. Не путайте это с npm. Как мы узнали, npm — это инструмент для управления вашими пакетами, тогда как npx — это инструмент для выполнения пакетов. Он поставляется в комплекте с npm версии 5.2+.
Обычно npx используется для выполнения одноразовых команд. Например, представьте, что вы хотите запустить простой
npx
И это раскрутит сервер без установки
Подробнее о npx можно прочитать здесь.
Вывод
В этом уроке мы рассмотрели основы работы с npm. Мы продемонстрировали, как установить Node.js со страницы загрузки проекта, как изменить расположение глобальных пакетов (чтобы избежать использования sudo) и как устанавливать пакеты в локальном и глобальном режимах. Мы также рассмотрели удаление, обновление и установку определенной версии пакета, а также управление зависимостями проекта.
Отсюда вы можете сравнить npm и Yarn, чтобы выяснить, что лучше всего соответствует вашим потребностям. Вы можете справиться с более сложными задачами, используя nvm, Node Version Manager, или узнать, как размещать и публиковать частные пакеты npm. А если вам хочется изучить среду выполнения JavaScript следующего поколения, вы можете изучить Deno и прочитать о том, как работает управление пакетами Deno.
С каждым новым выпуском npm делает огромные успехи в мире