Come rendere Node.js veloce e conveniente senza passare a Bun
I motori Bun e Deno hanno reinventato la familiare esperienza di sviluppo JS. Il supporto nativo TypeScript, l'avvio istantaneo dei test e un gestore di pacchetti reattivo hanno fissato un nuovo standard di qualità. Tuttavia, non tutti sono pronti a migrare la propria produzione reale su un nuovo runtime. Addon C++ specifici, sfumature del comportamento dei moduli e il legacy accumulato mantengono la maggior parte dei progetti su Node.js classico.
Il team del progetto Nub ha deciso di seguire un approccio diverso. Invece di creare un altro runtime isolato, hanno scritto un'utilità in Rust che potenzia Node standard.
Qual è l'idea
Gli sviluppatori spesso caricano i loro progetti con una dozzina di utility: 4 o 5 per l'esecuzione TypeScript, 6 o 7 per la gestione delle versioni Node.js, 8 per i pacchetti e 9 per le variabili d'ambiente. Di conseguenza, l'avvio di qualsiasi script comporta centinaia di millisecondi di ritardo prima che il codice inizi anche solo a essere eseguito.
Nub combina tutte queste funzioni in un unico binario Rust. Lo strumento funziona come uno strato trasparente tra lo sviluppatore e Node.js. V8 e i moduli standard rimangono invariati all'interno, ma tutti gli strumenti circostanti funzionano a velocità di codice compilato.
0Esecuzione TypeScript e selezione automatica della versione
Il comando 10 esegue 11, 12, 13, 14, 15 e altri formati senza alcuna configurazione di strumenti di build.
Sotto il cofano, utilizza il veloce parser Rust Oxc. Per la transpilazione e la corretta risoluzione dei percorsi (inclusi 16 e import senza estensioni), Nub sfrutta i punti di estensione moderni di Node.js: preload 17 e il meccanismo 18.
Un aspetto interessante riguarda la gestione delle versioni. Quando si lancia un file, Nub verifica la presenza di file 19, 20 o della sezione 21 in 22. Se la versione Node richiesta non è disponibile localmente, l'utilità la scarica nella cache ed esegue il codice attraverso di essa.
1Nub rimuove automaticamente anche i flag sperimentali per le nuove funzionalità di Node.js. Lavorare con 23, 24 o 25 funziona immediatamente senza bisogno di specificare flag CLI.
Accelerazione degli script e avvio dei binari
Ogni volta che viene chiamato 26 o 27, viene avviato un processo Node.js completo solo per leggere 28 e invocare lo script shell appropriato. L'attesa per l'inizializzazione dell'ambiente JS crea un collo di bottiglia evidente.
Poiché 29 è scritto in Rust, non c'è fase di inizializzazione JavaScript. Gli script vengono prelevati istantaneamente.
Nei benchmark degli sviluppatori, l'avvio a caldo di uno script tramite 30 richiede circa 14 millisecondi. Per confronto, 31 ha questo valore a circa 330 millisecondi, e 32 supera i 440 millisecondi.
L'utilità 33 funziona in modo simile, sostituendo 34 e 35. Quando si chiama un binario da 36, non crea un processo Node.js intermedio aggiuntivo, rendendolo circa 19 volte più veloce di 37.
2Se un pacchetto non è disponibile localmente, 38 lo scarica dal registro, lo esegue e rimuove i file temporaneamente creati.
Gestore di pacchetti e supporto Corepack
Il comando 39 gestisce il recupero delle dipendenze. È costruito sul motore Aube, che può funzionare in modalità compatibilità con i file lock esistenti.
Se entri in un progetto con 40, Nub rispetta le impostazioni di pnpm, legge 41 e costruisce il grafico delle dipendenze senza conflitti. Lo stesso vale per i progetti con 42 o 43.
Diverse funzionalità di sicurezza durante l'installazione dei pacchetti:
- Blocco automatico degli script 44 per impostazione predefinita.
- Verifica della versione del pacchetto rispetto al database delle vulnerabilità osv.dev durante la risoluzione del grafico.
- Restrizione dell'età minima di rilascio di 24 ore per proteggere dagli attacchi alla supply chain.
Per lavorare con più versioni del gestore di pacchetti, è disponibile il comando 45. Crea shim globali per 46, 47 e 48. Questa è una sostituzione utile per Corepack, che è stato rimosso da Node.js a partire dalla versione 25.
Utilizzo pratico
Lo strumento non richiede di modificare la struttura del progetto o di abbandonare l'infrastruttura esistente. Puoi installarlo globalmente e usarlo solo per il debug rapido o l'esecuzione di utility CLI locali.
3Nei pipeline GitHub Actions, lo standard 49 viene sostituito con 50. Questo fornisce un'interfaccia coerente e accelera l'esecuzione dei passaggi di build attraverso la cache rapida e l'installazione delle dipendenze.
In sintesi
Nub si rivela essere un compromesso solido per i team che apprezzano la praticità di Bun ma affrontano vincoli tecnici che impediscono loro di lasciare Node.js. L'utilità consolida una raccolta sparsa di strumenti CLI, accelera i comandi quotidiani e non ti costringe a riscrivere una singola riga di codice.
Il progetto è abbastanza nuovo ma ha già accumulato circa 3,8k stelle su GitHub. Vale la pena provarlo almeno per l'esecuzione istantanea di 51 e il comodo auto-download delle versioni Node.js richieste.
Progetti correlati