339 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			339 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
---
 | 
						||
title: NPM
 | 
						||
localeTitle: NPM
 | 
						||
---
 | 
						||
## NPM
 | 
						||
 | 
						||
Node.js позволяет писать приложения в JavaScript на сервере. Он построен на среде исполнения V8 JavaScript и написан на C ++ - так что это быстро. Первоначально он был предназначен как серверная среда для приложений, но разработчики начали использовать его для создания модулей, чтобы помочь им в локальной автоматизации задач. С тех пор вся новая экосистема инструментов, основанных на узлах, эволюционировала, чтобы трансформировать лицо переднего плана.
 | 
						||
 | 
						||
Чтобы использовать эти модули (или пакеты) в Node.js, мы должны иметь возможность устанавливать и управлять ими полезным способом. Здесь приходит npm, менеджер пакетов Node. Он устанавливает пакеты, которые вы хотите использовать, и предоставляет полезный интерфейс для работы с ними.
 | 
						||
 | 
						||
## Установка NPM
 | 
						||
 | 
						||
Чтобы установить `npm` мы должны загружать двоичные файлы Nodejs в вашем локальном envrionment. В двоичные файлы Node.js включена последняя версия npm. Чтобы убедиться, что:
 | 
						||
 | 
						||
```shell
 | 
						||
npm -v 
 | 
						||
 5.6.0 
 | 
						||
```
 | 
						||
 | 
						||
Node Package Manager (NPM) предоставляет две основные функции:
 | 
						||
 | 
						||
*   Интернет-хранилища для пакетов / модулей node.js, которые можно найти на `npmjs.com` .
 | 
						||
    
 | 
						||
*   Утилита командной строки для установки пакетов Node.js, управления версиями и управления зависимостями пакетов Node.js.
 | 
						||
    
 | 
						||
 | 
						||
## Установка модулей с использованием NPM
 | 
						||
 | 
						||
`npm` может устанавливать пакеты в локальном или глобальном режиме. По умолчанию NPM устанавливает любую зависимость в локальном режиме. В локальном режиме он устанавливает пакет в папку node\_modules в родительском рабочем каталоге. Это место принадлежит текущему пользователю. Глобальные пакеты устанавливаются в {prefix} `/lib/node_modules/` который принадлежит root, где {prefix} обычно `/usr/ or /usr/local` . Это означает, что вам придется использовать sudo для установки пакетов по всему миру, что может привести к ошибкам при разрешении сторонних зависимостей, а также к проблемам безопасности.
 | 
						||
 | 
						||
### Установка пакетов в глобальном режиме
 | 
						||
 | 
						||
Любые пакеты, установленные во всем мире, станут доступны из командной строки. Мы используем флаг -global или -g для установки пакетов по всему миру.
 | 
						||
 | 
						||
```shell
 | 
						||
$ npm install uglify-js --global 
 | 
						||
```
 | 
						||
 | 
						||
Мы можем перечислить глобальные пакеты, которые мы установили, с командой списка npm.
 | 
						||
 | 
						||
```shell
 | 
						||
$ npm list --global 
 | 
						||
 /usr/local/lib 
 | 
						||
 ├─┬ npm@5.6.0 
 | 
						||
 │ ├── abbrev@1.1.0 
 | 
						||
 │ ├── ansi-regex@2.1.1 
 | 
						||
 │ ├── ansicolors@0.3.2 
 | 
						||
 │ ├── ansistyles@0.1.3 
 | 
						||
 .................... 
 | 
						||
 └─┬ uglify-js@3.0.15 
 | 
						||
  ├─┬ commander@2.9.0 
 | 
						||
  │ └── graceful-readlink@1.0.1 
 | 
						||
  └── source-map@0.5.6 
 | 
						||
```
 | 
						||
 | 
						||
Однако вывод является довольно подробным. Мы можем изменить это с помощью опции --depth = 0.
 | 
						||
 | 
						||
```js
 | 
						||
$ npm list -g --depth=0 
 | 
						||
 /usr/local/lib 
 | 
						||
 ├── npm@5.6.0 
 | 
						||
 └── uglify-js@3.0.15 
 | 
						||
```
 | 
						||
 | 
						||
### Установка пакетов в локальном режиме
 | 
						||
 | 
						||
Когда вы устанавливаете пакеты локально, вы обычно делаете это с помощью файла package.json.
 | 
						||
 | 
						||
```shell
 | 
						||
npm install --save express 
 | 
						||
```
 | 
						||
 | 
						||
Теперь вы можете использовать этот модуль в своем js-файле, как показано ниже.
 | 
						||
 | 
						||
```js
 | 
						||
const express = require('express'); 
 | 
						||
```
 | 
						||
 | 
						||
Локальные модули далее делятся на два типа зависимостей: `devDepenednecies` и `dependencies` . Разница между этими двумя заключается в том, что devDependencies - это модули, которые необходимы только во время разработки, а зависимости - это модули, которые также требуются во время выполнения. Чтобы сохранить зависимость как devDependency при установке, нам нужно сделать `npm install --save-dev` , а не только `npm install --save` .
 | 
						||
 | 
						||
Хорошая стенограмма для установки devDependency, которую я люблю использовать, - `npm i -D` . Сокращение для сохранения регулярной зависимости - это `-S` вместо `-D` .
 | 
						||
 | 
						||
### Установка конкретной версии пакета
 | 
						||
 | 
						||
Для этого укажем версию пакета, которую мы хотим установить.
 | 
						||
 | 
						||
```shell
 | 
						||
$ npm install underscore@1.8.2 -S 
 | 
						||
```
 | 
						||
 | 
						||
Чтобы удалить глобальную зависимость, используйте флаг `-g` .
 | 
						||
 | 
						||
### Удаление локальных пакетов
 | 
						||
 | 
						||
npm - менеджер пакетов, поэтому он должен иметь возможность удалить пакет. Мы можем удалить пакет:
 | 
						||
 | 
						||
```shell
 | 
						||
$ npm uninstall underscore -S 
 | 
						||
```
 | 
						||
 | 
						||
Чтобы обновить глобальную зависимость, используйте флаг `-g` .
 | 
						||
 | 
						||
### Обновление пакета
 | 
						||
 | 
						||
Чтобы обновить пакет, вы можете:
 | 
						||
```
 | 
						||
$ npm update underscore -S 
 | 
						||
```
 | 
						||
 | 
						||
Чтобы проверить, доступно ли обновление для любого пакета, связанного с нашим проектом:
 | 
						||
 | 
						||
```shell
 | 
						||
$ npm outdated 
 | 
						||
 
 | 
						||
 Package     Current  Wanted  Latest  Location 
 | 
						||
 underscore    1.8.2   1.8.3   1.8.3  project 
 | 
						||
```
 | 
						||
 | 
						||
Текущий столбец показывает нам версию, установленную локально. Последняя колонка сообщает нам последнюю версию пакета. И столбец Wanted сообщает нам последнюю версию пакета, которую мы можем обновить, не нарушая существующий код.
 | 
						||
 | 
						||
## Управление зависимостями с помощью package.json
 | 
						||
 | 
						||
Если не использовать определенный флаг и установить модуль, например, `npm install express` будет устанавливать модуль в папке `node_modules` локально, но `package.json` который ведет записи обо всех зависимостях, которые мы используем в проекте, не будет обновляться с нашим добавлением. Таким образом, пакет будет специфичным для разработки, он не будет установлен в среде runtimme. Убедитесь, что вы всегда используете правильный флаг и сохраняете файл `package.json` .
 | 
						||
 | 
						||
Когда вы устанавливаете пакеты локально, вам нужен файл package.json. Для его создания вы можете сделать это, используя команду `npm init` . Это вызовет некоторые вопросы, которые, нажав enter, вы можете сохранить значения по умолчанию.
 | 
						||
 | 
						||
```shell
 | 
						||
$ 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) 
 | 
						||
```
 | 
						||
 | 
						||
Подумайте, что `package.json` является хранителем всех зависимостей или проявлением проекта Node.js. Если вам нужен более быстрый способ сгенерировать файл package.json, используйте `npm init --y` .
 | 
						||
 | 
						||
Список общих атрибутов в файле `package.json` :
 | 
						||
 | 
						||
*   name - имя пакета
 | 
						||
    
 | 
						||
*   версия - семантическая версия пакета
 | 
						||
    
 | 
						||
*   описание - описание пакета
 | 
						||
    
 | 
						||
*   домашняя страница - домашняя страница пакета
 | 
						||
    
 | 
						||
*   автор - автор пакета
 | 
						||
    
 | 
						||
*   вкладчики - имя вкладчиков в пакет
 | 
						||
    
 | 
						||
*   dependencies - список зависимостей. NPM автоматически устанавливает все зависимости, указанные здесь, в папке node\_module пакета.
 | 
						||
    
 | 
						||
*   devDependencies - список всех зависимостей, зависящих от разработки
 | 
						||
    
 | 
						||
*   репозиторий - тип репозитория и URL-адрес пакета
 | 
						||
    
 | 
						||
*   главная - точка входа пакета
 | 
						||
    
 | 
						||
*   ключевые слова - ключевые слова
 | 
						||
    
 | 
						||
*   лицензия - лицензия на ваш пакет, чтобы люди знали, как им разрешено использовать его, и любые ограничения, которые вы устанавливаете на него.
 | 
						||
    
 | 
						||
*   scripts - Свойство «scripts» - это словарь, содержащий команды скриптов, которые выполняются в разное время на жизненном цикле вашего пакета.
 | 
						||
    
 | 
						||
*   config - объект, который можно использовать для установки параметров конфигурации, используемых в сценариях пакета, которые сохраняются при обновлении.
 | 
						||
    
 | 
						||
 | 
						||
Пример:
 | 
						||
 | 
						||
```json
 | 
						||
{ 
 | 
						||
   "name": "express", 
 | 
						||
      "description": "Fast, unopinionated, minimalist web framework", 
 | 
						||
      "version": "4.11.2", 
 | 
						||
      "author": { 
 | 
						||
 
 | 
						||
         "name": "TJ Holowaychuk", 
 | 
						||
         "email": "tj@vision-media.ca" 
 | 
						||
      }, 
 | 
						||
 
 | 
						||
   "contributors": [{ 
 | 
						||
      "name": "Aaron Heckmann", 
 | 
						||
      "email": "aaron.heckmann+github@gmail.com" 
 | 
						||
   }, 
 | 
						||
 
 | 
						||
    ], 
 | 
						||
   "license": "MIT", "repository": { 
 | 
						||
      "type": "git", 
 | 
						||
      "url": "https://github.com/strongloop/express" 
 | 
						||
   }, 
 | 
						||
   "homepage": "https://expressjs.com/", "keywords": [ 
 | 
						||
      "express", 
 | 
						||
      "framework", 
 | 
						||
      "sinatra", 
 | 
						||
      "web", 
 | 
						||
      "rest", 
 | 
						||
      "restful", 
 | 
						||
      "router", 
 | 
						||
      "app", 
 | 
						||
      "api" 
 | 
						||
   ], 
 | 
						||
   "dependencies": { 
 | 
						||
      "serve-static": "~1.8.1", 
 | 
						||
 
 | 
						||
   }, 
 | 
						||
   "devDependencies": { 
 | 
						||
      "jade": "~1.9.1", 
 | 
						||
   }, 
 | 
						||
   "engines": { 
 | 
						||
      "node": ">= 0.10.0" 
 | 
						||
   }, 
 | 
						||
   "files": [ 
 | 
						||
      "LICENSE", 
 | 
						||
      "History.md", 
 | 
						||
      "Readme.md", 
 | 
						||
      "index.js", 
 | 
						||
      "lib/" 
 | 
						||
   ], 
 | 
						||
   "scripts": { 
 | 
						||
      "test": "mocha --require test/support/env 
 | 
						||
         --reporter spec --bail --check-leaks test/ test/acceptance/", 
 | 
						||
      "test-cov": "istanbul cover node_modules/mocha/bin/_mocha 
 | 
						||
         -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/", 
 | 
						||
      "test-tap": "mocha --require test/support/env 
 | 
						||
         --reporter tap --check-leaks test/ test/acceptance/", 
 | 
						||
      "test-travis": "istanbul cover node_modules/mocha/bin/_mocha 
 | 
						||
         --report lcovonly -- --require test/support/env 
 | 
						||
         --reporter spec --check-leaks test/ test/acceptance/" 
 | 
						||
   }, 
 | 
						||
 
 | 
						||
 } 
 | 
						||
```
 | 
						||
 | 
						||
## Скрипты npm
 | 
						||
 | 
						||
Скрипты `npm` используются для автоматизации повторяющихся задач. Например, создание вашего проекта, минимизация каскадных таблиц стилей (CSS) и JavaScript (JS). Сценарии также используются при удалении временных файлов и папок и т. Д. Они могут быть настроены и доступны через объект `scripts` в `package.json` .
 | 
						||
 | 
						||
```json
 | 
						||
{ 
 | 
						||
  "name": "super-cool-package", 
 | 
						||
  "version": "1.0.0", 
 | 
						||
  "scripts": {} 
 | 
						||
 } 
 | 
						||
```
 | 
						||
 | 
						||
Пример наиболее популярного сценария NPM:
 | 
						||
 | 
						||
```json
 | 
						||
"scripts": { 
 | 
						||
    "start": "node index.js", 
 | 
						||
    ... 
 | 
						||
 } 
 | 
						||
```
 | 
						||
 | 
						||
## npm Кэш
 | 
						||
 | 
						||
Когда npm устанавливает пакет, он сохраняет копию, поэтому в следующий раз, когда вы захотите установить этот пакет, ему не нужно попадать в сеть. Копии хранятся в каталоге .npm в домашнем каталоге.
 | 
						||
 | 
						||
```shell
 | 
						||
$ ls ~/.npm 
 | 
						||
 lodash.zipobject 
 | 
						||
 log-driver 
 | 
						||
 log-symbols 
 | 
						||
 logalot 
 | 
						||
 logfmt 
 | 
						||
 loglevel 
 | 
						||
 long-timeout 
 | 
						||
 longest 
 | 
						||
 longest-strea 
 | 
						||
```
 | 
						||
 | 
						||
С тех пор этот каталог будет загроможден старыми пакетами, поэтому иногда полезно его очищать.
 | 
						||
 | 
						||
```shell
 | 
						||
$ npm cache clean 
 | 
						||
```
 | 
						||
 | 
						||
## Пряжа - альтернатива гамме
 | 
						||
 | 
						||
Пряжа - также менеджер пакетов JavaScript, разработанный и поддерживаемый Facebook. Оба имеют общий уровень сходства, когда они приходят к их использованию. Предполагается, что он будет быстрее устанавливать зависимости, чем npm. Чтобы установить его:
 | 
						||
 | 
						||
```shell
 | 
						||
npm install -g yarn 
 | 
						||
```
 | 
						||
 | 
						||
Пряжа не намеревается заменить npm, больше похоже на улучшение на нем. Он использует один и тот же файл package.json и сохраняет зависимости от папки `node_modules/` . Чтобы инициализировать projcet, вы будете использовать:
 | 
						||
 | 
						||
```shell
 | 
						||
yarn init 
 | 
						||
```
 | 
						||
 | 
						||
### Добавление, обновление и устранение зависимостей
 | 
						||
 | 
						||
Добавление новой зависимости легко и похоже на npm:
 | 
						||
 | 
						||
```shell
 | 
						||
yarn add [package-name] 
 | 
						||
```
 | 
						||
 | 
						||
Если вам нужна конкретная версия пакета или тег, вы можете это сделать.
 | 
						||
 | 
						||
```shell
 | 
						||
yarn add express@4.14.1 
 | 
						||
```
 | 
						||
 | 
						||
Для зависимостей dev, одноранговых зависимостей и необязательных зависимостей вы передаете -dev -peer -optional соответственно.
 | 
						||
 | 
						||
```shell
 | 
						||
yarn add gulp --dev 
 | 
						||
```
 | 
						||
 | 
						||
Будет экономить gulp под devDependencies. Чтобы обновить или удалить пакет, вы просто заменяете команду add либо обновлением, либо удалением, за которым следует имя пакета.
 | 
						||
 | 
						||
```shell
 | 
						||
# upgrade a gulp from 3.9.1 to version 4 
 | 
						||
 yarn upgrade gulp@4.0 
 | 
						||
 
 | 
						||
 # remove a gulp 
 | 
						||
 yarn remove gulp 
 | 
						||
```
 | 
						||
 | 
						||
После каждой установки, обновления или удаления пряжа обновляет файл yarn.lock, который отслеживает точную версию пакета, установленную в каталоге node\_modules. Аналогичная функция была обновлена в npm. Теперь есть `package-lock.json` которые ведут себя точно так же, как и `yarn.lock` в новых версиях npm.
 | 
						||
 | 
						||
### Номера версий пакета и то, что они означают
 | 
						||
 | 
						||
Первый выпуск пакета npm всегда равен 1.0.0
 | 
						||
 | 
						||
Исправлены ошибки, или незначительные изменения увеличивали третью цифру, а hense 1.0.0 стал 1.0.1
 | 
						||
 | 
						||
Новые функции, которые не прерывают предыдущие версии пакета, увеличивают вторую цифру, hense 1.0.0 станет 1.1.0
 | 
						||
 | 
						||
Все изменения, которые нарушают предыдущие выпуски пакета, увеличивают первую цифру, hense 1.0.0 станет 2.0.0
 | 
						||
 | 
						||
Важно помнить об этом при обновлении пакетов, чтобы сохранить стабильный проект! |