В чем разница между --save и --save-dev?
В чем разница между следующими командами:
npm install [package_name]
и:
npm install [package_name] --save
и:
npm install [package_name] --save-dev
Что это означает? Каков реальный эффект опций --save
и --save-dev
? Нужно ли использовать их в современных версиях npm?
5 ответ(ов)
В npm
есть два основных флага, которые используются при добавлении пакетов:
--save-dev
— этот флаг используется для сохранения пакета в качестве зависимости для разработки. Например, это может быть полезно для таких задач, как юнит-тестирование или минификация кода.--save
— с помощью этого флага вы можете сохранить пакет, который необходим для работы вашего приложения. Эти зависимости будут установлены на продакшн-сервере, так как они критически важны для выполнения приложения.
Таким образом, используйте --save-dev
для инструментов разработки, а --save
для пакетов, необходимых для работы вашего приложения в продакшен-окружении.
Давайте приведем пример.
Вы являетесь разработчиком очень СЕРЬЕЗНОЙ npm-библиотеки, которая использует разные библиотеки для тестирования пакета. Пользователи загружают вашу библиотеку и хотят использовать ее в своем коде. Нужно ли им загружать ваши библиотеки для тестирования? Может быть, вы используете jest
для тестирования, а они предпочитают mocha
. Нужно ли им устанавливать jest
просто для того, чтобы использовать вашу библиотеку?
Нет, верно? Именно поэтому они находятся в devDependencies
.
Когда кто-то выполняет команду npm i yourPackage
, будут установлены только библиотеки, необходимые для ИСПОЛНЕНИЯ вашей библиотеки. Другие библиотеки, которые вы использовали для сборки кода или тестирования и имитации, не будут установлены, так как вы поместили их в devDependencies
. Звучит удобно, не правда ли?
Теперь, почему разработчики должны указывать devDependencies?
Предположим, что ваша библиотека — это open-source проект, и сотни людей отправляют pull-запросы к вашей библиотеке. Как они будут тестировать пакет? Они сделают git clone
вашего репозитория, и когда они выполнят npm i
, будут установлены как dependencies, так и devDependencies.
Поскольку они не используют вашу библиотеку в привычном смысле, а разрабатывают ее дальше, им нужно пройти существующие тесты, а также написать новые. Таким образом, им необходимо использовать ваши devDependencies
, где содержатся все библиотеки для тестирования/сборки/имитации, которые использовали ВЫ.
Идеальным примером этого является:
$ npm install typescript --save-dev
В этом случае вы хотите установить TypeScript (язык программирования, который легко парсится JavaScript) для разработки, но после развертывания приложения он больше не нужен, так как весь код был транспилирован в JavaScript. Следовательно, нет смысла включать его в опубликованное приложение. На самом деле, это просто займет место и увеличит время загрузки.
Флаг --save-dev
сохраняет спецификацию версий (semver) в массиве "devDependencies" в вашем файле описания пакета (package.json), в то время как флаг --save
сохраняет её в массиве "dependencies".
--save-dev
используется для модулей, которые необходимы только на этапе разработки приложения и не требуются при его запуске в производственной среде. В свою очередь, --save
предназначен для добавления модулей в файл package.json, так как они нужны для работы приложения.
Например: модули такие как express, body-parser, lodash, helmet и mysql используются при запуске приложения, поэтому для их установки следует использовать --save
, чтобы добавить их в зависимости. Модули такие как mocha, istanbul, chai и sonarqube-scanner используются только в процессе разработки, поэтому их следует добавлять в devDependencies.
Также стоит отметить, что команды npm link
или npm install
установят как зависимости, так и dev-зависимости в вашей папке проекта.
Как узнать версию установленного npm пакета?
Как вывести список установленных пакетов npm?
Как предотвратить установку "devDependencies" модулей NPM для Node.js (package.json)?
Ошибка "npm WARN package.json: Нет поля repository"
nvm постоянно "забывает" Node.js в новой сессии терминала