Статьи

Руководство для начинающих по npm — менеджер пакетов Node

Node.js позволяет писать приложения на JavaScript на сервере. Он построен на среде исполнения V8 JavaScript и написан на C ++ — так что это быстро. Первоначально он был задуман как серверная среда для приложений, но разработчики начали использовать его для создания инструментов, помогающих им в автоматизации локальных задач. С тех пор возникла целая новая экосистема инструментов, основанных на Node (таких как Grunt , Gulp и Webpack ), чтобы изменить облик фронт-энда.

Эта популярная статья была обновлена ​​в апреле 2019 года, чтобы отразить текущее состояние npm.

Чтобы использовать эти инструменты (или пакеты) в Node.js, мы должны иметь возможность устанавливать их и управлять ими полезным способом. Именно здесь приходит npm, менеджер пакетов Node. Он устанавливает пакеты, которые вы хотите использовать, и предоставляет удобный интерфейс для работы с ними.

В этой статье я расскажу об основах работы с npm. Я покажу вам, как устанавливать пакеты в локальном и глобальном режиме, а также удалять, обновлять и устанавливать определенную версию пакета. Я также покажу вам, как работать с package.json для управления зависимостями проекта. Если вы более любитель видео, почему бы не зарегистрироваться в SitePoint Premium и посмотреть наш бесплатный скринкаст: что такое npm и как я могу его использовать? ,

Но прежде чем мы сможем начать использовать npm, мы должны сначала установить Node.js в нашей системе. Давайте сделаем это сейчас …

Установка Node.js

Перейдите на страницу загрузки Node.js и получите нужную версию. Доступны установщики Windows и Mac, а также предварительно скомпилированные двоичные файлы Linux и исходный код. Для Linux вы также можете установить Node через менеджер пакетов, как описано здесь .

Для этого урока мы будем использовать v10.15.3 Stable. На момент написания статьи это текущая версия Node долгосрочной поддержки (LTS) .

Совет : Вы можете также рассмотреть возможность установки Node с помощью менеджера версий . Это устраняет проблему с разрешениями, поднятую в следующем разделе.

Посмотрим, где был установлен узел и проверим версию.

 $ which node /usr/bin/node $ node --version v10.15.3 

Чтобы убедиться, что ваша установка прошла успешно, давайте попробуем Node’s 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 Exit the repl .help Show repl options .load Load JS from a file into the REPL session .save Save all evaluated commands in this REPL session to a file > .exit 

Установка Node.js сработала, поэтому мы можем сосредоточить наше внимание на npm, который был включен в установку.

 $ which npm /usr/bin/npm $ npm --version 6.4.1 

Обновление npm

npm, который является менеджером пакетов Node.js, является отдельным проектом от Node.js. Это имеет тенденцию обновляться чаще. Вы можете проверить последнюю доступную версию npm на этой странице . Если вы понимаете, что у вас более старая версия, вы можете обновить ее следующим образом.

Для пользователей Linux и Mac используйте следующую команду:

 npm install npm@latest -g 

Для пользователей Windows никогда не запускайте вышеуказанную команду. Если у вас уже есть, вы не сможете обновить npm. Вам придется удалить всю установку Node.js и установить заново. Чтобы правильно обновить npm в Windows, вам нужно будет сделать следующее. Сначала откройте PowerShell от имени администратора и выполните следующую команду:

 Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force 

Это обеспечит выполнение сценариев в вашей системе. Далее вам нужно будет установить утилиту npm-windows-upgrade . После того, как вы установили инструмент, вам нужно запустить его, чтобы он мог обновить npm для вас. Делайте все это в приподнятой консоли PowerShell.

 npm install --global --production npm-windows-upgrade npm-windows-upgrade --npm-version latest 

Node Packaged Modules

npm может устанавливать пакеты в локальном или глобальном режиме. В локальном режиме он устанавливает пакет в папку node_modules в вашем родительском рабочем каталоге. Это местоположение принадлежит текущему пользователю. Глобальные пакеты устанавливаются в {prefix}/lib/node_modules/ который принадлежит root (где {prefix} обычно /usr/ или /usr/local ). Это означает, что вам придется использовать sudo для глобальной установки пакетов, что может привести к ошибкам разрешений при разрешении сторонних зависимостей, а также к проблемам безопасности. Давайте изменим это:

Компания по доставке посылок
Время управлять этими пакетами

Изменение местоположения глобальных пакетов

Посмотрим, что нам даст выходной npm config .

 $ npm config list ; cli configs user-agent = "npm/6.9.0 node/v10.15.3 linux x64" ; userconfig /home/sitepoint/.npmrc prefix = "/home/sitepoint/.node_modules_global" ; node bin location = /usr/bin/nodejs ; cwd = /home/sitepoint ; HOME = /home/sitepoint ; "npm config ls -l" to show all defaults. 

Это дает нам информацию о нашей установке. На данный момент важно получить текущее глобальное местоположение.

 $ npm config get prefix /usr 

Это префикс, который мы хотим изменить, чтобы установить глобальные пакеты в нашем домашнем каталоге. Для этого создайте новый каталог в вашей домашней папке.

 $ cd ~ && mkdir .node_modules_global $ npm config set prefix=$HOME/.node_modules_global 

С этим простым изменением конфигурации мы изменили местоположение, в которое устанавливаются глобальные пакеты Node. Это также создает файл .npmrc в нашем домашнем каталоге.

 $ npm config get prefix /home/sitepoint/.node_modules_global $ cat .npmrc prefix=/home/sitepoint/.node_modules_global 

У нас все еще есть npm, установленный в корневом каталоге. Но поскольку мы изменили наше глобальное местоположение пакета, мы можем воспользоваться этим. Нам нужно установить npm снова, но на этот раз в новом пользовательском расположении. Это также установит последнюю версию npm.

 npm install npm@latest -g 

Наконец, нам нужно добавить .node_modules_global/bin в нашу $PATH среды $PATH , чтобы мы могли запускать глобальные пакеты из командной строки. Для этого добавьте следующую строку в ваш .profile , .bash_profile или .bashrc и перезапустите свой терминал.

 export PATH="$HOME/.node_modules_global/bin:$PATH" 

Теперь наш .node_modules_global/bin будет найден первым и будет использована правильная версия npm.

 $ which npm /home/sitepoint/.node_modules_global/bin/npm $ npm --version 6.9.0 

Установка пакетов в глобальном режиме

На данный момент у нас только один пакет установлен глобально — это сам пакет npm. Итак, давайте изменим это и установим UglifyJS (инструмент минимизации JavaScript). Мы используем флаг --global , но его можно --global до -g .

 $ npm install uglify-js --global /home/sitepoint/.node_modules_global/bin/uglifyjs -> /home/sitepoint/.node_modules_global/lib/node_modules/uglify-js/bin/uglifyjs + uglify-js@3.5.3 added 3 packages from 38 contributors in 3.282s 

Как видно из вывода, устанавливаются дополнительные пакеты — это зависимости UglifyJS.

Список глобальных пакетов

Мы можем перечислить глобальные пакеты, которые мы установили, с помощью команды 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 .................... └─┬ uglify-js@3.5.3 ├── commander@2.19.0 └── source-map@0.6.1 

Вывод, однако, довольно многословен. Мы можем изменить это с --depth=0 .

 $ npm list -g --depth=0 /home/sitepoint/.node_modules_global/lib ├── npm@6.9.0 └── uglify-js@3.5.3 

Это лучше — только пакеты, которые мы установили вместе с их номерами версий.

Все пакеты, установленные глобально, станут доступны из командной строки. Например, вот как вы должны использовать пакет Uglify для минимизации example.js в example.min.js :

 $ uglifyjs example.js -o example.min.js 

Установка пакетов в локальном режиме

Когда вы устанавливаете пакеты локально, вы обычно делаете это с помощью файла package.json . Давайте продолжим и создадим.

 $ 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) 

Нажмите Enter, чтобы принять значения по умолчанию, затем нажмите « yes для подтверждения. Это создаст файл 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 в качестве сборки тоже l.

Теперь давайте попробуем установить Underscore .

 $ npm install underscore npm notice created a lockfile as package-lock.json. You should commit this file. npm WARN nodedemo@1.0.0 No description npm WARN nodedemo@1.0.0 No repository field. + underscore@1.9.1 added 1 package from 1 contributor and audited 1 package in 7.264s found 0 vulnerabilities 

Обратите внимание, что файл блокировки создан. Мы вернемся к этому позже.

Теперь, если мы посмотрим на package.json мы увидим, что было добавлено поле dependencies :

 { ... "dependencies": { "underscore": "^1.9.1" } } 

Управление зависимостями с помощью package.json

Как видите, Underscore v1.9.1 был установлен в нашем проекте. Знак ( ^ ) в начале номера версии указывает, что при установке npm извлечет самую верхнюю версию пакета, которую он может найти, где должна соответствовать только основная версия (если не package-lock.json файл package-lock.json ). ). В нашем случае это будет что-то ниже v2.0.0. Этот метод управления версиями (major.minor.patch) известен как семантическое управление версиями. Вы можете прочитать больше об этом здесь: Семантическое управление версиями: почему вы должны его использовать .

Также обратите внимание, что Underscore был сохранен как свойство поля dependencies . Это стало значением по умолчанию в последней версии npm и используется для пакетов (например, Underscore), необходимых для запуска приложения. Также было бы возможно сохранить пакет как devDependency , указав флаг --save-dev . devDependencies — это пакеты, используемые в целях разработки, например, для запуска тестов или переноса кода.

Вы также можете добавить private: true в package.json чтобы предотвратить случайную публикацию приватных репозиториев, а также подавить любые предупреждения, генерируемые при запуске npm install .

Безусловно, самой большой причиной использования package.json для определения зависимостей проекта является переносимость. Например, когда вы клонируете чужой код, все, что вам нужно сделать, это запустить npm i в корне проекта, и npm разрешит и выберет все необходимые пакеты для запуска приложения. Мы рассмотрим это более подробно позже.

Прежде чем закончить этот раздел, давайте быстро проверим, работает ли Underscore. Создайте файл с именем test.js в корневом test.js проекта и добавьте следующее:

 const _ = require("underscore"); console.log(_.range(5)); 

Запустите файл, используя node test.js и вы увидите node test.js [0, 1, 2, 3, 4] на экран.

Удаление локальных пакетов

npm — менеджер пакетов, поэтому он должен иметь возможность удалить пакет. Давайте предположим, что текущий пакет Underscore вызывает у нас проблемы с совместимостью. Мы можем удалить пакет и установить более старую версию, например так:

 $ npm uninstall underscore removed 2 packages in 0.107s $ npm list project@1.0.0 /home/sitepoint/project └── (empty) 

Установка определенной версии пакета

Теперь мы можем установить пакет Underscore в нужной нам версии. Мы делаем это, используя знак @ для добавления номера версии.

 $ npm install underscore@1.9.0 + underscore@1.9.0 added 1 package in 1.574s $ npm list project@1.0.0 /home/sitepoint/project └── underscore@1.9.0 

Обновление пакета

Давайте проверим, есть ли обновление для пакета Underscore:

 $ npm outdated Package Current Wanted Latest Location underscore 1.9.0 1.9.1 1.9.1 project 

Текущий столбец показывает нам версию, которая установлена ​​локально. Последняя колонка сообщает нам последнюю версию пакета. И столбец Wanted сообщает нам последнюю версию пакета, до которого мы можем обновиться, не нарушая существующий код.

Помните файл package-lock.json из ранее? Этот файл, представленный в npm v5, предназначен для обеспечения того, чтобы зависимости оставались одинаковыми на всех машинах, на которых установлен проект. Он автоматически генерируется для любых операций, в которых npm изменяет либо папку node_modules , либо файл package.json .

Вы можете пойти дальше и попробовать это, если хотите. Удалите папку node_modules , затем повторно запустите npm i . В последней версии npm будет установлена ​​Underscore v11.9.0 (поскольку это то, что указано в файле package-lock.json ). Более ранние версии будут загружаться в v1.9.1 из-за правил семантического контроля версий. В прошлом несовместимые версии пакетов были большой головной болью для разработчиков. Обычно это решалось с помощью файла npm-shrinkwrap.json который должен был быть создан вручную.

Теперь давайте предположим, что последняя версия Underscore исправила ошибку, которая была у нас ранее, и мы хотим обновить наш пакет до этой версии.

 $ npm update underscore + underscore@1.9.1 updated 1 package in 0.236s $ npm list project@1.0.0 /home/sitepoint/project └── underscore@1.9.1 

Совет : чтобы это работало, Underscore должен быть указан как зависимость в package.json . Мы также можем выполнить npm update если у нас есть много устаревших модулей, которые мы хотим обновить.

Поиск пакетов

В этом уроке мы несколько раз использовали команду mkdir . Есть ли пакет узлов, который делает то же самое? Давайте использовать npm search .

 $ npm search mkdir NAME | DESCRIPTION | AUTHOR | DATE | VERSION mkdir | Directory creation… | =joehewitt | 2012-04-17 | 0.0.2 fs-extra | fs-extra contains… | =jprichardson… | 2018-11-07 | 7.0.1 make-dir | Make a directory… | =sindresorhus | 2019-04-01 | 3.0.0 ... 

Есть ( mkdirp ). Давайте установим это.

 $ npm install mkdirp + mkdirp@0.5.1 added 2 packages in 3.357s 

Теперь создайте файл mkdir.js и скопируйте и вставьте этот код:

 const mkdirp = require("mkdirp"); mkdirp("foo", function(err) { if (err) console.error(err); else console.log("Directory created!"); }); 

И запустить его из терминала:

 $ node mkdir.js Directory created! 

Переустановка зависимостей проекта

Давайте сначала установим еще один пакет:

 $ 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": "^0.5.1", "request": "^2.88.0", "underscore": "^1.9.1" }, 

Обратите внимание, что список зависимостей обновляется автоматически. В предыдущих версиях npm вам приходилось выполнять npm install request --save чтобы сохранить зависимость в package.json . Если вы хотите установить пакет без сохранения его в package.json , просто используйте аргумент --no-save .

Предположим, вы клонировали исходный код своего проекта на другой компьютер, и мы хотим установить зависимости. Давайте сначала node_modules папку node_modules затем выполним npm install

 $ rm -R node-modules $ npm list project@1.0.0 /home/sitepoint/project ├── UNMET DEPENDENCY mkdirp@^0.5.1 ├── UNMET DEPENDENCY request@^2.88.0 └── UNMET DEPENDENCY underscore@^1.9.1 npm ERR! missing: mkdirp@^0.5.1, 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.1, required by project@1.0.0 $ npm install added 51 packages from 60 contributors and audited 66 packages in 2.419s found 0 vulnerabilities 

Если вы посмотрите на папку node_modules , то увидите, что она снова воссоздается. Таким образом, вы можете легко делиться своим кодом с другими, не раздувая свои проекты и исходные хранилища зависимостями.

Управление кешем

Когда npm устанавливает пакет, он сохраняет копию, поэтому в следующий раз, когда вы захотите установить этот пакет, он не должен попадать в сеть. Копии кэшируются в каталоге .npm вашего домашнего каталога.

 $ ls ~/.npm anonymous-cli-metrics.json _cacache index-v5 _locks _logs node-sass 

Этот каталог со временем будет захламлен старыми пакетами, поэтому полезно время от времени очищать его.

 $ npm cache clean --force 

Вы также можете удалить все папки node_module из вашей рабочей области, если в вашей системе есть несколько проектов узлов, которые вы хотите очистить.

 find . -name "node_modules" -type d -exec rm -rf '{}' + 

аудит

В npm была представлена ​​новая функция, которая позволяет разработчикам сканировать зависимости на наличие известных уязвимостей безопасности. Давайте попробуем эту функцию, установив старую версию express .

 $ npm install express@4.8.0 express@4.8.0 added 36 packages from 24 contributors and audited 123 packages in 15.97s found 21 vulnerabilities (8 low, 9 moderate, 4 high) run `npm audit fix` to fix them, or `npm audit` for details 

Как только мы закончим установку, мы получим быстрый отчет о том, что было обнаружено несколько уязвимостей. Вы можете запустить команду npm audit для просмотра более подробной информации.

 $ npm run audit === npm audit security report === # Run npm install express@4.16.4 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 │ cookie-signature │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Dependency of │ express │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Path │ express > cookie-signature │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ More info │ https://nodesecurity.io/advisories/134 │ └───────────────┴──────────────────────────────────────────────────────────────┘ 

Вы получите подробный список пакетов с уязвимостями. Если вы посмотрите на поле «Путь», оно показывает путь зависимости. Например, «Путь express > accepts > negotiator означает, что «Экспресс» зависит от пакета « Accepts . Пакет Accepts зависит от negotiator который содержит уязвимость.

Есть два способа решения всех этих проблем. Мы можем либо выполнить команду npm install express@4.16.4 как предложено, либо запустить npm audit fix . Давайте сделаем последнее:

 $ npm audit fix + express@4.16.4 added 15 packages from 11 contributors, removed 8 packages and updated 28 packages in 5.302s fixed 21 of 21 vulnerabilities in 123 scanned packages 

Как видно из приведенного выше отчета, все уязвимости устранены. npm audit fix команды npm audit fix просто обновило затронутые пакеты до последних версий. Тем не менее, обратите внимание, что не все уязвимости могут быть исправлены автоматически. Это может произойти, если вы используете пакет, который претерпел серьезные изменения, которые могут нарушить ваш текущий проект в случае его обновления. В таких ситуациях вам придется пересмотреть свой код и выполнить обновление вручную.

Вы также можете запустить npm audit fix --force если вы не против обновить пакеты с помощью критических изменений. После выполнения команды запустите npm audit чтобы убедиться, что все уязвимости устранены.

Псевдонимы

Как вы могли заметить, существует несколько способов запуска команд npm. Вот краткий список некоторых часто используемых псевдонимов npm:

  • npm i <package> — установить локальный пакет
  • npm i -g </package><package> — установить глобальный пакет
  • npm un </package><package> — удалить локальный пакет
  • npm up — пакеты обновлений npm
  • npm t — запустить тесты
  • npm ls — список установленных модулей
  • npm ll или npm la — выводить дополнительную информацию о пакете при перечислении модулей

Вы также можете установить несколько пакетов одновременно, как это:

 $ npm i express momemt lodash mongoose body-parser webpack 

Если вы хотите изучить все распространенные команды npm, просто выполните npm help для получения полного списка. Вы также можете узнать больше в нашей статье 10 советов и хитростей, которые сделают вас ниндзя npm .

Менеджеры версий

Существует несколько доступных инструментов, которые позволяют вам управлять несколькими версиями Node.js на одном компьютере. Одним из таких инструментов является п . Другим таким инструментом является nvm (Node Version Manager). Если вы работаете в Windows, вы можете проверить nvm для Windows Если это то, что вас интересует, почему бы не проверить наш учебник: Установите несколько версий Node.js, используя nvm .

Вывод

В этом уроке я рассмотрел основы работы с npm. Я продемонстрировал, как установить Node.js со страницы загрузки проекта, как изменить расположение глобальных пакетов (чтобы мы могли избежать использования sudo ) и как устанавливать пакеты в локальном и глобальном режиме. Я также рассмотрел удаление, обновление и установку определенной версии пакета, а также управление зависимостями проекта. Если вы хотите узнать больше о новых функциях в последних выпусках, вы можете посетить страницу релизов npm Github .

С версией 5 npm делает огромные шаги в мире фронт-энда. Согласно своему операционному директору , его пользовательская база меняется, и большинство тех, кто его использует, вообще не используют его для написания Node. Скорее он становится инструментом, который люди используют для объединения JavaScript на внешнем интерфейсе (серьезно, вы можете использовать его для установки практически всего), и становится неотъемлемой частью написания современного JavaScript. Вы используете npm в своих проектах? Если нет, то сейчас самое время начать.

Эта статья была рецензирована Грэмом Коксом . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!