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!