(Node Version Manager - инструмент для управления разными версиями Node.js на одном компьютере: установка, переключение между ними)
Источник: статья автора проекта Corey Butler «Why We Rewrote NVM for Windows» (6 октября 2026) и официальная документация nvm-windows.
После более чем десяти лет жизни версии 1 проект NVM for Windows получил полностью переписанную вторую версию. Это не косметический апдейт: изменены язык и архитектура ядра, модель работы с node.exe, способ хранения настроек, схема дистрибуции и даже бизнес-модель проекта. Ниже - коротко о том, зачем это было сделано и что именно получили пользователи.
Коротко о главном
v2 - переписывание с нуля. Ядро управления версиями осталось на Go, а «шимы» (перехватчики запуска
node,npm,npxи др.) написаны на Zig.Причина №1 - латентность запуска. К «налогу» Windows на создание процесса добавлялся старт рантайма Go; в сумме это уже заметно человеку.
Причина №2 - v1 умел использовать только ссылки. Симлинки не позволяют выполнять логику при запуске Node.js, а v2 нужны
.nvmrc, проверки целостности и защиты.Два режима работы:
link(нулевая задержка, совместимость с «как есть») иshim(по умолчанию, +25–35 мс, но с современными сценариями).Нативные интеграции Windows: «Приложения и возможности», журнал событий, центр уведомлений, реестр.
Две сборки: Community (MIT, бесплатно) и Certified (EULA, с надстройками Governance, Advanced Logging и Trust Artifacts).
Почему проект переписали
1. «Универсальная налог за задержку» в Windows и старт Go
Первая версия писалась в 2014 году - в том числе чтобы изучить Go. С тех пор язык заметно изменился, а автор задался вопросом: остаться на Go или перейти на что-то новое?
Ключевым оказался не язык как таковой, а задержка старта. Автор разложил её на три составляющие:
Латентность ОС (Windows). Почти все языки порождают процесс через
CreateProcessW: создание процесса, отображение образа, проверка антивирусом. По замерам это «дно» в 12–30 мс, а под нагрузкой - нередко 100 мс и выше. Эту плату платит любая программа, на каком бы языке она ни была написана.Латентность рантайма (Go). Go «предоплачивает» запуск рантайма, сборщика мусора и стандартной библиотеки: в экспериментах это добавляло 12–200 мс.
Латентность приложения (логика). Собственно работа самого NVM.
Вместе первые два пункта легко выходят за порог, когда задержка уже ощущается пользователем.
2. Наследие v1: только ссылки
В v1 задержкой при запуске node myfile.js можно было не заниматься: версия разрешалась исключительно симлинками. Симлинк не порождает новый процесс - дополнительная задержка нулевая, поведение идентично прямому запуску node.exe.
Но у такой схемы есть принципиальное ограничение: ссылка - это указатель, а не логика. А v2 требовал именно логики во время выполнения:
поддержка
.nvmrcи других файлов фиксации версии;проверка целостности и подлинности node.exe;
защита от типичных рисков (подмена node.exe, несовпадение пакетных менеджеров и т. п.);
прочие улучшения «качества жизни».
3. «Shim Split»: разделить ядро и запуск Node.js
Решение - разделить управление версиями и операции Node.js с помощью шима. Автор прототипировал шим на трёх языках:
Прототип | Стартовая латентность | Комментарий |
|---|---|---|
Go (базовый вариант) | высокий вклад рантайма | меньше всего строк кода |
Rust | ~10–15 мс | быстрее Go, но заметно медленнее Zig |
Zig | <1–3 мс | самый маленький бинарник, лучший результат |
Итог: шим- на Zig, nvm.exe - на Go. Позже на Zig появились и другие вспомогательные шимы: они крошечные, изолированные и быстрые. В документации математика уточняется: шим добавляет всего 1–3 мс собственной логики, а основной вклад даёт двойной CreateProcessW - примерно 15 мс на запуск шима, 3 мс логики и ещё 15 мс на запуск node.exe, то есть ~33 мс суммарно.
4. Нативные интеграции вместо «теневых установок»
Вторая большая цель v2 - сделать Node.js «полноценным гражданином» ИТ-экосистемы. Исторически менеджеры версий работали в обход системы: обходили права, создавали «теневые» установки, жили на самодельных автоматизациях. Всё это - ради продуктивности разработчика.
v2 пытается сохранить продуктивность, но действовать внутри экосистемы, а не вокруг неё. Отсюда - четыре нативные интеграции Windows (подробнее ниже): регистрация установок в системе, журнал событий, центр уведомлений и реестр.
5. Устойчивость: разделение Community и Certified
Отдельная, «невидимая» часть работы - governance и compliance. По словам автора, за последние годы большая часть его времени уходила не на дизайн и код, а на переписку с аудиторами, госструктурами и регуляторами, подтверждение отчётов CrowdStrike, проверку соответствия требованиям и разбор ложных срабатываний антивирусов после каждого релиза.
Поэтому проект разделил общественные усилия и работу по governance/compliance:
Community Builds - открытый исходный код (MIT), полный функционал приложения, без централизованного управления;
Certified Builds - те же возможности плюс корпоративные надстройки, распространяются по годовой подписке через клиентский портал.
Что нового в v2
Установка Node.js
Параллельные установки - можно ставить несколько версий Node.js одновременно.
Архивы
.7zвместо.zip- загрузки примерно на 40% меньше.Иметь установленный 7-Zip - необязательно. Если он установлен, NVM использует его для максимально быстрой распаковки; иначе применяется встроенный (более медленный) распаковщик.
Кэш загрузок - повторные установки переиспользуют скачанные и распакованные файлы.
Локальные и air-gapped установки - установка из локального каталога архивов (
local_dir/cache) без обращения в интернет. Часть сценариев (в том числеair_gappedи офлайн-лицензия) относится к надстройке Governance.Без обязательных прав администратора - больше не нужно запускать консоль «от имени администратора».
Два режима работы
Режим переключается в любой момент:
nvm use shim # современный режим (по умолчанию) nvm use link # классический режим ссылок # либо через конфигурацию nvm cfg set mode=shim
Link mode - версия выбирается ссылкой (NTFS junction) на активный node.exe, ссылка лежит в PATH. nvm use меняет цель ссылки, а не сам PATH. Ощущения - как от «голого» node.exe с nodejs.org, задержка 0 мс. Ограничения: нет современного workflow, а для путей UNC создаётся симлинк, требующий привилегии SeCreateSymbolicLinkPrivilege (включается режимом разработчика Windows или групповой политикой). Важно: v2 не запрашивает UAC - при нехватке прав появится нативное уведомление с подсказкой.
Shim mode (по умолчанию) - версию выбирает подписанный шим. Он даёт:
автовыбор версии по
.nvmrc,.node-version,package.jsonи другим настроенным файлам;автоустановку недостающей версии при
nvm use;единообразную обработку несовпадения пакетных менеджеров;
проверку издателя node.exe при каждом запуске;
блокировку вредоносных пакетов;
нативное журналирование;
«карантинный период» (cooldown) для npm/npx/yarn/pnpm/vlt/bun - по умолчанию выключен в Community и равен 2 дням в Certified;
(в Certified + Governance) ограничение прав Node.js/V8.
Плата за это - ~25–35 мс на запуск, что для подавляющего большинства сценариев незаметно.
Разрешение версий и автоматизация
Файлы фиксации версии: по умолчанию проверяются
.nvmrc,.node-version, затемpackage.json; список настраивается (auto_detect), поддерживаются и собственные файлы.Спецификаторы версий:
latest,lts,lts/iron, мажор (24), мажор-минор (24.1), точная версия, пользовательские алиасы.Ограничения (constraints):
^18,~20.1,>=16,>=18 <21,18.x,*- в том числе вengines.node.nvm pin- записывает точную версию в.nvmrcили вengines/devEnginesфайлаpackage.json.Автоустановка отсутствующей версии и автоустановка набора глобальных модулей с каждой новой версией (
auto_installed_modules).Пользовательские алиасы - короткие имена версий (
nvm alias add).Отладка выбора версии:
node --nvm-which --versionилиnpm --nvm-which --versionпечатает, откуда взялась версия (source,requested,resolved, путь к node.exe).
Безопасность
Блокировщик вредоносных пакетов. Останавливает
npm/pnpm/yarn/vlt(иbun, если включёнshim_bun) при совпадении имени и версии пакета с набором OpenSSF Malicious Packages. Проверка идёт по подписанному локальному файлуmalware.dbсо всеми механизмами его обновления и проверки целостности. При срабатывании команда прерывается:NVM blocked left-pad - recognized as malware (OpenSSF). (NVM4602)Это не антивирус и не сканер файлов: Community-сборки проверяют явно устанавливаемый пакет и прямые зависимости
package.json, Certified дополнительно читает lock-файл и весь транзитивный граф. Отключение -nvm config set skip_malware_checks=true(не рекомендуется).Проверка издателя node.exe при каждом запуске в shim-режиме.
NVM Firewall (Governance) - allow/block-списки версий Node.js.
Ограничение прав Node.js (Governance) - запуск node в режиме default-deny (
--permission), заморозка интринсиков V8 (--frozen-intrinsics), запретeval()иnew Function()(--disallow-code-generation-from-strings).
Нативные интеграции Windows
Windows Apps. Каждая управляемая версия Node.js регистрируется в системе и видна в «Приложениях и возможностях». По словам автора, это, вероятно, первый менеджер версий рантайма, который так делает. Ценность не в красивой витрине: система и сканеры (CrowdStrike, Qualys и др.) начинают отличать «намеренно установленную» версию от подброшенного файла node.exe - например, переименованного из
evil.exe.Источник событий Windows. v2 регистрируется как нативный Event Source - структурные логи доступны в Event Viewer, их можно забирать в SIEM. Это основа для аудита сред разработчиков.
Центр уведомлений Windows. v2 - провайдер Notification Center, поэтому уведомления уважают пользовательские настройки (например, «тихие часы») и не теряются, если вы отошли за кофе. Для ИБ это ещё и различимый источник телеметрии: видно, что уведомление от NVM for Windows, а не от универсальной утилиты вроде node-notifier или BurntToast.
Реестр Windows. Самая значимая и самая незаметная интеграция: плоский
settings.txtиз v1 заменён записями в реестре. Это и решение пользовательских проблем, и фундамент для централизованных политик: администраторы могут форсировать режим работы (shim/link), задавать каталоги хранения версий, ограничивать наборы доступных версий, «запирать» права Node.js, задавать cooldown модулей независимо от пакетного менеджера. В строгих средах можно заблокироватьnodejs.org/distи использовать прокси-зеркало, чтобы исключить скачивание неутверждённых (например, уязвимых EOL) версий.
Корпоративная обвязка
Скачивание: зеркала и авторское приватное зеркало, HTTP-прокси (в Governance - расширенный: IWA/NTLM/Negotiate, PAC/WPAD).
Развёртывание: ADMX/ADML и скрипты для групповых политик Active Directory, Entra, Intune; MSI-установщики и PowerShell-скрипты в Certified.
Наблюдаемость: встроенное журналирование в Event Viewer доступно всем; надстройка Advanced Logging даёт структурированные логи для SIEM (включая события блокировки пакетов).
Артефакты доверия (Trust Artifacts): подписанный SBOM (CycloneDX), аттестации SLSA уровня Build L3, результаты SAST (gosec и PSScriptAnalyzer), отчёт по open-source-лицензиям и VEX.
Источники
Corey Butler, «Why We Rewrote NVM for Windows», Medium, 6 октября 2026 - https://goldglovecb.medium.com/why-we-rewrote-nvm-for-windows-3b6fa5be3e7f
«What’s new in v2», nvm-windows Documentation - https://docs.nvm-windows.com/features/newv2/
Сайт проекта - https://nvm-windows.com/
Репозиторий - https://github.com/nvm-windows/nvm
