JavaScript è uno dei linguaggi di programmazione più diffusi e adottati al mondo. È alla base di applicazioni web, applicazioni mobili, software desktop e persino dispositivi embedded. Nonostante la sua diffusione, non è privo di sfide. Come tutte le tecnologie, JavaScript è alle prese con problemi di prestazioni, compatibilità, sicurezza e complessità.

Per risolvere questi problemi, nel corso degli anni sono stati sviluppati diversi runtime JavaScript. Node.js e Deno spiccano per le loro soluzioni ai limiti di JavaScript. Tuttavia, se da un lato hanno risolto molti problemi, dall’altro ne hanno introdotti di nuovi, come la necessità di pacchetti non necessari e prestazioni di runtime più lente.

Tra gli altri, c’è anche Bun, un runtime JavaScript che esiste da un po’ di tempo, ma il cui team ha rilasciato una versione stabile solo di recente, nel settembre 2023. Bun è stato creato per essere un’alternativa diretta e più efficiente a Node.js.

Questo articolo esplora Bun, le sue caratteristiche distintive e come integrarlo nei vostri progetti JavaScript.

Cos’è Bun?

Homepage del sito Bun.sh
Homepage del sito Bun.sh.

Bun è un runtime JavaScript scritto principalmente nel linguaggio di programmazione Zig. Il suo scopo è quello di risolvere i limiti di Node.js e di fornire un’esperienza di sviluppo più snella ed efficiente.

Tuttavia, Bun non è un runtime JavaScript come tanti altri che sono apparsi nel corso degli anni: Si tratta di un toolkit all-in-one progettato per rivoluzionare il modo in cui gli sviluppatori lavorano con JavaScript e TypeScript. Estendendo JavaScriptCore, il motore di Safari di Apple, Bun consente tempi di avvio rapidi e un migliore utilizzo della memoria.

A differenza di Node.js, Bun non si affida a npm né richiede dipendenze esterne per funzionare. Al contrario, dispone di una libreria standard integrata che offre funzionalità per diversi protocolli e moduli, tra cui variabili d’ambiente, HTTP, WebSocket, file system e altro ancora.

Inoltre, offre un supporto “ou͏t-of-the-box” per TypeScript. E poiché Bun traspila internamente ogni file sorgente JavaScript o TypeScript, si possono compilare ed eseguire direttamente i file TypeScript͏ senza bisogno di ulteriori configurazioni o transpilazioni.

Bun viene fornito con una potente interfaccia a riga di comando (CLI) che permette di eseguire run, format, lint, test͏, e bundle sul codice utilizzando i seguenti semplici comandi:

  • bun run: esegue un file JavaScript o TypeScript con Bun.
  • bun test: esegue test unitari con il framework di testin͏g integrato in Bun.
  • bun fmt: forma͏ il codice con il formattatore di codice integrato in Bun.
  • bun lint: lima il codice con il code linter integrato di Bun.
  • bun bundle: raggruppa il codice con il code bundler integrato di Bun.

Un’altra caratteristica di Bun è la funzione di hot reloading, che aggiorna le modifiche al codice al volo preservando lo stato dell’applicazione. Si tratta di un miglioramento significativo rispetto a Node.js, dove una funzionalità simile richiede pacchetti esterni come nodemon o il flag sperimentale --watch. Bun, invece, semplifica questo processo grazie all’utilizzo dell’opzione --hot flag.

Al di là dei suoi vantaggi tecnici, Bun vanta una comunità crescente di utenti che contribuiscono attivamente al suo sviluppo e al suo miglioramento. Questa vivace comunità garantisce che Bun sia sempre aggiornato e reattivo, offrendo ampie risorse per l’apprendimento e la risoluzione dei problemi.

Caratteristiche principali di Bun

Oltre all’hot reloading, al supporto nativo per TypeScript e ai tempi di avvio più rapidi, Bun ha diverse caratteristiche fondamentali che contribuiscono alla sua popolarità e alle sue prestazioni come runtime JavaScript: il bundler, il test runner e il gestore di pacchetti. Vediamo nel dettaglio queste caratteristiche.

Bundler

Un bundler consolida il codice JavaScript e le sue dipendenze in un unico file͏, ottimizzandone l’efficienza di caricamento per i browser o all’interno delle applicazioni Node.js. Node.js non dispone di un bundler͏ nativo, per cui gli sviluppatori devono affidarsi a bundler di terze parti come Rollup, Webpack e ͏Parcel per gestire il codice JavaScript.

Al contrario, Bun offre un bundler integrato che richiede una configurazione minima e supporta diversi formati di moduli. Inoltre, dispone di ottimizzazioni integrate che consentono un bundling più veloce. In termini comparativi, il bundler di Bun è superiore agli altri: è 1,75 volte più veloce di ͏esbuild, 150 volte più veloce di Parcel, 180 volte più veloce di Rollup + Terser e 220 volte più veloce di Webpack.

Si può raggruppare il proprio progetto tramite il comando bun bundle ͏<source> --out-dir <directory>. Bun genererà il file di output nella directory di output specificata:

Codice e terminale in cui è stato eseguito il comando di build
Creare il bundle di un progetto con Bun.

Test Runner

Il testing͏ è una parte integrante dello sviluppo del software, che garantisce la funzionalità del codice e identifica potenziali problemi prima della produzione. Bun include anche un test runner nel suo toolkit.

Inoltre, gli sviluppatori di Node.js hanno utilizzato framework di testing esterni come Jest, che è potente e flessibile ma introduce ulteriori dipendenze e costi di configurazione nel progetto.

D’altro canto, Bun integra il proprio test runner, enfatizzando la velocità e la compatibilità. Questo approccio integrato offre diversi vantaggi:

  • Velocità: con il test runner integrato nel runtime, l’esecuzione dei test avviene direttamente senza l’onere di caricare framework di test esterni. Il risultato è un’esecuzione più rapida dei test, particolarmente vantaggiosa in codebase di grandi dimensioni o in ambienti di integrazione continua.
  • Compatibilità: il test runner integrato funziona perfettamente con le altre funzioni di Bun. Sfrutta i tempi di avvio rapidi di Bun e l’utilizzo efficiente della memoria, assicurando che i test vengano eseguiti in un ambiente che imita quello di produzione.
  • Semplicità: con il test runner integrato, non è necessario preoccuparsi di configurare e mantenere la compatibilità tra il runtime e il framework di test. Si possono scrivere i test in modo simile al codice dell’applicazione, utilizzando le stesse caratteristiche linguistiche e le stesse API.

Il test runner di Bun è pienamente compatibile con diversi framework di testing. L’esecuzione dei test è semplice come l’esecuzione del comando bun test

Inoltre, poiché Bun supporta nativamente TypeScript ͏e JSX, non c’è bisogno di configurazioni o ͏plugin aggiuntivi. Potrete concentrarvi sulla scrittura di test di qualità piuttosto che sulla configurazione dell’ambiente di test.͏

Gestore di pacchetti

Il gestore di pacchetti di Bun, compatibile con Node.js, è molto più veloce di npm, yarn e pnpm. Accelera la velocità, riduce l’uso del disco e minimizza l’ingombro della memoria.

Benchmark di Bun, pnpm, npm e Yarn a cura del team di Bun
Benchmark di Bun, pnpm, npm e Yarn a cura del team di Bun.

Utilizzando i symli͏nks, Bun collega i pacchetti di ogni progetto a una posizione centralizzata, eliminando la necessità di scaricare nuovamente i moduli per i progetti successivi.͏ Sebbene l’uso dei symlinks non sia del tutto nuovo nei gestori di pacchetti, l’implementazione di Bun è superiore alle altre.

Come iniziare con Bun

Per iniziare a usare Bun sul computer, è necessario installarlo. Esistono vari metodi per installare Bun, tra cui un comando cURL, npm o Homebrew. Tuttavia, è fondamentale notare che Bun è utilizzato in modo ottimale su sistemi macOS o Linux.

Per installare Bun tramite il comando cURL, eseguite quanto segue nel terminale:

curl -fsSL https://bun.sh/install | bash

Dopo che l’installazione è andata a buon fine, verificatela eseguendo bun --version nel terminale. Ciò conferma che Bun è pronto per essere utilizzato.

Ora siete pronti per esplorare le funzionalità di Bun. Potete usare Bun per eseguire i vostri progetti Node.js con il comando bun run. Inoltre, per eseguire un file TypeScript chiamato index.ts, usate bun run index.ts – Bun traspone i vostri file TypeScript, eliminando la necessità di pacchetti aggiuntivi.

L’utilità di Bun va oltre queste nozioni di base. Si integra perfettamente con framework JavaScript come React e Next.js. Per approfondire e scoprire le funzionalità di Bun, consultate la documentazione ufficiale.

Come eseguire i progetti Node.js con Bun

La migrazione o l’esecuzione dei progetti Node.js con Bun è semplice e richiede solo alcuni comandi della CLI di Bun. I passaggi qui sotto vi guideranno nell’esecuzione dei vostri progetti Node.js con Bun:

  1. Innanzitutto, installate Bun. Una volta installato Bun, andate nella directory contenente i file del progetto Node.js (compreso il file package.json ). Nella directory di lavoro del progetto, eseguite questo comando:
    bun install

    Questo è il comando che permette a Bun di leggere il file package.json nella directory del progetto Node.js, di esaminare il file ͏lock .json (se presente) e di installare le dipendenze elencate utilizzando il suo gestore di pacchetti integrato.

    Visual Studio Code mostra l'installazione delle dipendenze
    Installare le dipendenze con Bun.

  2. Una volta installate le dipendenze, potete eseguire il progetto con Bun. Usate il comando bun run, seguito dal file di ingresso del progetto:
    bun run 

    Ad esempio, se il punto di partenza del progetto è un file chiamato index.js, digitate bun run index.͏js .

    Bun esegue il codice JavaScript o TypeScript contenuto nel file specificato. Se il progetto ha uno script di avvio definito nel suo file package.json, potete anche usare bun start per eseguire il progetto.

    Esecuzione del progetto Bun in Visual Studio Code
    Esecuzione del progetto Bun in Visual Studio Code.

La transizione a un nuovo ambiente di runtime può comportare delle difficoltà. Tuttavia, il solido supporto di Bun per i moduli Node.js, il riconoscimento delle variabili globali e l’aderenza all’algoritmo di risoluzione dei moduli Node.js facilitano il processo di migrazione da Node.js a Bun.

Supponiamo che stiate lavorando a un progetto Node.js che attualmente utilizza il pacchetto dotenv per la gestione delle variabili d’ambiente. In questo caso, potete tranquillamente rimuovere il pacchetto dotenv e il suo codice di inizializzazione dal progetto. Bun, infatti, è in grado di leggere automaticamente i file .env, rendendo il pacchetto dotenv superfluo.

Ricordate che Bun è ancora in fase di sviluppo, quindi è meglio procedere con cautela durante il processo di migrazione.

Integrare Bun con l’Hosting di Applicazioni di Kinsta

L’hosting di un’applicazione Bun su Kinsta è semplice grazie all’Hosting di Applicazioni e all’utilizzo di Nixpacks per costruire il vostro progetto.

Nixpacks, simile a Buildpacks, è un progetto open-source progettato per creare immagini container per le applicazioni in base al loro repository. Sfruttando il binario Nix, questo strumento costruisce le applicazioni, installa le dipendenze e configura gli ambienti al momento della distribuzione.

La sua architettura basata su Rust garantisce tempi di build più rapidi. In particolare, Nixpacks eccelle rispetto a Buildpacks perché incorpora un sistema di caching integrato che accelera notevolmente le build successive a quella iniziale.

L’adozione di Nixpacks da parte di Kinsta sottolinea il suo impegno verso una tecnologia all’avanguardia, offrendo soluzioni più efficienti e flessibili per la gestione delle immagini dei container e la semplificazione del processo di sviluppo.

Per distribuire il vostro progetto Bun sull’Hosting di Applicazioni di Kinsta, innanzitutto inviate il vostro codice al provider Git che preferite (Bitbucket, GitHub o GitLab). Quando il vostro repository è pronto, seguite questi passaggi per effettuare il deploy con Kinsta:

  1. Accedete o create un account per visualizzare la vostra dashboard MyKinsta.
  2. Autorizzate Kinsta con il vostro provider Git.
  3. Cliccate su Applicazioni nella barra laterale di sinistra e poi su Aggiungi applicazione.
  4. Selezionate il repository e il branch da cui desiderate effettuare il deploy.
  5. Assegnate un nome unico all’applicazione e scegliete la posizione del data center.
  6. Configurate poi l’ambiente di build. Selezionate la configurazione della build machine standard con l’opzione Nixpacks consigliata.
  7. Usate tutte le configurazioni predefinite e poi cliccate su Crea applicazione.

L’installazione richiede in genere pochi minuti e, una volta completata, riceverete un link all’applicazione e una dashboard contenente le informazioni sull’installazione.

Kinsta fornisce un’infrastruttura robusta e affidabile per le vostre applicazioni. La distribuzione di un’applicazione Bun direttamente sulla piattaforma di Kinsta è semplice grazie alla sua interfaccia user-friendly: non è necessaria alcuna integrazione specifica. Basta caricare il codice, configurare le impostazioni e la vostra app è pronta per essere lanciata.

Riepilogo

Come runtime JavaScript, Bun ha acquisito importanza per diversi motivi. Progettato con un’attenzione particolare alle prestazioni e alla semplicità, mira a snellire il processo di sviluppo e a migliorare l’efficienza complessiva. La sua architettura modulare permette di scegliere solo i componenti di cui avete bisogno per progetti specifici, riducendo le spese inutili.

A differenza di Node.js, Bun ha un’impronta più leggera e tempi di avvio più rapidi. Questa caratteristica è fondamentale per le applicazioni che richiedono tempi di risposta rapidi e un uso efficiente delle risorse. La semplicità e l’approccio modulare di Bun contribuiscono a un’esperienza di sviluppo più semplice e personalizzabile.

L’hosting delle applicazioni Bun con il servizio di Hosting di Applicazioni di Kinsta offre una soluzione efficace e senza soluzione di continuità. La solida infrastruttura di Kinsta garantisce prestazioni elevate, grazie a funzionalità come lo scaling automatico e la distribuzione di contenuti a caricamento rapido.

Scegliendo Kinsta, l’hosting delle vostre applicazioni Bun diventa un’esperienza affidabile ed efficiente, che vi dà la libertà di concentrarvi sulla costruzione e sull’ottimizzazione dei vostri progetti.

Qual è la vostra opinione su Bun? Pensate di passare tutte le vostre applicazioni Node.js all’utilizzo di Bun? Fateci sapere cosa ne pensate nella sezione dei commenti.

Joel Olawanle Kinsta

Joel is a Frontend developer working at Kinsta as a Technical Editor. He is a passionate teacher with love for open source and has written over 200 technical articles majorly around JavaScript and it's frameworks.