Nub — это комплексный набор инструментов для JavaScript/TypeScript, который приближает опыт разработки на Node.js к уровню Deno или Bun. В этой статье представлен обзор Nub и различных способов его использования.
У меня до сих пор есть несколько проектов, использующих Bun, и я уже писал об использовании Bun в качестве среды выполнения или инструмента. Для демо-версий, небольших внутренних инструментов или разовых скриптов Bun позволял мне писать на TypeScript и сразу же запускать код. Мне не нужно было выбирать между ts-node и tsx, настраивать инструментарий TypeScript или создавать собственный загрузчик. Его менеджер пакетов также работал быстрее, чем npm, а встроенный API для тестирования означал, что мне не нужно было подключать Vitest для каждого маленького проекта.
Привлекательность была проста: меньше инструментов для настройки перед началом написания кода и удобная работа с проектом.
Однако большинство этих проектов на самом деле не являются приложениями для Bun. Они не зависят от Bun.serve(), Bun.file() или других специфических API Bun. Bun для меня — это в основном команда, которую я ввожу для запуска или управления проектами на TypeScript.
Это различие важно, потому что Node.js сильно изменился.
В Node.js теперь больше современных функций
Ранее я писал о том, что в Node.js появилась встроенная поддержка файлов окружения, режима отслеживания изменений (watch mode) и запуска скриптов из package.json. Я также освещал раннюю поддержку прямого запуска файлов TypeScript и нативных привязок SQLite.
Встроенный тестовый раннер через node:test также стал для меня приятным открытием. Для многих моих проектов это устраняет еще одну причину переходить на другую среду выполнения или устанавливать отдельный тестовый фреймворк.
Тем не менее, эти функции не складываются в полноценный опыт работы с проектом на TypeScript.
Встроенная в Node поддержка TypeScript намеренно ограничена. Она может удалять типы из файла и запускать оставшийся JavaScript, но не читает ваш tsconfig.json. Она не обрабатывает JSX, а функции TypeScript, требующие преобразования в JavaScript, нуждаются в чем-то большем, чем просто удаление типов. Пути импорта, которые работают в редакторе, также могут не работать при запуске программы.
Это разумная граница для Node.js. Разработчики осторожно относятся к изменению принципов работы программ, и эта осторожность — одна из причин, почему Node.js доверяют в продакшене.
Результат, однако, заключается в том, что обычный проект на TypeScript все еще обрастает множеством инструментов вокруг Node: раннер TypeScript (например, tsx), отслеживание файлов, менеджер пакетов, раннер скриптов и/или менеджер версий Node. В моем случае я могу использовать pnpm для зависимостей, n для выбора версии Node и еще один пакет для запуска TypeScript.
Каждый инструмент полезен. Но мне не нравится такая совокупность настроек.
Nub — это не еще одна среда выполнения JavaScript
Nub — это комплексный инструментарий командной строки для Node.js. Он написан на Rust, но ваше приложение по-прежнему работает в обычной среде Node.js. Он включает в себя раннер скриптов и файлов, менеджер пакетов и менеджер версий Node.
«Как он это делает?», — можете спросить вы.
Nub подготавливает файлы TypeScript, применяет необходимые настройки проекта, выбирает правильную версию Node.js, загружает файлы окружения, а затем передает приложение (транспилированные файлы) в Node.js. Это работает как для JavaScript, так и для TypeScript проектов и файлов.
Вы можете установить его с помощью команды npm install --global @nubjs/nub или brew install nubjs/tap/nub в Homebrew. Существуют и другие варианты установки, которые вы найдете в их документации.
Вот основные команды, которые демонстрируют его назначение:
Первая команда запускает файл TypeScript напрямую. В отличие от встроенного в Node удаления типов, Nub поддерживает более широкий набор функций TypeScript, используемых в реальных проектах. Он может читать псевдонимы путей из tsconfig.json, обрабатывать TSX и декораторы, а также заставлять импорты вести себя так же, как в редакторе. nubx — это альтернатива npx или pnpx.
Насколько я знаю, Nub не проверяет типы в вашей программе. Он подготавливает файл к выполнению. Я бы все равно оставил проверку TypeScript в процессе разработки и CI:
С переходом tsc на Go вы можете быть уверены, что ваш CI останется быстрым.
Nub как утилита для Node.js
Запуск файла TypeScript — это самое простое знакомство с Nub, но более интересная часть заключается в том, как он относится к проекту в целом. Инструмент отслеживания файлов nub watch перезапускает программу при изменении кода. Он также может реагировать на файлы проекта, такие как tsconfig.json, package.json и загруженные файлы окружения. Это полезнее, чем просто наблюдать за директорией, не понимая, какие файлы влияют на запущенное приложение.
Команда nubx запускает бинарные инструменты, такие как Prisma, ESLint или tsc. Сначала она проверяет локальный проект. Если пакет отсутствует, Nub спрашивает, прежде чем скачивать и запускать его. В CI он не будет молча загружать пакет, если такое поведение не было явно разрешено.
Он также может управлять версией Node, используемой в проекте. Он читает общие источники, такие как .nvmrc, .node-version и поле engines.node в package.json. Если запрошенная версия недоступна, Nub может скачать и кэшировать официальную сборку Node.js.
Nub может показаться скучным, если вы привыкли к Bun, но его польза может оказаться больше, чем кажется на первый взгляд. Новый участник может клонировать репозиторий и запустить проект с нужной версией Node, не изучая предварительно, какой менеджер версий использует команда. Также снижается вероятность того, что в CI и локальной разработке будут использоваться разные версии.
В совокупности эти функции делают Nub похожим не на замену tsx или pnpm, а на способ повысить продуктивность разработки в Node.js в 5 раз.
Вы можете оставить pnpm
Или нет.
Nub включает функции управления пакетами, но переход на Nub не требует замены вашего существующего менеджера пакетов. Для проектов, не связанных с Bun, я обычно использую pnpm. Я могу продолжать использовать его для установки и lock-файлов, используя Nub для запуска файлов TypeScript, скриптов пакетов, локальных команд и правильной версии Node.
Однако я могу переключиться на Nub для управления пакетами, потому что Nub умеет читать и записывать lock-файлы pnpm версии 9! Есть лишь небольшой набор функций pnpm, которые Nub (пока!) не может заменить, например, pnpm deploy. Если я не использую такие функции, переход становится простым.
Существуют различные способы, которыми Nub помогает вам работать с другими менеджерами пакетов, такими как npm, Bun и yarn, или мигрировать с них. Это делает Nub более доступным для тестирования и показывает, что команда уделила время тому, чтобы с ним было легко работать. Обязательно ознакомьтесь с их документацией.
Может ли Nub заменить Bun в моих проектах?
Для некоторых из них — да.
Лучшие кандидаты — это проекты, где Bun в основном используется для прямого выполнения TypeScript, тестирования или управления пакетами. Эти потребности теперь могут быть покрыты Nub и встроенным тестовым раннером Node. Это также означает, что разработка и продакшн могут использовать одну и ту же среду выполнения, что важно для серьезных проектов. Bun добился определенного прогресса в совместимости с Node.js, но это все еще другая среда выполнения с неполной совместимостью. Многие пакеты работают, но менее распространенное поведение и нативные аддоны все еще могут выявлять различия.
Изображение с сайта Nub
Nub позволяет избежать такого рода несоответствий, потому что он не имитирует Node.js. Он запускает процесс Node.js.
Это не делает Nub прямой заменой для любого проекта на Bun. Приложение, использующее Bun.serve(), Bun.file(), bun:sqlite, bun:test или другие специфические функции Bun, делает осознанный выбор среды выполнения. Перенос такого приложения на Node требует замены этих API, а не просто изменения команды в терминале. В руководстве по миграции на Bun от Nub есть инструкция для такого сценария.
Поэтому практический вопрос заключается не в том, «может ли Nub заменить Bun?», а в том, «почему этот проект использует Bun? И действительно ли мне нужны специфические API Bun?»
С чего можно начать
Если вам любопытно попробовать Nub, вы можете протестировать его на менее рискованной части существующего проекта. Это может быть скрипт обслуживания, небольшая демо-версия или менеджер версий Node. Таким образом, эксперимент останется небольшим и обратимым, поскольку Nub не обязательно должен охватывать весь проект, чтобы приносить пользу.
Интересная особенность Nub заключается не в том, что он заменяет Node.js, в отличие от Bun или Deno. Он упрощает работу с TypeScript в Node.js и заменяет множество отдельных инструментов для управления проектом. Именно поэтому я пересмотрел свои оставшиеся проекты на Bun.
Попробуйте и дайте знать, как у вас все прошло.
- Вы можете удивиться, учитывая маркетинговые заявления о производительности среды выполнения Bun. Однако проблемы с совместимостью Node-API и периодические сбои в стабильности заставили меня вернуться к Node.js для серьезной работы, а многие устаревшие проекты по-прежнему полагались на совместимость с Node.js. Кроме того, многие личные проекты работали на Cloudflare Workers. ↩︎
Вы можете удивиться, учитывая маркетинговые заявления о производительности среды выполнения Bun. Однако проблемы с совместимостью Node-API и периодические сбои в стабильности заставили меня вернуться к Node.js для серьезной работы, а многие устаревшие проекты по-прежнему полагались на совместимость с Node.js. Кроме того, многие личные проекты работали на Cloudflare Workers. ↩︎









