npm v12: критические изменения и подготовка к миграции
Технический обзор · 10 июня 2026

npm v12: критические изменения
и подготовка к миграции

npm v12, ожидаемый в июле 2026 года, вводит три критических изменения безопасности, которые затронут каждого Node.js разработчика. Install-скрипты становятся опциональными, удалённые тарболы блокируются, а Git-зависимости требуют явного разрешения. Вот что именно меняется и как подготовиться.

Олег Максимов 10 июня 2026 10 мин чтения

Три ключевых изменения

9 июня 2026 года GitHub Changelog подтвердил финальный набор изменений, которые войдут в npm v12. Они доступны с предупреждениями начиная с npm 11.10.0, но v12 включит их по умолчанию:

Критическое

Install-скрипты только с разрешения

Скрипты preinstall, install и postinstall в зависимостях больше не будут запускаться автоматически. Нужно явно одобрить их через npm approve-scripts и npm deny-scripts. Доступно с предупреждениями в npm 11.16.0+.

Критическое

--allow-remote по умолчанию none

npm больше не будет устанавливать зависимости из удалённых URL (включая HTTPS-тарболы) без явного разрешения через --allow-remote. Это касается как прямых, так и транзитивных зависимостей. Доступно с предупреждениями в npm 11.15.0+.

Критическое

--allow-git по умолчанию none

Git-зависимости (прямые и транзитивные) блокируются по умолчанию. Это закрывает уязвимость, где .npmrc Git-зависимости мог переопределить исполняемый файл Git — даже с --ignore-scripts. Доступно с предупреждениями в npm 11.10.0+.

Все три изменения можно протестировать прямо сейчас в npm 11.10.0+. Предупреждения покажут, какие пакеты затронуты в вашем проекте.

Почему эти изменения именно сейчас?

Install-скрипты стали основным вектором атак на цепочку поставок npm. Червь Mini Shai-Hulud (май 2026) скомпрометировал более 170 пакетов, внедряя вредоносный код через preinstall-хуки. Другие менеджеры пакетов — pnpm, Yarn, Bun, Deno — либо блокируют install-скрипты по умолчанию, либо требуют явного разрешения. npm оставался единственным, кто этого не делал.

Изменения allow-remote и allow-git закрывают дополнительные векторы. Уязвимость Git-зависимостей была особенно опасна: скомпрометированный .npmrc Git-зависимости давал атакующему контроль над процессом установки даже при отключённых скриптах.

Подробнее об атаках, которые привели к этим изменениям, читайте в моих статьях: анализ RFC по install-скриптам и разбор атаки Mini Shai-Hulud.

Пошаговая миграция

Шаг 1: Обновите npm

Обновитесь до npm 11.16.0+, чтобы включить все предупреждения:

# Обновление до последней версии npm 11
npm install -g npm@11

# Проверка версии
npm --version
# Должно быть 11.16.0 или выше

# Установка с предупреждениями
npm install --install-strategy=manual

Шаг 2: Найдите все пакеты с install-скриптами

Выполните запрос для поиска зависимостей с install-скриптами:

# Список всех пакетов со скриптами
npm query .scripts

# Сокращённый список только имён пакетов
npm query .scripts | jq '.[].name'

# Проверка с предупреждениями (npm 11.16+)
npm install --install-strategy=manual
# Предупреждения покажут:
# "package X has 1 script(s) that will not run in v12"

Типичные пакеты, которые вызывают предупреждения:

Шаг 3: Проверьте и одобрите доверенные пакеты

npm 11.16+ вводит две новые команды для управления allowlist'ом скриптов:

# Одобрить скрипты конкретного пакета
npx npm-approve-scripts --allow esbuild

# Одобрить несколько пакетов
npx npm-approve-scripts --allow esbuild,sharp,@swc/core

# Заблокировать пакет
npx npm-approve-scripts --deny untrusted-package

# Просмотр текущих разрешений
npx npm-approve-scripts list

# Одобрить все установленные пакеты (не рекомендуется)
npx npm-approve-scripts --allow-all

Шаг 4: Сохраните allowlist в репозиторий

Список одобренных скриптов сохраняется в package.json через новое поле, что делает его воспроизводимым:

{
  "name": "my-project",
  "approvedScripts": {
    "approve": [
      "[email protected].*",
      "[email protected].*",
      "@swc/core@1.*"
    ],
    "deny": []
  }
}

Версионные диапазоны следуют semver. Указывайте конкретные диапазоны — [email protected].* безопаснее, чем esbuild@*.

Шаг 5: Протестируйте с поведением npm v12

До выхода v12 проверьте ваш пайплайн с будущими настройками по умолчанию:

# Симуляция поведения v12 на npm 11
npm install --install-strategy=manual --allow-remote=none --allow-git=none

# Если всё работает — вы готовы к v12
# Если ошибки — проверьте и одобрите затронутые пакеты

Полный чеклист по безопасной оценке npm-пакетов — в статье Как оценить npm-пакет: практический чеклист.

Миграция CI/CD пайплайнов

CI-окружения требуют особого внимания, так как они часто выполняют чистую установку и полагаются на postinstall-хуки:

# GitHub Actions — готовимся к npm v12
jobs:
  build:
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          registry-url: 'https://registry.npmjs.org'
      
      - name: Install dependencies
        run: |
          npm ci
      
      - name: Build
        run: npm run build

Ключевые моменты для CI:

Авторам пакетов: что делать

Если вы поддерживаете npm-пакет с install-скриптами, вот как подготовиться:

Вариант 1: Переход на lifecycle-хуки

Перенесите логику установки в скрипты, которые не запускаются при npm install:

{
  "scripts": {
    "postinstall": "node ./setup.mjs",       // Не запустится в v12
    "prepare": "node ./build.mjs",             // Запускается при 'npm publish'
    "prepublishOnly": "npm run build",         // Запускается перед публикацией
    "rebuild": "node-gyp rebuild"              // Явный, не автоматический
  }
}

Вариант 2: Предварительно собранные бинарники

Вместо компиляции кода во время установки поставляйте готовые бинарники для основных платформ. Хорошие примеры: esbuild (бинарники под GOOS/GOARCH) и sharp (через prebuild-install).

Монорепозитории

Монорепозитории с npm workspaces сталкиваются с дополнительной сложностью — каждый workspace может иметь свои требования к скриптам:

# Корневой package.json
{
  "workspaces": ["packages/*"],
  "approvedScripts": {
    "approve": [
      "[email protected].*",
      "typescript@5.*"
    ]
  }
}

# approvedScripts из workspace'ов мерджится с корневыми.
# Для проверки всех скриптов:
npm query .scripts --workspaces

Флаги allow-remote и allow-git

Помимо install-скриптов, важно понимать изменения allow-remote и allow-git:

# Разрешить все удалённые тарболы (возврат к текущему поведению)
npm install --allow-remote=all

# Разрешить все Git-зависимости (возврат к текущему поведению)
npm install --allow-git=all

# Эквиваленты в .npmrc
echo 'allow-remote=all' >> .npmrc
echo 'allow-git=all' >> .npmrc

Эти флаги принимают all (разрешить всё) или none (блокировать всё). Будущие версии могут поддерживать детальные allowlist'ы. Пока что протестируйте проект с обоими флагами в none и посмотрите, что сломается.

FAQ

Какие критические изменения вносит npm v12?
npm v12 вводит три изменения по умолчанию: (1) install-скрипты (preinstall/install/postinstall) больше не запускаются автоматически — их нужно явно одобрить через npm approve-scripts; (2) --allow-remote теперь по умолчанию none, блокируя https-тарболы; (3) --allow-git по умолчанию none, блокируя Git-зависимости. Все три изменения доступны с предупреждениями в npm 11.10.0+.
Когда выйдет npm v12?
Релиз npm v12 ожидается в июле 2026 года. Анонс в GitHub Changelog от 9 июня подтвердил, что эти изменения по умолчанию войдут в v12. Все изменения уже можно протестировать в npm 11.10.0+ (allow-git), 11.15.0+ (allow-remote) и 11.16.0+ (install scripts).
Как подготовить проект к npm v12?
Миграция в три шага: (1) Обновитесь до npm 11.16.0+ и выполните 'npm query .scripts' для поиска всех пакетов с install-скриптами; (2) Проверьте каждый скрипт — одобрите доверенные пакеты через npx npm-approve-scripts --allow и протестируйте с --install-strategy=manual; (3) Для CI настройте allowlist в package.json. Список одобренных пакетов нужно сохранить в репозиторий.
Что будет с node-gyp и нативными модулями в npm v12?
Нативные модули, использующие node-gyp, полагаются на install-скрипты для компиляции во время 'npm install'. В npm v12 эти скрипты не будут запускаться автоматически. Авторам пакетов следует переходить на предварительно собранные бинарники (prebuild). Разработчики могут временно одобрить известные безопасные пакеты через npm approve-scripts.
Как npm v12 повлияет на CI/CD конвейеры?
CI-конвейеры, выполняющие 'npm install' в автоматическом режиме, будут затронуты, если они используют пакеты с install-скриптами (сборка, нативная компиляция, postinstall-очистка). Рекомендуется предварительно одобрить доверенные пакеты в package.json, после чего 'npm ci' будет работать как обычно. В монорепозиториях каждому workspace может потребоваться свой allowlist.
Можно ли продолжать использовать https-тарболы и Git-зависимости в npm v12?
Да, но их нужно явно разрешить. Используйте --allow-remote=all для восстановления https-тарболов и --allow-git=all для Git-зависимостей. Эти флаги можно установить в .npmrc для каждого проекта. Изменяется только значение по умолчанию — явное разрешение полностью поддерживается.
Чем npm v12 отличается от RFC, опубликованного в феврале 2026?
Февральский RFC (описан в статье npm Install Scripts Opt-In RFC) предлагал сделать install-скрипты опциональными. npm v12 реализует это предложение как финальное поведение по умолчанию, вместе с изменениями allow-remote и allow-git. RFC был на стадии предложения; анонс 9 июня — это подтверждённое финальное поведение. Дополнительно allow-git=none закрывает специфическую уязвимость, где .npmrc Git-зависимости мог переопределить исполняемый файл Git.

Что дальше

Время на подготовку к npm v12 ограничено. Каждый проект, использующий npm, будет затронут. Хорошая новость: вы можете подготовиться уже сегодня — обновитесь до npm 11.16.0+, выполните команды аудита выше и настройте allowlist до официального релиза.

Начните с npm query .scripts — это занимает пять секунд и показывает объём предстоящей работы. Для большинства проектов миграция занимает 15-30 минут. Альтернатива — сломанный CI в июле.

Создаёте новый Node.js проект? Я помогаю командам настраивать безопасную JavaScript-архитектуру. Свяжитесь со мной для консультации.

Контакты

Нужна помощь с миграцией npm?

Помогаю командам провести аудит npm-окружения, настроить allowlist'ы и подготовиться к npm v12. Бесплатная первичная консультация.