So machen Sie Node.js schnell und komfortabel, ohne zu Bun zu wechseln
Bun und Deno haben die vertraute JS-Entwicklungserfahrung neu erfunden. Native TypeScript-Unterstützung, sofortiges Starten von Tests und ein reaktiver Paketmanager setzen einen neuen Qualitätsmaßstab. Allerdings ist nicht jeder bereit, seine tatsächliche Produktion auf eine neue Runtime zu migrieren. Bestimmte C++-Addons, Nuancen im Modulverhalten und akkumuliertes Legacy halten die meisten Projekte bei klassischem Node.js.
Das Nub-Projektteam beschloss, einen anderen Ansatz zu verfolgen. Anstatt eine weitere isolierte Runtime zu erstellen, schrieben sie ein Utility in Rust, das standardmäßiges Node aufwertet.
Was ist die Idee
Entwickler beladen ihre Projekte oft mit einem Dutzend Utilities: 4 oder 5 zum Ausführen von TypeScript, 6 oder 7 zur Node.js-Versionsverwaltung, 8 für Pakete und 9 für Umgebungsvariablen. Infolgedessen entstehen beim Starten eines beliebigen Skripts Hunderte von Millisekunden Verzögerung, bevor Ihr Code überhaupt ausgeführt wird.
Nub kombiniert all diese Funktionen in einer einzigen Rust-Binary. Das Tool fungiert als transparente Schicht zwischen dem Entwickler und Node.js. V8 und Standardmodule bleiben innen unverändert, aber die gesamte umgebende Tooling funktioniert mit der Leistung von kompiliertem Code.
0TypeScript ausführen und automatische Versionsauswahl
Der 10 Befehl führt 11, 12, 13, 14, 15 und andere Formate ohne jegliche Build-Tool-Konfiguration aus.
Unter der Haube verwendet er den schnellen Oxc Rust-Parser. Für die Transpilierung und korrekte Pfadauflösung (einschließlich 16 und Imports ohne Erweiterungen) nutzt Nub moderne Node.js-Erweiterungspunkte: 17 Preload und den 18 Mechanismus.
Ein interessanter Aspekt betrifft die Versionsverwaltung. Beim Starten einer Datei prüft Nub auf 19 Dateien, 20 oder den 21 Abschnitt in 22. Wenn die erforderliche Node-Version nicht lokal verfügbar ist, lädt das Utility sie in den Cache herunter und führt den Code darüber aus.
1Nub entfernt auch automatisch experimentelle Flags für neuere Node.js-Funktionen. Das Arbeiten mit 23, 24 oder 25 funktioniert sofort, ohne CLI-Flags angeben zu müssen.
Beschleunigung von Skripten und Starten von Binaries
Jedes Mal, wenn 26 oder 27 aufgerufen wird, startet ein vollständiger Node.js-Prozess nur, um 28 zu lesen und das entsprechende Shell-Skript aufzurufen. Das Warten auf die Initialisierung der JS-Umgebung schafft einen spürbaren Engpass.
Da 29 in Rust geschrieben ist, gibt es keine JavaScript-Initialisierungsphase. Skripte werden sofort aufgenommen.
In den Benchmarks der Entwickler dauert das heiße Starten eines Skripts über 30 etwa 14 Millisekunden. Zum Vergleich: Bei 31 liegt dies bei rund 330 Millisekunden und 32 übersteigt 440 Millisekunden.
Das 33 Utility funktioniert ähnlich und ersetzt 34 und 35. Beim Aufrufen eines Binary von 36 wird kein zusätzlicher intermediärer Node.js-Prozess erstellt, was es etwa 19-mal schneller macht als 37.
2Wenn ein Paket nicht lokal verfügbar ist, lädt 38 es aus der Registry herunter, führt es aus und entfernt die temporär erstellten Dateien.
Paketmanager und Corepack-Unterstützung
Der 39 Befehl übernimmt das Abrufen von Abhängigkeiten. Er basiert auf der Aube-Engine, die im Kompatibilitätsmodus mit vorhandenen Lock-Dateien arbeiten kann.
Wenn Sie in ein Projekt mit 40 eintreten, respektiert Nub die pnpm-Einstellungen, liest 41 und erstellt den Abhängigkeitsgraphen ohne Konflikte. Das Gleiche gilt für Projekte mit 42 oder 43.
Mehrere Sicherheitsfunktionen beim Installieren von Paketen:
- Automatische Blockierung von 44 Skripten standardmäßig.
- Paketversionsprüfung gegen die osv.dev-Schwachstellendatenbank während der Graphauflösung.
- Mindestfreigabealter von 24 Stunden zum Schutz vor Supply-Chain-Angriffen.
Für die Arbeit mit mehreren Paketmanagerversionen ist der 45 Befehl verfügbar. Er erstellt globale Shims für 46, 47 und 48. Dies ist ein nützlicher Ersatz für Corepack, das ab Version 25 aus Node.js entfernt wurde.
Praktische Verwendung
Das Tool erfordert keine Änderung Ihrer Projektstruktur und kein Aufgeben Ihrer vorhandenen Infrastruktur. Sie können es global installieren und nur für schnelles Debugging oder zum Ausführen lokaler CLI-Utilities verwenden.
3In GitHub Actions-Pipelines wird das standardmäßige 49 durch 50 ersetzt. Dies bietet eine konsistente Schnittstelle und beschleunigt die Build-Schritt-Ausführung durch schnelles Caching und Abhängigkeitsinstallation.
Das Fazit
Nub erweist sich als solider Kompromiss für Teams, die Buns Bequemlichkeit schätzen, aber auf technische Einschränkungen stoßen, die sie daran hindern, Node.js zu verlassen. Das Utility konsolidiert eine verstreute Sammlung von CLI-Tools, beschleunigt alltägliche Befehle und zwingt Sie nicht, eine einzige Codezeile umzuschreiben.
Das Projekt ist ziemlich neu, hat aber bereits rund 3,8k Sterne auf GitHub angesammelt. Es lohnt sich, es zumindest für die sofortige 51-Ausführung und die bequeme automatische Herunterladung der erforderlichen Node.js-Versionen auszuprobieren.
Ähnliche Projekte