Skip to content

Instantly share code, notes, and snippets.

@if0rest
Last active April 23, 2021 11:06
Show Gist options
  • Save if0rest/fb997625a85d0a796819f1540773afb5 to your computer and use it in GitHub Desktop.
Save if0rest/fb997625a85d0a796819f1540773afb5 to your computer and use it in GitHub Desktop.

ИНИЦИАЛИЗАЦИЯ ПРОЕКТА

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-пакетов, включая их зависимости:

> npm list

/Users/flavio/dev/node/cowsay
└─┬ cowsay@1.3.1
  ├── get-stdin@5.0.1
  ├─┬ optimist@0.6.1
  │ ├── minimist@0.0.10
  │ └── wordwrap@0.0.3
  ├─┬ string-width@2.1.1
  │ ├── is-fullwidth-code-point@2.0.0
  │ └─┬ strip-ansi@4.0.0
  │   └── ansi-regex@3.0.0
  └── strip-eof@1.0.0

То же самое можно узнать и просмотрев файл 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 можно, воспользовавшись следующей конструкцией:

npm install <package>@<version>

Указывать версии можно и устанавливая глобальные пакеты:

npm install -g webpack@4.16.4

Когда вы устанавливаете пакет командой вида 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

Сейчас мы поговорим об одной весьма мощной команде, npx, которая появилась в npm 5.2. Одной из её возможностей является запуск исполняемых файлов, входящих в состав npm-пакетов. Мы уже рассматривали использование npx для запуска подобного файла из пакета cowsay. Теперь поговорим об этом подробнее.

ИСПОЛЬЗОВАНИЕ NPX ДЛЯ УПРОЩЕНИЯ ЗАПУСКА ЛОКАЛЬНЫХ КОМАНД

Node.js-разработчики опубликовали множество исполняемых файлов (утилит) в виде пакетов, которые предполагалось устанавливать глобально, что обеспечивало удобный доступ к их возможностям, так как запускать их из командной строки можно было, просто введя имя соответствующей команды. Однако работать в такой среде было весьма некомфортно в том случае, если требовалось устанавливать разные версии одних и тех же пакетов. Применение команды вида npx commandname приводит к автоматическому поиску нужного файла в папке проекта node_modules. Это избавляет от необходимости знания точного пути к подобному файлу. Так же это делает ненужной глобальную установку пакета с обеспечением доступа к нему из любого места файловой системы благодаря использованию системной переменной PATH.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment