Как установить зависимости npm из package json
Кроме встроенных и кастомных модулей Node.js существует огромный пласт различных библиотек и фреймворков, разнообразных утилит, которые создаются сторонними производителями и которые также можно использовать в проекте, например, express, grunt, gulp и так далее. И они тоже нам доступны в рамках Node.js. Чтобы удобнее было работать со всеми сторонними решениями, они распространяются в виде пакетов. Пакет по сути представляет набор функциональностей.
Для автоматизации установки и обновления пакетов, как правило, применяется система управления пакетами или менеджеры. Непосредственно в Node.js для этой цели используется пакетный менеджер NPM (Node Package Manager). NPM по умолчанию устанавливается вместе с Node.js, поэтому ничего доустанавливать не требуется. Но можно обновить установленную версию до самой последней. Для этого в командной строке/терминале надо запустить следующую команду:
npm install npm@latest -g
Чтобы узнать текущую версию npm, в командной строке/терминале надо ввести следующую команду:
npm -v
Для нас менеджер npm важен в том плане, что с его помощью легко управлять пакетами.
Установка пакетов
Для установки пакета через npm применяется команда npm install , после которой указываются пакеты
npm install имя_пакета1 имя_пакета2 имя_пакетаN
В качестве демонстрации будем устанавливать пакет lodash . Lodash представляет собой библиотеку, которая позволяет манипулировать данными, в частности, массивами. Кому интересно, может подробнее узнать на официальном сайте библиотеки — https://lodash.com/.
Допустим, для проекта где-нибудь в файловой системе определим каталог app и перейдем в терминале/командной строке к папке проекта с помощью команды cd . Затем для установки Lodash в проект введем команду
npm install lodash
После установки express в папке проекта app появится подпапка node_modules , в которой будут хранится все установленные внешние модули. В частности, в подкаталоге node_modules/lodash будут располагаться файлы библиотеки Lodash.
Кроме того, при установке пакета в папку проекта добавляется файл package.json . После добавления lodash в нашем случае он будет иметь примерно следующий вид:
Файл package.json представляет собой объект-конфигурацию в формате json, где каждое свойство представляет отдельную секцию. Так, здесь определена секция «dependencies», которая хранит установленные пакеты. И здесь мы видим, что у нас установлен пакет «lodash», а версия пакета — «^4.17.21».
Также в проекте создан еще один файл — package-lock.json . Этот файл автоматически генерируется при любых операциях, в которых npm изменяет файл package.json и структуру каталогов/файлов в каталоге node_modules . Данный файл упрощает для npm управление пакетами.
После установке библиотеки lodash мы можем ее использовать. Так, определим в папке проекта файл app.js со следующим кодом:
const lodash = require("lodash") const people = ["Tom", "Sam", "Bob"]; const employees = ["Tom", "Alice", "Sam"]; // объединение массивов - в результате только уникальные значения const result1 = lodash.union(people, employees); console.log(result1); // [ "Tom", "Sam", "Bob", "Alice" ] // пересечение массивов - в результате только общие значения const result2 = lodash.intersection(people, employees); console.log(result2); // [ "Tom", "Sam" ]
Поскольку мы установили библиотеку lodash через npm, то мы можем получить соответствующий модуль через выражение require :
const lodash = require("lodash")
Затем мы можем обращаться к функциям этого модуля. Для демонстрации здесь применяется функция uninon , которая объединяет два массива (множества) и возвращает новое множество только с уникальными значениями. А функция intersection() также применяется к массивам, но возвращает множество, которое содержит только общие для всех массивов элементы.
В консоли запустим файл app.js командой node app.js :
c:\app> node app.js [ "Tom", "Sam", "Bob", "Alice" ] [ "Tom", "Sam" ] c:\app>
Если через какое-то время нам больше не нужен пакет, его можно удалить командой npm uninstall , которой передаются удаляемые пакеты
npm uninstall пакет1 пакет2 пакетN
Например, удалим ранее установленный lodash:
npm uninstall lodash
Если после удаления мы откроем папку node_modules , то увидим, что она пустая. И также изменится файл package.json — он будет содержать пустой объект:
Получение информации о пакете
С помощью команды npm info [пакет] можно получить информацию об определенном пакете. Например, получим информацию о пакете lodash:
c:\app> npm info lodash lodash@4.17.21 | MIT | deps: none | versions: 114 Lodash modular utilities. https://lodash.com/ keywords: modules, stdlib, util dist .tarball: https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz .shasum: 679591c564c3bffaae8454cf0b3df370c3d6911c .integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== .unpackedSize: 1.4 MB maintainers: - mathias - jdalton - bnjmnt4n dist-tags: latest: 4.17.21 published over a year ago by bnjmnt4n c:\app>
Здесь мы видим большой массив данных типа версии, лицензии, кто поддерживает, кто и когда опубликовал, размер пакета, домашнюю страницу.
NPM. Package.json. Установка модулей. Определение команд¶
Кроме встроенных и кастомных модулей Node.js существует огромный пласт различных библиотек и фреймворков, разнообразных утилит, которые создаются сторонними производителями и которые также можно использовать в проекте, например, express, grunt, gulp и так далее. И они тоже нам доступны в рамках Node.js. Чтобы удобнее было работать со всеми сторонними решениями, они распространяются в виде пакетов. Пакет по сути представляет набор функциональностей.
Для автоматизации установки и обновления пакетов, как правило, применяются систему управления пакетами или менеджеры. Непосредственно в Node.js для этой цели используется пакетный менеджер NPM (Node Package Manager). NPM по умолчанию устанавливается вместе с Node.js, поэтому ничего доустанавливать не требуется. Но можно обновить установленную версию до самой последней. Для этого в командной строке/терминале надо запустить следующую команду:
npm install npm@latest -g
Чтобы узнать текущую версию npm , в командной строке/терминале надо ввести следующую команду:
npm -v
Для нас менеджер npm важен в том плане, что с его помощью легко управлять пакетами. К примеру, создадим на жестком диске новую папку modulesapp (В моем случае папка будет находиться по пути C:\node\modulesapp ).
Далее для примера установим в проект express . Express представляет легковесный веб-фреймворк для упрощения работы с Node.js. В данном случае мы не будем пока подробно рассматривать фреймворк Express, так как это отдельная большая тема. А используем его лишь для того, чтобы понять, как устанавливаются сторонние модули в проект.
Для установки функциональности Express в проект вначале перейдем к папке проекта с помощью команды cd . Затем введем команду
npm install express
После установки express в папке проекта modulesapp появится подпапка node_modules , в которой будут храниться все установленные внешние модули. В частности, в подкаталоге node_modules/express будут располагаться файлы фреймворка Express.
Далее определим файл простейшего сервера. Для этого в корневую папку проекта modulesapp добавим новый файл app.js :
1 2 3 4 5 6 7 8 9 10 11
// получаем модуль Express const express = require('express'); // создаем приложение const app = express(); // устанавливаем обработчик для маршрута "/" app.get('/', function (request, response) response.end('Hello from Express!'); >); // начинаем прослушивание подключений на 3000 порту app.listen(3000);
Первая строка получает установленный модуль express , а вторая создает объект приложения.
В Express мы можем связать обработку запросов с определенными маршрутами. Например, / — представляет главную страницу или корневой маршрут. Для обработки запроса вызывается функция app.get() . Первый параметр функции — маршрут, а второй — функция, которая будет обрабатывать запрос по этому маршруту.
И чтобы сервер начал прослушивать подключения, надо вызвать метод app.listen() , в который передается номер порта.
Запустим сервер командой node app.js :
И в адресной строке браузера введем адрес http://localhost:3000/ :
Файл package.json¶
Для более удобного управления конфигурацией и пакетами приложения в npm применяется файл конфигурации package.json . Так, добавим в папку проекта modulesapp новый файл package.json :
1 2 3 4
"name": "modulesapp", "version": "1.0.0" >
Здесь определены только две секции: имя проекта — modulesapp и его версия — 1.0.0 . Это минимально необходимое определение файла package.json . Данный файл может включать гораздо больше секций. Подробнее можно посмотреть в документации.
Далее удалим из проекта каталог node_modules . То есть в папке проекта modulesapp будут два файла app.js и package.json .
Теперь снова добавим express с помощью следующей команды:
npm install express --save
Флаг —save указывает, что информацию о добавленном пакете надо добавить в файл package.json .
И после выполнения команды, если мы откроем файл package.json , то мы увидим информацию о пакете:
1 2 3 4 5 6 7
"name": "modulesapp", "version": "1.0.0", "dependencies": "express": "^4.14.0" > >
Информация обо всех добавляемых пакетах, которые используются при запуске приложения, добавляется в секцию dependencies .
Файл package.json играет большую роль и может облегчить разработку в различных ситуациях. Например, при размещении в разных репозиториях нередко мы ограничены выделяемым дисковым пространством, тогда как папка node_modules со всеми загруженными пакетами может занимать довольно приличное пространство. В этом случае удобнее разместить основной код проекта без node_modules . В этом случае мы можем определить все пакеты в файле package.json , а затем для загрузки всех пакетов выполнить команду
npm install
Эта команда возьмет определение всех пакетов из секций dependencies и загрузит их в проект.
devDependencies¶
Кроме пакетов, которые применяются в приложении, когда оно запущено, например, express, то есть в состоянии «production», есть еще пакеты, которые применяются при разработке приложения и его тестировании. Такие пакеты добавляются в другую секцию — devDependencies . В вышеприведенном примере она не определена, но если бы мы добавили какой-нибудь grunt или gulp, то они бы были именно в секции devDependencies .
Например, загрузим в проект пакет jasmine-node , который используется для тестирования приложения:
npm install jasmine-node --save-dev
Флаг —save-dev указывается, что информацию о пакете следует сохранить в секции devDependencies файла package.json :
1 2 3 4 5 6 7 8 9 10
"name": "modulesapp", "version": "1.0.0", "dependencies": "express": "^4.14.0" >, "devDependencies": "jasmine-node": "^1.14.5" > >
Удаление пакетов¶
Для удаления пакетов используется команда npm uninstall . Например:
npm uninstall express
Эта команда удаляет пакет из папки node_modules , в то же время в файле package.json информация о данном пакете остается. Чтобы удалить информацию также и из package.json , применяется флаг —save :
npm uninstall express --save
Семантическое версионирование¶
При определении версии пакета применяется семантическое версионирование. Номер версии, как правило, задается в следующем формате major.minor.patch . Если в приложении или пакете обнаружен какой-то баг и он исправляется, то увеличивается на единицу число patch . Если в пакет добавляется какая-то новая функциональность, которая совместима с предыдущей версией пакета, то это небольшое изменение, и увеличивается число minor . Если же в пакет вносятся какие-то большие изменения, которые несовместимы с предыдущей версией, то увеличивается число major . То есть глядя на разные версии пакетов, мы можем предположить, насколько велики в них различия.
В примере с express версия пакета содержала, кроме того, дополнительный символ карет: ^4.14.0 . Этот символ означает, что при установке пакета в проект с помощью команды npm install будет устанавливаться последняя доступная версия от 4.14.0 . Фактически это будет последняя доступная версия в промежутке от 4.14.0 до 5.0.0 ( >=4.14.0 и
Команды npm¶
NPM позволяет определять в файле package.json команды, которые выполняют определенные действия. Например, определим следующий файл app.js :
1 2 3 4 5
let name = process.argv[2]; let age = process.argv[3]; console.log('name: ' + name); console.log('age: ' + age);
В данном случае мы получаем переданные при запуске приложению параметры.
И определим следующий файл package.json :
1 2 3 4 5 6 7 8
"name": "modulesapp", "version": "1.0.0", "scripts": "start": "node app.js", "dev": "node app.js Tom 26" > >
Здесь добавлена секция scripts , которая определяет две команды. Вообще команд может быть много в соответствии с целями и задачами разработчика.
Первая команда называется start . Она по сути выполняет команду node app.js , которая выполняет код в файле app.js
Вторая команда называется dev . Она также выполняет тот же файл, но при этом также передает ему два параметра.
Названия команд могут быть произвольными. Но здесь надо учитывать один момент. Есть условно говоря зарезервированные названия для команд, например, start , test , run и ряд других. Их не очень много. И как раз первая команда из выше определенного файла package.json называется start . И для выполнения подобных команд в терминале/командной строке надо выполнить команду
npm [название_команды]
Например, для запуска команды start
Как установить зависимости с прошлого проекта в новый package.json?
Команды —save нет, есть —save-prod (которая не нужна, т.к. по умолчанию).
—save-dev — очевидно, устанавливает devDependencies.
Зависимости для разработки идут в devDependencies, зависимости для самого приложения в dependencies(по умолчанию). Для локальной разработки разницы никакой(кроме организации) — все они летят кучей в node_modules, однако если вы делаете свой готовый модуль для npm, то при установке такого модуля будут установлены только обычные dependencies.
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Дмитрий Беляев @bingo347 Куратор тега Node.js
Crazy on performance.
npm i это короткий вариант npm install
Без параметров он устанавливает зависимости из package.json и если есть файл package-lock.json, то нормализует папку node_modules по нему.
npm i name установит пакет name версии отмеченной тегом latest (тэг по умолчанию)
npm i name@tag установит пакет name версии отмеченной тегом tag
npm i name@5 установит пакет name версии 5.x.x где x.x — последний из 5
npm i name@5.3 установит пакет name версии 5.3.x где x — последний из 5.3
npm i name@5.3.1 установит пакет name версии 5.3.1
параметр —save или его короткий вариант -S сохранит зависимость в package.json в секции dependencies, с некоторых пор это поведение по умолчанию при наличии package.json
параметр —save-dev или его короткий вариант -D сохранит зависимость в package.json в секции devDependencies
А как устанавливать в Вашем конкретном случае можете решить только Вы.
Конфигурация package.json
Если вы разрабатываете приложение Node.js с большим количеством пакетов npm, нередко возникают предупреждения или ошибки при выполнении сборки проекта, если один пакет или несколько были обновлены. Иногда это возникает из-за конфликта версий или версия пакета является нерекомендуемой. Вот несколько советов по настройке файла package.json и поиску причин предупреждений или ошибок. Это не полное руководство по package.json. Здесь описывается только управление версиями пакета npm.
Система управления версиями пакета npm имеет строгие правила. Версии имеют следующий формат:
[major].[minor].[patch]
Предположим, у вас есть пакет в приложении с версией 5.2.1. Основная версия — 5, дополнительная версия — 2, версия исправления — 1.
- В обновлении основного номера версии пакет включает новые возможности, которые несовместимы с предыдущими версиями, то есть критические изменения.
- В обновлении дополнительного номера версии в пакет добавлены новые возможности, которые несовместимы с более ранними версиями пакета.
- В обновлении исправления включено одно исправление ошибок или несколько. Исправления ошибок всегда имеют обратную совместимость.
Стоит отметить, что некоторые компоненты пакета npm имеют зависимости. К примеру, чтобы использовать новую функцию пакета компилятора TypeScript (ts-loader) с webpack, возможно, придется также обновить пакет npm webpack и пакет webpack-cli.
Чтобы контролировать управление версиями, пакет npm поддерживает несколько нотаций, которые можно использовать в файле package.json. Вы можете использовать эти нотации для управления типом обновлений пакета, которые нужно принять в вашем приложении.
Предположим, вы используете React и должны включить пакеты npm react и react-dom. Существует несколько способов указать эти сведения в файле package.json. Например, вы можете указать точную версию пакета следующим образом.
"dependencies": < "react": "16.4.2", "react-dom": "16.4.2", >,
Благодаря предыдущей нотации npm всегда получает указанную версию, 16.4.2.
Чтобы ограничить обновления только исправлениями (исправлениями ошибок), можно использовать специальные нотации. В этом примере:
"dependencies": < "react": "~16.4.2", "react-dom": "~16.4.2", >,
вы используете символ тильды (~), чтобы указать пакету npm, что нужно обновлять пакет только исправлениями. Таким образом, npm может обновить react 16.4.2 до 16.4.3 (или 16.4.4, и т. д.), но он не будет принимать обновления основного или дополнительного номера версии. Версия 16.4.2 не будет обновлена до 16.5.0.
Также можно использовать символ вставки (^), чтобы npm мог обновлять дополнительный номер версии.
"dependencies": < "react": "^16.4.2", "react-dom": "^16.4.2", >,
Благодаря этой нотации npm может обновить react 16.4.2 до 16.5.0 (или 16.5.1, 16.6.0 и т. д.), но он не будет принимать обновления основного номера версии. Версия 16.4.2 не будет обновлена до 17.0.0.
Когда npm обновляет пакеты, создается файл package-lock.json, содержащий списки фактических версий пакета npm, используемых в приложении, включая все вложенные пакеты. Хотя package.json контролирует прямые зависимости для приложения, он не управляет вложенными зависимостями (другими пакетами npm, необходимыми для определенного пакета npm). Вы можете использовать файл package-lock.json в цикле разработки, если вам необходимо убедиться, что другие разработчики и тестировщики используют те же пакеты, что и вы, включая вложенные пакеты. Дополнительные сведения см. в разделе package-lock.json в документации по npm.
Для Visual Studio файл package-lock.json не добавляется в проект, но его можно найти в папке проекта.
Обратная связь
Были ли сведения на этой странице полезными?