npm
| Автор | Айзек Шлютер (Isaac Z. Schlueter) |
|---|---|
| Первый выпуск | 2010 |
| Владелец | GitHub (Microsoft), с 2020 |
| Входит в | Node.js |
| Реестр | registry.npmjs.org |
| Пакетов в реестре | более 3 миллионов |
| Файлы | package.json, package-lock.json, node_modules/ |
| Альтернативы | pnpm, Yarn, Bun |
npm — менеджер пакетов для JavaScript и одновременно крупнейший в мире публичный реестр программных пакетов. Утилита npm поставляется вместе с Node.js: она устанавливает зависимости, описанные в файле package.json, фиксирует их точные версии в lock-файле и запускает скрипты проекта. Через реестр npm распространяются не только серверные библиотеки, но и почти весь инструментарий фронтенда: React, сборщики, линтеры, компилятор TypeScript.
История
npm создал Айзек Шлютер в 2010 году, вскоре после появления Node.js; с 2011 года он входит в поставку Node. В 2014 году была основана компания npm, Inc., а в 2020-м её купила GitHub (Microsoft).[1] Реестр пережил несколько громких инцидентов: в 2016 году автор удалил крошечный пакет left-pad, и сборки тысяч проектов сломались — после этого правила удаления опубликованных версий ужесточили. Атаки на цепочку поставок — захват аккаунтов мейнтейнеров и вредоносные версии популярных пакетов — остаются главной угрозой экосистемы.
package.json
Файл описывает проект и его зависимости:[2]
{
"name": "my-app",
"version": "1.2.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"test": "vitest"
},
"dependencies": {
"express": "^4.21.0"
},
"devDependencies": {
"typescript": "~5.6.0",
"vitest": "^2.1.0"
},
"engines": {"node": ">=20"}
}
- dependencies — нужны при работе приложения; devDependencies — только при разработке и сборке.
- scripts — команды проекта:
npm run build, а дляtestиstart— простоnpm test. - version следует правилам семантического версионирования.
Диапазоны версий
npm понимает диапазоны semver:[4]
| Запись | Что разрешено | Пример для 4.21.0 |
|---|---|---|
4.21.0 |
только эта версия | 4.21.0 |
~4.21.0 |
патчи | 4.21.x |
^4.21.0 |
минорные и патчи | 4.x.x, не 5.0 |
* или latest |
любая | что угодно |
По умолчанию npm install pkg записывает диапазон с ^. Поэтому точные установленные версии всего дерева, включая транзитивные зависимости, фиксирует package-lock.json.[3] Lock-файл обязательно хранят в Git, а в CI используют npm ci — она устанавливает строго по lock-файлу, удаляет старый node_modules и падает при расхождении с package.json.
Основные команды
npm init -y # создать package.json
npm install # установить всё (npm i)
npm install zod # добавить зависимость
npm install -D eslint # добавить dev-зависимость
npm ci # чистая установка по lock-файлу (CI)
npm outdated # что можно обновить
npm update # обновить в пределах диапазонов
npm audit # известные уязвимости
npx create-vite@latest app # запустить пакет без установки
npm publish --access public # опубликовать свой пакет
npx скачивает и выполняет пакет одной командой — удобно для генераторов проектов и разовых утилит.
node_modules и альтернативы
npm раскладывает зависимости в каталог node_modules, поднимая их на верхний уровень, где возможно. Каталог бывает огромным, а «плоская» структура позволяет случайно импортировать пакет, не объявленный в зависимостях.
- pnpm хранит каждую версию пакета один раз в общем хранилище и подключает жёсткими ссылками; экономит место, ускоряет установку и запрещает необъявленные импорты.[6]
- Yarn появился в 2016 году как более быстрая и детерминированная альтернатива; Yarn Berry предлагает режим Plug'n'Play без
node_modules. - Bun — среда выполнения JavaScript со встроенным очень быстрым менеджером пакетов.
Все они работают с тем же реестром и package.json; инструмент Corepack в Node.js фиксирует нужный менеджер через поле packageManager. Монорепозитории поддерживаются через workspaces.
Безопасность
- Устанавливайте зависимости через
npm ciпо lock-файлу и проверяйте изменения lock-файла на ревью. - Скрипты
postinstallвыполняются при установке;npm install --ignore-scriptsотключает их для недоверенного кода. - Включайте двухфакторную аутентификацию для публикации (см. 2FA) и публикуйте пакеты из CI с provenance — подписанной ссылкой на исходный коммит и сборку.[5]
- Проверяйте опечатки в именах пакетов: тайпсквоттинг (
expresвместоexpress) — распространённый способ доставки вредоносного кода.