npm: настройка зависимостей и скриптов в проектах Node.js
Работа с менеджером пакетов npm в Node.js
npm (Node Package Manager) является стандартным инструментом для управления зависимостями в проектах Node.js. Он позволяет устанавливать, обновлять, удалять и публиковать пакеты, а также управлять скриптами и версиями. Основная цель npm - упростить процесс работы с внешними модулями и их версионирование.
Как инициализировать проект и создать package.json?
Для начала работы с npm в проекте требуется файл package.json. Его можно создать интерактивно с помощью команды npm init.
npm initNode js https (https в node.js)
После ввода ключевых полей (имя, версия, описание, точка входа, тесты, репозиторий, лицензия) будет создан файл package.json. Если требуется автоматическое создание с значениями по умолчанию, используется флаг -y или --yes.
npm init -yNode js lts (версия node.js lts)
Пример полученного package.json:
{
"name": "my-project",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
Node js npm (менеджер пакетов npm в node.js)
Частая проблема: при вводе названия пакета с пробелами или заглавными буквами может возникнуть предупреждение о несовместимости с npm. Решение - использовать только строчные латинские буквы, дефисы или подчеркивания.
Как установить пакет и сделать его зависимостью?
Команда npm install (сокращённо npm i) устанавливает пакет и добавляет запись в package.json. Флаг --save (по умолчанию) помещает пакет в секцию dependencies. Для разработки (тесты, сборщики) используется флаг --save-dev, который добавляет пакет в devDependencies.
npm install express
npm install --save-dev jestNode js scripts (скрипты node.js)
После установки в папке node_modules появляются файлы пакета, а в package.json добавляются строки:
"dependencies": {
"express": "^4.18.2"
},
"devDependencies": {
"jest": "^29.5.0"
}
Типичная ошибка: если пакет уже установлен глобально и локально, может возникнуть конфликт версий. Рекомендуется всегда устанавливать зависимости локально для каждого проекта.
Как установить конкретную версию пакета?
Указание версии после символа @ позволяет зафиксировать нужную версию. Это полезно для стабильности проекта, когда новая версия может сломать функциональность.
npm install lodash@4.17.21
В package.json появится строка: "lodash": "4.17.21" (без каретки). Если требуется диапазон, используются символы ^ (разрешает минорные обновления) или ~ (только патчи).
Как удалить пакет из проекта?
Команда npm uninstall (сокращённо npm un) удаляет пакет из node_modules и из package.json. Флаги --save и --save-dev работают аналогично установке, но чаще всего удаление происходит с теми же флагами, которые использовались при установке.
npm uninstall express
Если пакет был в devDependencies, команда npm uninstall jest --save-dev удалит его и из devDependencies.
Возможная сложность: после удаления иногда остаются лишние версии в node_modules, если пакет был установлен как транзитивная зависимость. Для очистки используется npm prune.
Как обновить все пакеты до последних версий?
Команда npm update обновляет пакеты в соответствии с заданными в package.json диапазонами версий. Если нужно обновить конкретный пакет, указывается его имя.
npm update
npm update lodash
Для просмотра устаревших пакетов используется npm outdated.
Как установить пакет глобально?
Флаг -g или --global устанавливает пакет в системную область, доступную из любого проекта. Обычно глобально устанавливают утилиты командной строки (например, nodemon, eslint, typescript).
npm install -g nodemon
Для просмотра глобально установленных пакетов: npm list -g --depth=0.
Проблема: глобальные пакеты могут конфликтовать между версиями Node.js. Рекомендуется использовать nvm для управления версиями Node и устанавливать глобальные пакеты для каждой версии отдельно.
Как использовать npx для запуска пакетов без установки?
Утилита npx, входящая в состав npm (начиная с версии 5.2), позволяет запускать команды пакетов без их глобальной установки. Если пакет не установлен локально, npx загрузит его из реестра во временную директорию.
npx create-react-app my-app
npx cowsay "Hello, Node.js!"
После выполнения команды временный пакет удаляется. Это удобно для одноразовых задач и для избежания загрязнения системы.
Как опубликовать собственный пакет в npm?
Для публикации требуется аккаунт на npmjs.com и авторизация через npm login. После подготовки package.json (включая уникальное имя) выполняется npm publish.
npm login
# ввод логина, пароля и email
npm publish
Если пакет имеет область (scoped), например @username/package, нужно передать флаг --access public для публичной публикации.
Типичная ошибка: при повторной публикации с тем же номером версии возникает ошибка. Для исправления нужно увеличить версию в package.json с помощью npm version patch (или minor, major).
Как запускать скрипты, определённые в package.json?
В разделе scripts можно задать команды, которые затем вызываются через npm run <имя>. Особые имена (start, test, stop, restart) можно запускать без run.
"scripts": {
"dev": "node server.js",
"build": "webpack --mode production",
"lint": "eslint ."
}
npm run dev
npm test
npm run lint
Скрипты выполняются в оболочке, поэтому доступны все команды системы и программы из локальной папки node_modules/.bin.
Как работать с package-lock.json?
Файл package-lock.json автоматически создаётся при установке для фиксации точных версий всех зависимостей, включая транзитивные. Это гарантирует воспроизводимость установки на разных машинах.
Не рекомендуется редактировать этот файл вручную. Для обновления lock-файла используется npm update или npm install с новыми версиями.
npm install
Если lock-файл удалить, npm создаст новый на основе текущих установленных версий, что может привести к незначительным отличиям.
Дополнительно: команда npm cache clean --force для очистки кэша, npm audit для проверки безопасности зависимостей, npm ci для быстрой установки точно по lock-файлу (подходит для CI/CD).
Расширенные примеры работы с npm
Установка пакета с указанием диапазона версий
Пример установки пакета express с диапазоном, разрешающим только патч-обновления (тильда):
npm install express@~4.18.0
В package.json появится запись: "express": "~4.18.0". При будущем запуске npm update будут установлены только версии 4.18.x, но не 4.19.0.
Создание и использование локальной ссылки с npm link
Позволяет разрабатывать пакет локально и подключать его к другому проекту без публикации. В папке пакета:
cd ~/projects/my-local-package
npm link
Теперь в другом проекте:
cd ~/projects/my-app
npm link my-local-package
В папке node_modules появится символическая ссылка на локальный пакет. Изменения в исходном коде пакета сразу отражаются в проекте.
Для отмены используется npm unlink my-local-package или удаление ссылки в глобальной области: npm unlink -g my-local-package.
Упаковка пакета в tarball с помощью npm pack
Команда создаёт архив .tgz, который можно установить из файла:
npm pack
npm install ./my-package-1.0.0.tgz
Это удобно для передачи пакета без публикации в реестре. После упаковки выводится список файлов, включённых в архив.
Оптимизация node_modules с npm dedupe
При установке разных версий одного пакета npm может дублировать их. npm dedupe пытается поднять общие зависимости на верхний уровень, удаляя дубликаты:
npm dedupe
Команда анализирует дерево зависимостей и перемещает пакеты, чтобы минимизировать количество копий. Результат можно увидеть с помощью npm ls.
Использование npm audit для проверки безопасности
npm аудит сканирует зависимости на наличие известных уязвимостей и предлагает автоматические исправления:
npm audit
npm audit fix
Пример вывода:
=== npm audit security report === # Run npm install lodash@4.17.21 to resolve 1 vulnerability ┌───────────────┬─────────────────────────────────────────────────────┐ │ High │ Prototype Pollution │ ├───────────────┼─────────────────────────────────────────────────────┤ │ Package │ lodash │ ├───────────────┼─────────────────────────────────────────────────────┤ │ Resolution │ Upgrade to version 4.17.21 │ └───────────────┴─────────────────────────────────────────────────────┘
Работа с .npmrc и аутентификацией для приватных реестров
Файл .npmrc может содержать настройки реестров, токены авторизации. Пример для работы с GitHub Packages:
//npm.pkg.github.com/:_authToken=YOUR_TOKEN
@username:registry=https://npm.pkg.github.com
После этого можно устанавливать пакеты из приватного реестра: npm install @username/private-package.
Скрипты с передачей аргументов через npm
Аргументы можно передавать с помощью --:
"scripts": {
"greet": "echo Hello $NAME"
}
npm run greet --NAME=World
После выполнения выведется: Hello World (название переменной в скрипте зависит от оболочки, здесь используется bash).
Использование npm ci для точной воспроизводимой установки
Команда npm ci (clean install) удаляет существующую папку node_modules и устанавливает зависимости строго по package-lock.json. Это быстрее, чем npm install, и гарантирует идентичное окружение на всех машинах.
npm ci
Если package-lock.json отсутствует, команда завершится ошибкой. Это особенно полезно в CI/CD.
Просмотр устаревших пакетов с npm outdated
Команда показывает текущую, желаемую и последнюю доступную версии для каждого пакета:
npm outdated
Package Current Wanted Latest Location lodash 4.17.20 4.17.21 4.17.21 my-project express 4.17.1 4.18.2 4.18.2 my-project
Столбец "Wanted" соответствует версии, которая будет установлена при npm update.
Управление версией пакета с npm version
Команда npm version увеличивает номер версии в package.json и создаёт git-тег (если репозиторий инициализирован). Аргументы: patch, minor, major, prepatch и т.д.
npm version patch
npm version minor --no-git-tag-version
Пример изменения: версия 1.2.3 при npm version minor станет 1.3.0.
Удаление неиспользуемых пакетов с npm prune
Команда удаляет из node_modules пакеты, которые не указаны в package.json:
npm prune
Если после установки удалить пакет из package.json вручную, его файлы останутся до выполнения npm prune.