There's a NEW Package Manager!? (Bun Alternative)

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

Transcript

00:00:00Das ist Nub, ein All-in-One-JavaScript-Toolkit, das auf Node aufbaut, anstatt es zu ersetzen.
00:00:04Es ersetzt all diese Tools, die du derzeit nutzt – vom Paketmanager,
00:00:08der fünfmal schneller als pnpm ist, über den TypeScript-Runner, der TSX ersetzen kann,
00:00:13bis hin zu einem Node-Versionsmanager. Es bietet Buns beste Features, aber auf dem normalen Node.js,
00:00:17und das ist wahrscheinlich auch der Grund, warum Nub einfach Bun rückwärts geschrieben ist.
00:00:21Und ich weiß, JavaScript-Devs lieben es, Dinge neu zu erfinden, aber das ist nicht nur ein Projekt von irgendwem.
00:00:25Es wurde von Colin entwickelt, dem Schöpfer von Zod. Er hat auch den Proof of
00:00:29Concept für tRPC gebaut und sogar bei Bun gearbeitet. Schauen wir es uns also einfach mal an.
00:00:38Nub ist eine einzelne Rust-Binary und funktioniert auf Mac, Windows und Linux. Wie im Intro gezeigt,
00:00:44sind das nur einige der Tools, die es ersetzen kann: ein Datei-Runner, ein Skript-Runner,
00:00:47ein Paket-Runner, ein Paketmanager und ein Node-Versionsmanager. Gehen wir das alles durch.
00:00:52Zuerst der Datei-Runner, und allein dieser bietet extrem viele Features. Er unterstützt volles
00:00:56TypeScript und nicht nur Type Stripping wie Node. Er kann also Tools wie TSX oder ts-node ersetzen.
00:01:02Hier sehen wir eine TypeScript-Datei mit Enums, Namespaces sowie Parameter-
00:01:06Eigenschaften – etwas, das Node normalerweise nicht ausführen kann. Wenn ich Nub ausführe und die
00:01:11Datei angebe, läuft es problemlos durch, während Node hier scheitern würde.
00:01:15Wenn ich Nub hier also durch Node ersetze, sehen wir den Fehler "Nicht unterstützte TypeScript-Syntax",
00:01:20da es den Namespace oder das Enum nicht mag. Der Datei-Runner kann auch Tools wie dotenv ersetzen,
00:01:24und importiert Umgebungsvariablen automatisch. Er unterstützt .env, .env.local sowie
00:01:29Node-Umgebungsvariablen und bietet sogar automatische Variablen-Expansion. Hier unten haben wir eine
00:01:33Variable, die sich aus anderen Umgebungsvariablen zusammensetzt: den Datenbank-User und den
00:01:37Datenbank-Host. Führe ich diese Datei nun mit Nub aus, werden die Umgebungsvariablen
00:01:41Variablen für mich und hat meine Health-Check-URL unter Verwendung der anderen Umgebungsvariablen zusammengestellt.
00:01:46Ausserdem stimmt mein API-Schlüssel nicht mit dem in der .env-Datei überein.
00:01:50Das liegt daran, dass .env.local immer Vorrang hat, und dort ist der API-Schlüssel
00:01:54auf “subscribe to better stack” gesetzt. Das solltet ihr definitiv tun, wenn ihr über
00:01:58KI- und Entwickler-News auf dem Laufenden bleiben wollt. Bitte abonnieren, das hilft sehr! Als Nächstes
00:02:02führe ich “nub src/index.tsx” aus und wir sehen, dass alles funktioniert. Das ist
00:02:07mein Nub-Komplettbeispiel. Im Code nutze ich etliche Features des Nub-Datei-Runners.
00:02:12Eines davon: Wir können JSON-Dateien importieren, ebenso wie YAML,
00:02:15HTML und sogar Textdateien. Zudem ersetzt es Tools wie tsconfig-paths. Die von mir
00:02:20in der tsconfig definierten Pfade mit @config werden von Node korrekt
00:02:24aufgelöst. Es gibt auch Unterstützung für Dekoratoren wie service und sealed hier. Es bietet
00:02:29JSX-Support und transpiliert basierend auf den tsconfig-Einstellungen. Sogar moderne
00:02:34Schlüsselwörter wie “using” für explizites Ressourcenmanagement funktionieren. Darüber hinaus
00:02:38werden viele moderne APIs wie Web Workers, Temporal und viele andere unterstützt. Es stellt
00:02:43automatisch Polyfills für alte Node-Versionen bereit und aktiviert experimentelle
00:02:48Node-Features wie localStorage direkt. Das kratzt nur an der Oberfläche all der
00:02:52Features des Datei-Runners. Ich möchte auch erwähnen, dass er flag-für-flag kompatibel mit
00:02:56Node ist. Da am Ende einfach Node ausgeführt wird, werden diese Flags weitergereicht. Nutzt
00:03:01dein Skript keine Features, die Node nicht unterstützt, kannst du einfach nub durch node ersetzen und erhältst
00:03:06exakt dasselbe Ergebnis. All das geschieht übrigens ohne spürbaren Geschwindigkeitsverlust.
00:03:10Es liegt so nah an Node wie möglich, und laut Dokumentation dauert das Ausführen
00:03:14einer Datei mit Nub exakt genauso lange wie mit Node. Schneller als Bun ist es allerdings nicht, da Bun
00:03:19eine native Runtime ist, die Node ersetzt, während Nub auf Node aufbaut. Ich habe einen eigenen
00:03:24Benchmark auf meinem Mac durchgeführt, um zu sehen, was schneller ist. Wenn wir das übersichtlicher
00:03:28darstellen, sehen wir, dass Node bei mir am schnellsten war. Es war nicht exakt
00:03:31die gleiche Geschwindigkeit wie Nub; Nub lag knapp dahinter, aber TSX war langsamer als beide. Weg vom
00:03:36Datei-Runner: Feature Nummer zwei ist der Node-Versionsmanager. Die Zeiten von NVM oder
00:03:41FNM sind vorbei. Gibt es in meinem Projekt eine Datei namens .node-version, oder ist sie in der .nvmrc oder
00:03:46in der package.json definiert, installiert Nub die erforderliche Node.js-Version automatisch.
00:03:52Aktuell nutzt dieses Projekt die neueste Node-26-Version. Ändere ich diese Datei zum Beispiel
00:03:56auf 24 und führe es erneut mit Nub aus, wird diese Node-Version automatisch heruntergeladen.
00:04:02Es bietet auch alle üblichen Befehle: Wir können Node-Versionen installieren, die installierten
00:04:06auflisten, Versionen deinstallieren und sogar Versionen anpinnen, was die Node-Versionsdatei
00:04:10automatisch erstellt. Es ist wirklich so einfach. Gehen wir weiter zu den nächsten drei Features,
00:04:15bei denen Nub pnpm und Bun ersetzen kann. Zuerst Feature Nummer drei: der
00:04:20Paketmanager. Er verspricht fünfmal schneller zu sein als pnpm – und ich dachte, pnpm sei schon
00:04:25extrem schnell. Es funktioniert wie erwartet: “nub install” installiert die Pakete. Ein cooles Detail
00:04:31ist, dass es bestehende Lockfiles übernehmen kann. Hast du zuvor Bun oder pnpm in einem Projekt
00:04:36genutzt, aktualisiert Nub diese Lockfiles einfach, anstatt ein eigenes anzulegen. Das macht den Wechsel
00:04:41super einfach, falls nötig. Dasselbe gilt für die pnpm-Kompatibilität. Jeder Paketmanager-Befehl
00:04:46in Nub entspricht exakt dem von pnpm, inklusive erweiterter Features wie
00:04:51Workspace-Katalogen. Es nutzt dieselben Flags, sodass der Wechsel zwischen pnpm und Nub reibungslos klappt.
00:04:57Und wer npm, Bun oder Yarn nutzt: Deren Konfigurationsoptionen werden ebenfalls erkannt.
00:05:02Was das Versprechen zur Geschwindigkeit angeht: Laut Benchmarks ist Nub am schnellsten bei warmen,
00:05:06unveränderten Installs: Es brauchte 346 Millisekunden für 1168 Pakete. Auf meinem Rechner habe ich
00:05:1314 direkte Abhängigkeiten getestet, die zu 212 Paketen führen. Der Benchmark zeigt, dass Nub
00:05:19am schnellsten war. Nub installierte die Pakete in 136 ms, Bun folgte dahinter mit 239 ms,
00:05:25während pnpm und npm über eine Sekunde brauchten. Das Versprechen scheint auf meinem Rechner zu stimmen –
00:05:30mit wirklich beeindruckenden Zeiten. Der Paketmanager übernimmt beim Thema Sicherheit die besten
00:05:35Seiten von pnpm: Standardmäßig gilt ein Mindestalter der Releases von 24 Stunden, und Build-Skripte
00:05:40werden nur nach Freigabe ausgeführt. Vor den meisten Shai-Hulud-Angriffen sollte man also sicher sein.
00:05:45Der nächste wichtige Teil eines Paketmanagers ist das Ausführen von Paketen (Feature 4).
00:05:49Die Schlagzeile hier: 19-mal schneller als npx. Der Befehl “nubx” verweist direkt auf den
00:05:54bin-Ordner in node_modules. In Rust führt er die Binaries direkt aus, ohne dass ein Node-Prozess
00:05:59im Wrapper läuft. Dadurch funktioniert es mit jedem Paketmanager, da direkt auf node_modules
00:06:03zugegriffen wird. Wie bei den meisten Nub-Befehlen ist es flag-für-flag kompatibel mit
00:06:07pnpm exec, einschließlich der dlx-Befehle. Im Benchmark auf meinem Mac war Nub tatsächlich
00:06:12am schnellsten: 169 ms für einen esbuild-Aufruf gegenüber 423 ms bei pnpm. Auch hier stimmt
00:06:20das Versprechen. Das letzte wichtige Feature ist der Skript-Runner. Dieser soll
00:06:2424-mal schneller als “pnpm run” sein und bietet Lifecycle-Hooks, npm-Umgebungsvariablen
00:06:29und Argumentenweiterleitung. Wenn man npm oder pnpm nutzt, starten diese jedes Mal
00:06:34Node.js-Programme und laden das JavaScript des Paketmanagers, während Nub einfach seine Rust-Binary
00:06:38ohne Startprozesse nutzt. Meine lokalen Benchmarks zeigten erneut, dass “nub run” am schnellsten war,
00:06:43wenn auch nicht mit einem ganz so großen Vorsprung wie in der Dokumentation. Erwähnenswert ist auch
00:06:47(und das ist das vierte Mal in diesem Video), dass dieser Befehl flag-für-flag kompatibel mit
00:06:51pnpm ist und somit auch Monorepo-Features unterstützt. Ein Detail bei den letzten drei
00:06:56Features möchte ich hervorheben: Nub hat das Rad nicht neu erfunden. Es nutzt unter der Haube
00:07:00Obe, einen von JDX (dem Schöpfer von Mise) geschriebenen Paketmanager.
00:07:04Er hat den Paketmanager so gebaut, dass er in andere Bibliotheken eingebettet werden kann. Colin hat
00:07:08mit ihm zusammengearbeitet, um ihn in Nub zu nutzen – es ist also keine fremde Arbeit kopiert worden.
00:07:13Das waren die Hauptfeatures von Nub, aber es gibt noch viel mehr zu entdecken – wie die GitHub Action,
00:07:17die als direkter Ersatz für die offizielle setup-node-Action dient. Es wurde wirklich gebaut,
00:07:21um alles rund um Node viel einfacher zu machen. Aber jetzt stellt sich die Frage: Würde ich
00:07:26das tatsächlich nutzen? Meine Antwort: Ja, in bestimmten Szenarien. Um ehrlich zu sein,
00:07:31ich bin ein sehr intensiver Bun-Nutzer und hatte in meiner Entwicklung nie Kompatibilitätsprobleme.
00:07:35Vielleicht steige ich wegen des neuen Rust-Ports um, aber selbst dann würde ich pnpm für alles
00:07:40andere nutzen – und ich muss zugeben, dass mir pnpm nie zu langsam vorkam. Zudem nutze ich
00:07:44Mise für meine Node-Versionen, daher brauche ich diesen Teil eher nicht. Allerdings kann ich
00:07:48mir vorstellen, den Datei-Runner zu nutzen, der TSX ersetzt. Der ideale Anwendungsfall,
00:07:52den ich für mich sehe, sind neue temporäre virtuelle Maschinen. Manchmal erstelle ich diese sehr
00:07:57schnell für Tests. Wenn ich dann einfach mit Node loslegen möchte, ist Nub eines der komplettesten
00:08:01Pakete und der schnellste, einfachste Weg dafür. Es sind also meist nur Gewohnheiten,
00:08:05die mich davon abhalten, Nub täglich zu nutzen. Mich würde aber interessieren, was ihr
00:08:08als Paketmanager nutzt. Und falls ihr etwas wie Nub nutzt: Denkt ihr darüber nach, von Bun
00:08:12umzusteigen, jetzt da es in Rust neu geschrieben wurde? Lasst es mich in den Kommentaren wissen! Oder falls
00:08:16ihr abonniert habt – wie immer: Bis zum nächsten Mal!

Key Takeaway

Das auf Rust basierende Toolkit Nub erweitert bestehende Node.js-Umgebungen um native TypeScript-Ausführung, automatische Versionsverwaltung und extrem schnelle Paketinstallationen in bis zu 136 ms, ohne eine eigene Runtime zu erzwingen.

Highlights

  • Nub ist ein in Rust geschriebenes All-in-One-JavaScript-Toolkit, das als Erweiterung direkt auf Node.js aufbaut.

  • Bei kalten und warmen Installationen führt Nub Paketinstallationen in 136 ms aus und ist damit schneller als Bun (239 ms) und pnpm (über 1000 ms).

  • Der integrierte Datei-Runner unterstützt natives TypeScript mit Enums und Namespaces, automatischen .env-Variablen-Import sowie JSX ohne zusätzliche Tools wie TSX.

  • Das Tool ersetzt dedizierte Versionsmanager wie NVM oder FNM, indem es Node-Versionen aus .node-version, .nvmrc oder package.json automatisch nachlädt.

  • Über das Tool “nubx” werden Binärdateien direkt aus dem Ordner node_modules ausgeführt, was Aufrufe wie esbuild in 169 ms abwickelt.

Timeline

Überblick und Architektur von Nub

  • Nub funktioniert als einzelne Rust-Binärdatei auf macOS, Windows und Linux.
  • Das Tool dient als direkte Erweiterung für Node.js und unterscheidet sich damit von eigenständigen Runtimes wie Bun.
  • Entwickelt wurde Nub von Colin, dem Schöpfer der Schema-Bibliothek Zod.

JavaScript-Projekte erfordern oft eine Vielzahl spezialisierter Werkzeuge für Versionierung, Skriptausführung und Paketverwaltung. Nub konsolidiert diese Aufgaben in einer einzigen Anwendung, die voll kompatibel mit bestehenden Node.js-Infrastrukturen bleibt. Das System basiert auf der Leistungsfähigkeit von Rust und nutzt bewährte Schnittstellen des Node-Ökosystems.

Funktionsumfang des Datei-Runners

  • Spezifische TypeScript-Syntax wie Enums, Namespaces und Dekoratoren wird ohne Konfigurationsaufwand direkt ausgeführt.
  • Umgebungsvariablen aus .env und .env.local werden automatisch geladen und aufgelöst.
  • Importe von JSON, YAML, HTML und Textdateien funktionieren ohne zusätzliche Bundler.

Herkömmliche Node.js-Runtimes scheitern an komplexen TypeScript-Konstrukten oder erfordern externe Wrapper wie TSX. Nubs Datei-Runner wickelt die Transformation intern ab und reicht Standard-Node-Flags eins zu eins weiter. In lokalen Testläufen liefert der Runner dabei nahezu identische Ausführungszeiten wie natives Node.js und übertrifft Werkzeuge wie TSX deutlich.

Integrierte Node.js-Versionsverwaltung

  • Definierte Versionen in Konfigurationsdateien wie .node-version werden bei der Ausführung automatisch heruntergeladen.
  • Befehle zum Installieren, Auflisten, Entfernen und Anpinnen von Versionen ersetzen Tools wie NVM oder FNM.

Die manuelle Umschaltung von Laufzeitumgebungen entfällt beim Wechsel zwischen Repositories. Sobald eine Datei wie .nvmrc oder eine package.json mit Versionsangabe erkannt wird, stellt Nub die exakte Version im Hintergrund bereit. Das vereinfacht das Setup auf neuen Entwickler-VMs oder in Continuous-Integration-Pipelines.

Paketmanager, Paket-Runner und Skript-Ausführung

  • In Benchmarks mit 212 Paketen schließt Nub die Installation in 136 ms ab.
  • Vorhandene Lockfiles von pnpm, Bun oder Yarn werden direkt verarbeitet und aktualisiert.
  • Der Ausführungsbefehl nubx startet Binärdateien ohne zusätzlichen Node-Wrapper-Prozess.

Unter der Haube integriert Nub das Paketmanager-Projekt Obe von JDX. Durch den Verzicht auf das Laden von JavaScript-Code beim Start von Skripten sinkt die Latenz bei Konsolenbefehlen drastisch. Sicherheitsfunktionen wie ein standardmäßiges Release-Mindestalter von 24 Stunden schützen zudem vor fehlerhaften oder schädlichen Paket-Updates.

Erweiterungen und praktische Anwendungsfälle

  • Eine eigene GitHub Action dient als direkter Ersatz für die offizielle setup-node-Action.
  • Das Paket eignet sich ideal für die schnelle Einrichtung temporärer Testumgebungen.

Obwohl etablierte Arbeitsabläufe mit Bun oder pnpm bestehen bleiben können, bietet Nub einen Mehrwert durch die Kombination aller Core-Funktionen in einer einzigen Binärdatei. Vor allem bei frischen Installationen und virtuellen Maschinen entfällt das schrittweise Einrichten einzelner Tools.

Community Posts

View all posts