12k
All articles

Знакомство с vlt — альтернативой npm

Оцените vlt как альтернативу npm: настройте реестры, перенесите проект, разберитесь с lock-файлами и скриптами, проверьте зависимости перед переходом.

OpenReplay Team
OpenReplay Team
Знакомство с vlt — альтернативой npm

vlt — бесплатный менеджер пакетов для JavaScript с открытым исходным кодом. Его разработали люди, которые создавали и сопровождали npm.

С выходом версии 1.0 vlt стал серьёзной альтернативой. Он устанавливает зависимости из package.json, разделяет установку на этап загрузки и этап выполнения скриптов, а также предлагает язык запросов к графу зависимостей. Сложности возникают в деталях: lock-файлы, аутентификация через .npmrc, postinstall-скрипты и, главное, выбор реестра, из которого приходят пакеты. В этом руководстве мы разберём всё это на примере существующего проекта и в конце сделаем однозначный вывод.

Ключевые выводы

  • Согласно актуальной документации клиента, у vlt нет реестра по умолчанию. Перед установкой нужно либо направить алиас npm на реестр командой vlt config set registries=npm=…, либо выполнить vlt setup, чтобы использовать реестры вашего аккаунта vlt.io.
  • vlt install не запускает скрипты зависимостей. Затем vlt build выполняет lifecycle-скрипты всех пакетов, у которых они есть, пропуская пакеты с известными предупреждениями о вредоносном ПО, если только вы не сузите выборку селектором.
  • vlt игнорирует package-lock.json и заново разрешает дерево зависимостей в vlt-lock.json, поэтому при переходе версии транзитивных зависимостей могут измениться.
  • vlt query использует селекторы в стиле CSS, например :scripts, :malware и :prod, для выборки пакетов из разрешённого графа зависимостей.

Что такое менеджер пакетов vlt и кто его создал?

vlt — это клиент менеджера пакетов плюс облачный сервис реестра, созданный авторами npm. В анонсе от ноября 2024 года, подписанном Дарси Кларком (Darcy Clarke), Руем Адорно (Ruy Adorno) и Люком Каррисом (Luke Karrys), vlt был представлен как бесплатный проект с открытым исходным кодом. vlt 1.0 вышел 4 августа 2026 года, и с тех пор появились релизы ветки 1.x.

CLI vlt покажется пользователям npm знакомым, но архитектура у него другая. Если вы сравниваете его с другой популярной альтернативой npm, посмотрите, как те же задачи решает pnpm.

Установка vlt и запуск на существующем проекте

vlt можно установить официальным скриптом или через npm. После этого vlt install загружает зависимости, а vlt build запускает их скрипты.

# official installer, then configure a registry and account
curl -fsSL https://install.vlt.sh | bash
vlt setup

# or install through npm
npm install -g vlt

cd your-project
vlt install   # resolve, download, extract; no dependency scripts run
vlt build     # run lifecycle scripts for eligible packages

Установка через npm описана в руководстве по миграции с npm. Прежде чем vlt install заработает, необходимо настроить реестр. В документации по конфигурации сказано, что vlt поставляется без реестра по умолчанию, и любая команда, которой нужно обратиться к реестру, завершается ошибкой конфигурации, пока вы его не зададите.

В корне проекта вы будете работать с двумя файлами:

  • vlt.json — конфигурация проекта, заменяющая .npmrc.
  • vlt-lock.json — lock-файл vlt.

Согласно руководству по миграции с npm, vlt не читает package-lock.json и разрешает все зависимости с нуля. Старый lock-файл можно удалить или оставить, пока оба инструмента используются параллельно. Это менее щадящий подход, чем импорт lock-файла в pnpm, описанный в статье о переходе с npm на pnpm. Прежде чем что-либо мержить, сравните разрешённые версии.

npmvlt
npm installvlt install
npm civlt ci (сокращение для vlt install --expect-lockfile)
npm rebuild (запускает скрипты)vlt build
npm config set registry=…vlt config set registries=npm=…
npm lsvlt list
npm explain <pkg>vlt query '#<pkg>'

Можно ли просто заменить npm на vlt?

Возможность drop-in-замены нужно проверять, а не принимать на веру. В анонсе 2024 года говорилось, что vlt может заменить ваш текущий менеджер пакетов «в большинстве случаев». В посте о версии 1.0 разработчики идут дальше и называют клиент полноценной drop-in-заменой npm. Оба утверждения исходят от самого вендора. Проверьте на своём проекте пять аспектов:

  1. Настройки .npmrc. В документации не сказано, что vlt читает .npmrc. Настройки реестров и scope задаются в vlt.json в разделе scoped-registries. Токены аутентификации хранятся в файле keychain vlt или в переменных окружения VLT_TOKEN, как описано в руководстве по миграции с npm. Именно приватные scope чаще всего ломаются при миграции первыми.
  2. Пакеты с install-скриптами. Нативные аддоны и пакеты, загружающие бинарные файлы, не заработают, пока не будет выполнен vlt build (подробнее ниже).
  3. Peer-зависимости. Согласно документации по установке, vlt стремится держать по одной копии каждой peer-зависимости. Если двум частям дерева нужны несовместимые версии peer-зависимости, vlt выделяет каждой части собственный peer-контекст. Деревья, на которых npm падает с ошибкой ERESOLVE, могут успешно разрешиться в vlt — возможно, с несколькими копиями peer-зависимости.
  4. Workspaces. Монорепозиториям в документации vlt посвящена отдельная страница. Сверьте с ней структуру своего проекта.
  5. CI. Используйте vlt ci, а затем vlt build.

Регрессия, вызванная сменой менеджера пакетов, может пройти CI и впервые проявиться в продакшене. Другая версия транзитивной зависимости или пропущенный postinstall-скрипт, который должен был сгенерировать файл, могут обернуться ошибкой выполнения в браузере. Session replay с записью консоли и сетевых запросов позволяет связать такую ошибку с деплоем, изменившим lock-файл.

Реестр: откуда берутся ваши пакеты

У клиента vlt нет реестра по умолчанию — его выбираете вы. В документации по реестрам сказано, что командам установки (vlt install, vlt ci, vlx и другим) требуется заданный алиас реестра npm. Простого значения registry из vlt.json, флага или VLT_REGISTRY им недостаточно. Альтернативный путь — vlt setup, который настраивает реестры вашего аккаунта vlt.io.

Запуск vlt setup меняет источник пакетов: алиас npm начинает указывать на зеркало вашего аккаунта в реестре vlt. Как сказано на главной странице vlt, каждый запрос публичного пакета проходит на этом зеркале проверку безопасности, которая блокирует известное вредоносное ПО. Корень доверия при этом смещается с npm на vlt.

Чтобы использовать публичный реестр npm напрямую, выполните:

vlt config set registries=npm=https://registry.npmjs.org/

Если запустить эту команду внутри проекта, алиас будет записан в vlt.json проекта. Закоммитьте этот файл, чтобы вся команда и CI использовали один и тот же источник.

Одна оговорка: в issue от апреля 2026 года сообщается, что vlt install продолжает использовать URL реестров, записанные в существующем vlt-lock.json. При смене реестра пересоздайте lock-файл.

Блокировка на уровне реестра останавливает только уже выявленное вредоносное ПО. Свежеопубликованная вредоносная версия может проскочить, пока её кто-нибудь не пометит. Командам, которым нужен приватный хостинг, доступен vsr — npm-совместимый реестр vlt под лицензией Fair Source. Согласно анонсу, его можно использовать локально, развернуть на собственной инфраструктуре или получить как управляемый сервис.

Безопасность по умолчанию: поэтапная установка и vlt build

vlt install не запускает скрипты зависимостей. Затем vlt build выполняет lifecycle-скрипты всех пакетов, у которых они есть, за исключением пакетов с известными предупреждениями о вредоносном ПО, если только вы не сузите выборку селектором. В документации по build цель по умолчанию указана так:

:scripts:not(:built):not(:malware)

Запроса на подтверждение нет. Вы разрешаете скрипты, составляя более узкий запрос на Dependency Selector Syntax. Передайте его как цель сборки или используйте --allow-scripts при установке и сохраните в vlt.json, чтобы вся команда работала с одним и тем же запросом. Эта модель подробно описана в анонсе vlt build.

На практике поэтапная установка означает, что пакет, которому нужен postinstall-скрипт для загрузки готового бинарного файла или компиляции нативного аддона, после vlt install остаётся несобранным. Всё, что зависит от его бинарника или сгенерированных файлов, может не работать до запуска vlt build. Добавьте vlt build во все скрипты настройки окружения и CI-задачи.

Идея та же, что и при отключении install-скриптов npm по умолчанию. Однако меры на стороне потребителя защищают только установку. На стороне публикации проверяйте содержимое пакета с помощью npm pack --dry-run, чтобы случайно не опубликовать лишние файлы.

Запросы к графу зависимостей с помощью vlt query

vlt query выбирает пакеты из разрешённого графа зависимостей с помощью селекторов в стиле CSS — примерно так же, как querySelectorAll выбирает элементы на странице. В посте о версии 1.0 упоминается более 60 псевдоселекторов графа, около 30 из которых связаны с безопасностью. Согласно посту vlt об insights-селекторах, селекторы безопасности используют метаданные Socket.

vlt query ':scripts'                  # packages with install scripts
vlt query ':malware'                  # packages with known malware alerts
vlt query ':prod'                     # production dependencies only
vlt query ':scripts' --view=mermaid   # render matches as a Mermaid diagram

В документации по query перечислены режимы вывода: human, json, mermaid, svg, png и count. Начните с :scripts: именно из этого списка vlt build выбирает пакеты по умолчанию (затем пропуская уже собранные пакеты и пакеты с предупреждениями о вредоносном ПО). Согласно посту vlt о host-контексте, :host(local) выполняет запрос по всем проектам, настроенным в дашборде vlt.

Те же селекторы работают и в CI:

- run: npm install -g vlt
- run: vlt ci          # vlt install --expect-lockfile
- run: vlt build
- name: Report dependencies with malware alerts
  run: vlt query ':malware' --view=count

Чтобы последний шаг завершал задачу с ошибкой, добавьте флаг --expect-results=0, описанный в документации по query. Запрос везде остаётся одним и тем же: это ваша политика, записанная в виде одной строки-селектора.

Вердикт: стоит попробовать на pet-проекте, но пока не по умолчанию

vlt уже сейчас стоит попробовать на pet-проекте. Командам, работающим с продакшеном, лучше оставаться на текущем менеджере пакетов, пока их CI, аутентификация в приватных реестрах и пакеты с install-скриптами не будут стабильно работать под vlt. Поэтапная установка и vlt query действительно полезны. А вот разрешение lock-файла с нуля и выбор реестра требуют взвешенного решения. Если для вас важнее всего скорость установки, сравните vlt с pnpm 12, переписанным на Rust, на собственном репозитории.

Начните с отдельной ветки. Явно задайте алиас реестра npm, выполните vlt install, vlt build и vlt query ':scripts', а затем сравните разрешённые версии в vlt-lock.json со старым lock-файлом, прежде чем что-либо попадёт в main.

Часто задаваемые вопросы

Какая версия Node.js нужна для vlt и создаёт ли он папку node_modules?

Пакету vlt требуется Node.js 22.22 или новее. vlt по-прежнему создаёт каталог node_modules, но использует собственную внутреннюю структуру в node_modules/.vlt/, которая отличается от плоского дерева npm. По умолчанию в Linux vlt создаёт жёсткие ссылки на файлы из глобального хранилища, а в macOS и Windows распаковывает каждый пакет; это поведение меняется настройкой store-linker. Во время выполнения пакеты разрешаются как обычно, поэтому код приложения менять не требуется.

Чем заменить npx и npm run при работе с vlt?

npx заменяет vlt exec. Её также можно вызывать как vlt x или через сокращение vlx. Команда запускает бинарный файл пакета и загружает пакет, если его нет в node_modules, но перед загрузкой чего-либо нового запрашивает подтверждение. vlxl запускает только уже установленные бинарные файлы. vlt run (сокращённо vlr) выполняет скрипты из package.json вместе с их pre- и post-хуками. Обе команды принимают селектор --scope для выбора workspaces.

Как перенести overrides из npm в vlt?

Аналог поля overrides из npm в vlt — Graph Modifiers. Они задаются в vlt.json в виде запросов на Dependency Selector Syntax. Это позволяет выбирать зависимость не только по имени пакета, но и по пути, workspace или диапазону semver. Если одной зависимости соответствует несколько модификаторов, vlt определяет приоритетный по правилам специфичности, похожим на CSS.

Как настроить workspaces в монорепозитории на vlt?

vlt читает поле workspaces из корневого package.json как есть, поэтому существующий монорепозиторий на npm или yarn работает без изменений. Поле workspaces в корневом vlt.json используйте, если нужны именованные группы или вы переходите с pnpm-workspace.yaml. Если в vlt.json есть поле workspaces, vlt использует только его и игнорирует поле в package.json; значения не объединяются. В vlt.json значением может быть glob-строка, массив glob-шаблонов, например packages/*, или объект с именованными группами, каждая из которых сопоставлена путям или glob-шаблонам. Простой массив попадает в группу по умолчанию с именем packages.

DevTools for the frontend

Gain Debugging Superpowers

Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers.

Star on GitHub12k

We use cookies to improve your experience. By using our site, you accept cookies.