Появился НОВЫЙ пакетный менеджер!? (Альтернатива Bun)

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

Transcript

00:00:00Это Nub — универсальный набор инструментов JavaScript, который работает поверх Node, а не заменяет его.
00:00:04Он заменяет сразу множество инструментов, которыми вы сейчас пользуетесь: от менеджера пакетов,
00:00:08который в пять раз быстрее pnpm, до раннера TypeScript, способного заменить TSX,
00:00:13и даже менеджера версий Node. Это лучшие фичи Bun, но поверх стандартного Node.js,
00:00:17и, вероятно, поэтому «Nub» — это просто «Bun», записанное наоборот.
00:00:21И я знаю, что JavaScript-разработчики обожают изобретать всё заново, но это не просто чья-то случайная
00:00:25Его создал Колин, автор Zod, который также создал доказательство концепции tRPC
00:00:29и даже работал в Bun. Так что давайте погрузимся и посмотрим на него.
00:00:38Nub — это единый исполняемый файл на Rust, работающий на Mac, Windows и Linux. Как я показал вначале,
00:00:44это лишь часть инструментов, которые он заменяет. Это запуск файлов, скриптов,
00:00:47пакетов, менеджер пакетов и менеджер версий Node. Давайте разберём каждый из них.
00:00:52Во-первых, запуск файлов. И у него одного уже огромное количество возможностей. Он поддерживает полноценный
00:00:56TypeScript, а не просто удаление типов, как Node, поэтому может заменить такие инструменты, как TSX или ts-node.
00:01:02Здесь видно, что у меня есть файл TypeScript с enum, пространствами имён и свойствами параметров
00:01:06в конструкторе — а это то, что Node обычно запустить не может. Если я просто выполню Nub с нужным
00:01:11файлом, всё сработает идеально, тогда как в Node произойдёт ошибка.
00:01:15Если заменить Nub на Node, мы увидим ошибку неподдерживаемого синтаксиса TypeScript,
00:01:20так как ему не нравятся namespace и enum. Инструмент также заменяет библиотеки вроде dotenv,
00:01:24автоматически импортируя переменные окружения. Он поддерживает .env, .env.local, а также
00:01:29специфичные для Node окружения файлы, и даже раскрывает переменные. Ниже у нас есть
00:01:33переменная, сформированная из других переменных окружения. Здесь есть пользователь и хост
00:01:37базы данных. Если запустить файл через Nub, он импортирует эти переменные
00:01:41и подставит их значения в URL проверки состояния системы.
00:01:46Также видно, что мой API-ключ не совпадает с тем, что указан в файле .env.
00:01:50Это потому, что .env.local всегда имеет приоритет, и здесь у меня установлен
00:01:54ключ со значением «подписаться на Better Stack». И это то, что вам обязательно стоит сделать, чтобы оставаться
00:01:58в курсе новостей ИИ и разработки. Подпишитесь, это очень помогает. Далее я выполню
00:02:02команду `nub src/index.tsx`, и мы увидим, что всё работает. Это мой
00:02:07комплексный пример для Nub. В коде этого файла используется куча фич, предоставляемых запуском файлов Nub.
00:02:12Одна из них — импорт файлов JSON, а также YAML,
00:02:15HTML и даже текстовых файлов. Это также заменяет плагин tsconfig-paths. Пути, которые я настроил
00:02:20через `@config` в своём tsconfig, будут корректно разрешаться в Node.
00:02:24Также есть поддержка декораторов, таких как `@service` и `@sealed`. Есть
00:02:29поддержка JSX, и он транспилирует его на основе настроек tsconfig. Можно даже использовать
00:02:34современное ключевое слово `using` для явного управления ресурсами. Помимо этого,
00:02:38есть поддержка множества современных API, таких как Web Workers, Temporal и многих других. Он автоматически
00:02:43добавляет полифилы в версиях Node, где их нет, и включает экспериментальные
00:02:48фичи Node без флагов, например поддержку localStorage. Это лишь малая часть возможностей
00:02:52системы запуска файлов, но также стоит отметить, что она полностью совместима по флагам
00:02:56с Node. В конечном счёте всё запускается в Node, так что он просто пробрасывает эти флаги. Если в вашем
00:03:01скрипте нет специфичных для Nub функций, вы можете заменить `nub` на `node` и получить
00:03:06точно такой же результат. К слову, всё это происходит практически без потери скорости.
00:03:10Скорость максимально близка к Node, и, согласно документации, выполнение файла в Nub забирает
00:03:14ровно столько же времени, сколько и в Node. Признаю, это не будет быстрее, чем Bun, ведь Bun —
00:03:19это нативная среда выполнения, заменяющая Node, а Nub построен поверх Node. Я решил запустить
00:03:24собственный бенчмарк на своём Mac, чтобы узнать, что быстрее. И если сделать отображение
00:03:28чуть более наглядным, у меня самым быстрым оказался Node. Скорость Nub не была
00:03:31абсолютно идентичной Node — Nub слегка отставал, но TSX оказался медленнее их обоих. Отойдём
00:03:36от темы запуска файлов: вторая фича — это менеджер версий Node. Прошли времена, когда требовались NVM или
00:03:41FNM. В Nub, если у меня в проекте есть файл `.node-version` либо же версия указана в `.nvmrc` или даже
00:03:46в `package.json`, Nub автоматически установит нужную версию с сайта Node.js.
00:03:52Сейчас в этом проекте используется последняя версия Node 26. Если я изменю файл, например, на
00:03:5624 и перезапущу команду через Nub, он автоматически скачает нужную версию Node. Здесь также есть все
00:04:02привычные команды управления: мы можем устанавливать версии Node, просматривать список установленных,
00:04:06удалять версии Node, и даже есть фиксация версии, которая зафиксирует
00:04:10версию Node в файле. Всё действительно так просто. Перейдём к следующим трём фичам,
00:04:15в которых Nub способен заменить pnpm и Bun. Третья фича —
00:04:20собственно менеджер пакетов. Обещают, что он будет в пять раз быстрее, чем pnpm, а ведь pnpm и так был
00:04:25очень быстрым. Работает всё привычным образом: `nub install` устанавливает пакеты, но что примечательно,
00:04:31он умеет подхватывать ваши существующие lock-файлы. Если до этого вы использовали Bun или pnpm,
00:04:36Nub будет просто обновлять их lock-файлы вместо создания своего. Благодаря этому невероятно легко
00:04:41переключаться между ними при необходимости. То же самое касается и совместимости с pnpm. Каждая
00:04:46команда управления пакетами в Nub абсолютно идентична pnpm, включая продвинутые функции pnpm вроде
00:04:51каталогов воркспейсов. Флаги абсолютно те же, так что переход с pnpm на Nub проходит бесшовно. А если вы
00:04:57используете npm, Bun или Yarn, конфигурационные опции этих менеджеров пакетов также будут подтянуты.
00:05:02Что касается заявлений о скорости: бенчмарки ставят Nub на первое место по скорости
00:05:06повторных установок без сети — уходит 346 миллисекунд на 1168 пакетов. На своей машине я провёл
00:05:13тест с 14 прямыми зависимостями, которые разворачиваются в 212 уникальных пакетов, и бенчмарк подтвердил, что Nub
00:05:19быстрее всех. Nub установил пакеты за 136 миллисекунд, Bun оказался вторым с 239 миллисекундами,
00:05:25а pnpm и npm заняли больше секунды. Так что заявления о высокой скорости подтвердились
00:05:30и на моей машине, показав действительно впечатляющие результаты. Менеджер пакетов взял лучшие фичи pnpm
00:05:35в плане безопасности: по умолчанию минимальный возраст релизов составляет 24 часа, и билд-скрипты не запустятся
00:05:40без вашего одобрения, так что вы будете защищены от большинства атак типа Shai Hulud. Следующая важная часть
00:05:45менеджера пакетов — запуск самих пакетов (фича номер 4). И главный заголовок здесь:
00:05:49он в 19 раз быстрее, чем npx. Команда `nubx` напрямую обращается к папке бинарников в
00:05:54node_modules, поэтому Rust исполняет эти файлы напрямую. В обёртке нет дополнительного
00:05:59процесса Node, что также позволяет работать с любым менеджером пакетов, так как он обращается прямо
00:06:03к node_modules. Как и большинство команд Nub, он полностью совместим по флагам
00:06:07с `pnpm exec`, включая команды `dlx`. При запуске бенчмарка на моём Mac, Nub опять оказался
00:06:12самым быстрым: 169 мс на запуск esbuild против 423 мс у pnpm. Так что и тут заявления о скорости подтверждаются.
00:06:20Последняя фича, необходимая менеджеру пакетов, — раннер скриптов. Утверждается, что он
00:06:24в 24 раза быстрее, чем `pnpm run`, и поддерживает хуки жизненного цикла, переменные окружения npm
00:06:29и проброс аргументов. Когда вы используете npm или pnpm, они запускают программы на Node.js,
00:06:34каждый раз подгружая JavaScript соответствующего менеджера пакетов, в то время как Nub использует бинарник на Rust
00:06:38без лишних процессов при старте. Мои локальные бенчмарки снова показали, что `nub run` был самым быстрым,
00:06:43пусть и не с таким огромным отрывом, как заявлялось в документации. Также стоит отметить
00:06:47(и я говорю это уже в четвёртый раз в этом видео), что эта команда полностью совместима по флагам
00:06:51с pnpm, то есть поддерживает и монорепозитории pnpm. Что мне действительно хочется похвалить
00:06:56в этих последних трёх фичах, так это то, что Nub не стал изобретать велосипед. Под капотом он использует
00:07:00OBE — менеджер пакетов, написанный JDX, который также является создателем
00:07:04Mise. Он сделал свой менеджер пакетов встраиваемым для других библиотек, и Колин работал
00:07:08вместе с ним, чтобы интегрировать его в Nub, так что это не чужой украденный труд. Это были основные фичи
00:07:13Nub, но здесь есть ещё много чего интересного, например, GitHub Action для быстрой замены,
00:07:17который заменяет официальный `setup-node`. Всё сделано для того, чтобы максимально облегчить
00:07:21работу вокруг Node. Но вот вопрос, который я себе задаю: стал бы я реально этим
00:07:26пользоваться? Мой ответ: да, в определённых сценариях. Буду честен, я активный
00:07:31пользователь Bun, и у меня не возникало проблем с совместимостью при разработке. Возможно, с новым
00:07:35портом на Rust я перейду на него, но даже тогда я использовал бы pnpm для всего остального. И должен
00:07:40признать, я никогда не замечал, чтобы pnpm работал слишком медленно. Также я использую Mise для управления
00:07:44версиями Node, поэтому эта часть мне не так нужна, но я вижу пользу
00:07:48в запуске файлов, который заменяет TSX. Главный сценарий использования для себя я вижу,
00:07:52когда работаю с новыми одноразовыми виртуальными машинами. Иногда я быстро создаю их для
00:07:57тестирования, и если нужно просто быстро начать работу с Node, Nub — один из самых самодостаточных
00:08:01пакетов и самый быстрый и простой способ сделать это. Так что в основном мне мешают пользоваться Nub
00:08:05каждый день лишь собственные привычки. Но мне очень интересно, чем вы пользуетесь
00:08:08в качестве менеджера пакетов и рассматриваете ли такие варианты, как Nub? Может, планируете перейти
00:08:12с Bun теперь, когда его переписали на Rust? Напишите в комментариях ниже. Не забудьте
00:08:16подписаться и, как обычно, увидимся в следующем видео!

Key Takeaway

Мультиинструмент Nub на базе Rust предоставляет экосистеме Node.js скорость и функциональность Bun, полностью сохраняя совместимость с командами pnpm и флагами Node.js.

Highlights

  • Инструмент Nub представляет собой единый исполняемый файл на Rust, совмещающий функции менеджера пакетов, раннера TypeScript и менеджера версий Node.js.

  • В локальном бенчмарке с 14 прямыми и 212 уникальными зависимостями Nub установил пакеты за 136 миллисекунд, обогнав Bun (239 мс) и pnpm (более 1000 мс).

  • Команда `nubx` запускает бинарные файлы из node_modules напрямую через Rust без создания дополнительного процесса Node.js, выполняя esbuild за 169 мс против 423 мс у pnpm.

  • Система запуска файлов Nub поддерживает синтаксис TypeScript с enum и namespaces, автоматическую загрузку переменных из .env файлов и полифилы современных Web API.

  • Встроенная защита менеджера пакетов по умолчанию блокирует запуск билд-скриптов без явно одобренного разрешения и устанавливает минимальный возраст релизов в 24 часа.

Timeline

Назначение и происхождение инструмента Nub

  • Nub работает поверх установленной среды Node.js, а не заменяет её альтернативным движком.
  • Архитектура проекта переносит лучшие решения Bun в стандартную экосистему Node.js.
  • Разработчиком инструмента выступил автор библиотеки Zod и концепта tRPC Колин.

Название Nub представляет собой обратное написание слова Bun. В отличие от Bun, заменяющего среду выполнения V8, Nub функционирует над оригинальной Node.js. Инструмент объединяет в едином бинарном файле функции исполнения TypeScript, управления пакетами и переключения версий Node.

Возможности системы запуска файлов и поддержка TypeScript

  • Nub полностью компилирует синтаксические конструкции TypeScript, включая enum, namespace и parameter properties.
  • Встроенная система импорта обрабатывает файлы JSON, YAML, HTML, TXT, а также декораторы и синтаксис JSX.
  • В экосистему автоматически внедряются полифилы для Web Workers, Temporal API и экспериментальный localStorage.

При запускe TypeScript-кода Node.js выдает ошибку на спецификаторах namespace и enum. Nub корректно транспилирует данный синтаксис и автоматически внедряет переменные из файлов .env и .env.local с учетом их приоритета. Скорость выполнения файлов максимально приближена к нативному Node.js и превышает показатели библиотеки TSX.

Автоматическое управление версиями Node.js

  • Nub считывает требуемую версию Node.js из файлов .node-version, .nvmrc или package.json.
  • Недостающие версии среды загружаются напрямую с официального сайта Node.js без участия сторонних утилит.
  • Командный интерфейс включает функции установки, удаления, вывода списка и фиксации версий.

Инструмент полностью заменяет сторонние менеджеры версий вроде NVM или FNM. При изменении указанного номера версии в конфигурационном файле проекта последующий запуск команды `nub` автоматически скачивает и активирует нужный релиз Node.js.

Менеджер пакетов и безопасность зависимостей

  • Nub считывает и обновляет существующие lock-файлы от pnpm, Bun, npm и Yarn.
  • Установка 1168 пакетов без сети занимает 346 миллисекунд согласно синтетическим тестам.
  • Автоматическая задержка установки релизов на 24 часа предотвращает атаки на цепочки поставок.

Синтаксис и флаги управления пакетами полностью совпадают с интерфейсом pnpm, включая поддержку воркспейсов. Для защиты от вредоносного кода исполняемые билд-скрипты пакетов заблокированы до ручного подтверждения пользователем, а повторная установка 212 уникальных зависимостей занимает 136 мс.

Запуск бинарных файлов и запуск скриптов

  • Утилита `nubx` напрямую исполняет бинарные файлы из node_modules с помощью кода на Rust.
  • Команда `nub run` исключает накладные расходы на запуск процессов Node.js при старте скриптов.
  • Ядро утилиты использует встраиваемый модуль OBE от автора проекта Mise.

Отсутствие промежуточного процесса Node.js при вызове `nubx` ускоряет старт утилит в сравнении с npx и `pnpm exec`. Под капотом менеджера пакетов применяется встроенное решение OBE, разработанное совместно с создателем инструмента Mise.

Сценарии применения и итоговый анализ

  • Официальный GitHub Action `nub` служит прямой заменой для setup-node в CI/CD пайплайнах.
  • Основным сценарием использования Nub выступает быстрая настройка изолированных тестовых окружений и виртуальных машин.
  • Замена TSX на запуск файлов через Nub ускоряет локальный цикл разработки.

Благодаря формату единого исполняемого файла Nub оптимизирует развертывание Node.js на чистых виртуальных серверах. В повседневной разработке инструмент способен заменить TSX для исполнения TypeScript и ускорить выполнение скриптов package.json без изменения привычного рабочего процесса pnpm.

Community Posts

View all posts