JavaScript is een van de populairste en meest gebruikte programmeertalen ter wereld. Het voedt webapplicaties, mobiele apps, desktopsoftware en zelfs ingebedde apparaten. Ondanks het wijdverbreide gebruik is het niet zonder uitdagingen. Zoals alle technologieën worstelt JavaScript met problemen op het gebied van prestaties, compatibiliteit, beveiliging en complexiteit.

Om deze problemen aan te pakken zijn er in de loop der jaren verschillende JavaScript runtimes ontwikkeld. Node.js en Deno springen eruit, elk met oplossingen om de beperkingen van JavaScript aan te pakken. Maar hoewel ze veel problemen hebben opgelost, hebben ze ook nieuwe problemen geïntroduceerd, zoals de behoefte aan onnodige pakketten en langzamere runtimeprestaties.

Nu is er dus Bun, een JavaScript runtime die al een tijdje bestaat, maar het team heeft pas onlangs een stabiele versie uitgebracht in september 2023. Bun is gemaakt om een direct, efficiënter alternatief voor Node.js te zijn.

Dit artikel onderzoekt Bun, zijn onderscheidende kenmerken en hoe je het kunt integreren in je JavaScript projecten.

Wat is Bun?

Bun.sh homepage.
Bun.sh homepage.

Bun is een JavaScript runtime die voornamelijk is geschreven in de programmeertaal Zig. Het heeft als doel om de beperkingen van Node.js aan te pakken en tegelijkertijd een meer gestroomlijnde en efficiënte ontwikkelervaring te bieden.

Bun is echter niet zomaar een JavaScript runtime zoals er in de loop der jaren veel zijn verschenen: Het is een alles-in-één toolkit die is ontworpen om een revolutie teweeg te brengen in de manier waarop developers met JavaScript en TypeScript werken. Bun breidt JavaScriptCore uit, de engine die Apple’s Safari aanstuurt, en zorgt voor snelle opstarttijden met een beter geheugengebruik.

In tegenstelling tot Node.js is Bun niet afhankelijk van npm of externe dependencies voor de werking. In plaats daarvan heeft het een ingebouwde standaardbibliotheek die functionaliteiten biedt voor diverse protocollen en modules, waaronder omgevingsvariabelen, HTTP, WebSocket, bestandssysteem en meer.

Het biedt ook kant-en-klare ondersteuning voor TypeScript. En omdat Bun intern elk JavaScript of TypeScript bronbestand transpileert, kun je TypeScript bestanden direct compileren en uitvoeren, zonder extra con͏configuratie of transpilatie.

Bun wordt geleverd met een krachtige command-line interface (CLI) waarmee je run, format, lint, test͏, en bundle je code kunt compileren met de volgende eenvoudige commando’s:

  • bun run – voert een JavaScript of TypeScript ͏bestand uit met Bun.
  • bun test – voert unit tests uit met Bun’s ingebouwde testin͏g framework.
  • bun fmt – formatteert code met Bun’s ingebouwde code formatter.
  • bun lint – lint code met Bun’s ingebouwde code linter.
  • bun bundle – bundelt code met Bun’s ingebouwde codebundelaar.

Een andere opvallende eigenschap van Bun is de hot reloading functie, die wijzigingen in de code direct vernieuwt met behoud van de status van de applicatie. Dit is een aanzienlijke verbetering ten opzichte van Node.js, waar soortgelijke functionaliteit externe pakketten zoals nodemon of de experimentele vlag --watch vereist. Bun daarentegen stroomlijnt dit proces met behulp van de --hot flag.

Naast de technische voordelen heeft Bun een groeiende gemeenschap van gebruikers die actief bijdragen aan de ontwikkeling en verbetering ervan. Deze levendige gemeenschap zorgt ervoor dat Bun bijgewerkt en responsief blijft, en biedt voldoende bronnen om te leren en problemen op te lossen.

Belangrijkste features van Bun

Naast hot reloading, native ondersteuning voor TypeScript en snellere opstarttijden, heeft Bun een aantal kernfuncties die bijdragen aan zijn populariteit en prestaties als JavaScript runtime: zijn bundler, testrunner en package manager. Laten we deze functies in detail bespreken.

Bundler

Een bundler consolideert JavaScript code en zijn dependencies in een enkel bestand͏, waardoor de laadefficiëntie voor browsers of binnen Node.js applicaties wordt geoptimaliseerd. Node.js heeft geen eigen bundler͏, waardoor developers moeten vertrouwen op externe bundlers zoals Rollup, Webpack en ͏Parcel bij het verwerken van JavaScript code.

Bun biedt daarentegen een ingebouwde bundler die minimale configuratie vereist en verschillende moduleformats ondersteunt. Het heeft ook ingebouwde optimalisaties die sneller bundelen ondersteunen. Vergelijkenderwijs presteert de bundler van Bun beter dan andere bundlers, 1,75x sneller dan ͏esbuild, 150x sneller dan Parcel, 180x sneller dan Rollup + Terser, en ͏220x sneller dan Webpack.

Je kunt je project bundlen via het commando bun bundle ͏<source> --out-dir <directory>. Het genereert het uitvoerbestand in de door jou opgegeven uitvoermap:

Code en terminal waar het bouwcommando is uitgevoerd
Een project bundlen met Bun.

Testrunner

Testen͏ is een inte͏graal onderdeel van softwareontwikkeling, het verzekert de functionaliteit van de code en identificeert potentiële problemen voor de productie. Bun heeft ook een testrunner in de toolkit.

Tra͏ditioneel hebben Node.js developers gebruik gemaakt van externe testframeworks zoals Jest, dat krachtig en flexibel is maar extra dependencies en configuratieoverhead toevoegt aan het project.

De testrunner van Bun gebruikt Jest-compatibele syntaxis, maar draait 100x sneller.

Aan de andere kant integreert Bun zijn eigen testrunner die werkt met de syntaxis van Jest, waarbij de nadruk ligt op snelheid en compatibiliteit. Deze geïntegreerde aanpak biedt verschillende voordelen:

  • Snelheid – Met de testrunner ingebouwd in de runtime, worden tests direct uitgevoerd zonder de overhead van het laden van externe testframeworks. Het resultaat is een snellere testuitvoering, wat vooral gunstig is in grote codebases of continue integratie omgevingen.
  • Compatibiliteit – De ingebouwde testrunner werkt naadloos samen met de andere functies van Bun. Het maakt gebruik van de snelle opstarttijden en het efficiënte geheugengebruik van Bun, zodat je tests worden uitgevoerd in een omgeving die je productieomgeving nabootst.
  • Eenvoud – Met de ingebouwde testrunner hoef je je geen zorgen te maken over het configureren en onderhouden van compatibiliteit tussen je runtime en je testframework. Je kunt tests schrijven op dezelfde manier als applicatiecode, met dezelfde taalfuncties en API’s.

De testrunner in Bun is volledig compatibel͏ met verschillende testframeworks. Het uitvoeren van tests is net zo eenvoudig als het uitvoeren van het commando bun test

Bovendien ondersteunt Bun van nature TypeScript ͏en JSX, waardoor je geen extra configuraties of ͏plugins nodig hebt. Je kunt je richten op het schrijven van kwaliteitstesten in plaats van op het inrichten van de testomgeving.͏

Package manager

Bun’s Node.js compatibele package manager is aanzienlijk sneller dan npm, yarn en pnpm. Het versnelt de snelheid, vermindert het schijfgebruik en minimaliseert de geheugenfootprint.

Benchmark van Bun, pnpm, npm en Yarn door het Bun team.
Benchmark van Bun, pnpm, npm en Yarn door het Bun team.

Door gebruik te maken van symli͏nks koppelt Bun pakketten͏ voor elk project naar een gecentraliseerde locatie, waardoor het niet meer nodig is om modules voor volgende projecten opnieuw te downloaden.͏ Hoewel het gebruik van symlinks niet helemaal nieuw is in package managers, overtreft Bun de concurrentie.

Aan de slag met Bun

Om Bun op je computer te gebruiken, moet je het natuurlijk eerst installeren. Er zijn verschillende methoden om Bun te installeren, waaronder met een cURL commando, npm of Homebrew. Het is echter cruciaal om te weten dat Bun optimaal wordt gebruikt op macOS- of Linux-systemen.

Om Bun te installeren via het cURL commando, voer je het volgende uit in je terminal:

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

Na een succesvolle installatie controleer je dit door bun --version uit te voeren in je terminal. Dit bevestigt dat Bun klaar is voor gebruik.

Nu ben je klaar om de mogelijkheden van Bun te verkennen. Je kunt Bun gebruiken om je Node.js projecten uit te voeren met het commando bun run. Om een TypeScript-bestand met de naam index.ts uit te voeren, gebruik je bovendien bun run index.ts – Bun transpileert je TypeScript bestanden, waardoor je geen extra pakketten nodig hebt.

Het nut van Bun gaat verder dan deze basics. Het integreert naadloos met JavaScript frameworks zoals React en Next.js. Om dieper te duiken en meer te ontdekken over de functionaliteiten van Bun, kun je de officiële documentatie bekijken.

Node.js projecten draaien met Bun

Het migreren of uitvoeren van je Node.js projecten met Bun is eenvoudig en vereist slechts een paar Bun CLI commando’s. Volg deze stappen om je Node.js projecten met Bun uit te voeren:

  1. Installeer eerst Bun. Zodra Bun is geïnstalleerd, navigeer je naar de map met je Node.js projectbestanden (inclusief het package.json bestand). Voer in de werkdirectory van je project dit commando uit:
    bun install

    Het bovenstaande commando laat Bun het package.json bestand in je Node.js projectdirectory͏y lezen, het ͏lock .json bestand (indien aanwezig) bekijken en de vermelde dependencies installeren met behulp van zijn ingebouwde package manager.

    Visual Studio Code toont de installatie van dependencies
    Dependencies installeren met Bun.

  2. Als de dependencies geïnstalleerd zijn, kun je je project uitvoeren met Bun. Gebruik het commando bun run, gevolgd door het invoerpuntbestand van je project:
    bun run 

    Bijvoorbeeld, als het beginpunt van je project ͏een bestand is met de naam  index.js, typ dan bun run index.͏js .

    Bun voert de JavaScript of TypeScript co͏de in het opgegeven bestand uit. Als je project een startscript heeft gedefinieerd in het package.json bestand, kun je ook bun start gebruiken om je project uit te voeren.

    Het Bun project uitvoeren in Visual Studio Code.
    Het Bun project uitvoeren in Visual Studio Code.

De overgang naar een nieuwe runtime-omgeving kan uitdagingen met zich meebrengen. Echter, Bun’s robuuste ondersteuning voor Node.js modules, herkenning van globale variabelen en het volgen van het Node.js module resolutie algoritme vergemakkelijken het migratieproces van Node.js naar Bun.

Stel dat je werkt aan een Node.js project dat momenteel het dotenv pakket gebruikt voor het beheren van omgevingsvariabelen. In dit scenario kun je het dotenv pakket samen met zijn initialisatiecode veilig uit je project verwijderen. Dit komt omdat Bun een ingebouwde mogelijkheid heeft om automatisch je .env bestanden te lezen, waardoor het dotenv pakket overbodig wordt.

Onthoud dat Bun nog in ontwikkeling is, dus je kunt het beste voorzichtig te werk gaan tijdens het migratieproces.

Bun integreren met Kinsta’s Applicatie Hosting

Het hosten van een Bun app op Kinsta is naadloos met Kinsta’s Applicatie Hosti͏ng͏ met Nixpacks die gebruikt worden om je project te bouwen.

Nixpacks, vergelijkbaar met Buildpacks, is een open-source project dat is ontworpen om container images voor applicaties te maken op basis van hun repository. Gebruikmakend van de Nix binary, bouwt deze tool applicaties, installeert dependencies en configureert omgevingen bij het deployen.

De op Rust gebaseerde architectuur zorgt voor snellere bouwtijden. Nixpacks blinkt met name uit boven Buildpacks door een ingebouwd caching systeem, waardoor volgende builds na de eerste aanzienlijk worden versneld.

Kinsta’s keuze voor Nixpacks onderstreept haar toewijding aan toonaangevende technologie en biedt efficiëntere en flexibelere oplossingen voor het beheren van container images en het stroomlijnen van het ontwikkelproces.

Om je Bun project te deployen naar Kinsta’s Applicatie Hosting, push je eerst je code naar een Git provider van je voorkeur (Bitbucket, GitHub of GitLab). Zodra je repository klaar is, volg je deze stappen om te deployen met Kinsta:

  1. Log in of maak een account aan om je MyKinsta dashboard te bekijken.
  2. Autoriseer Kinsta met je Git provider.
  3. Klik op Applicaties op de linker zijbalk, klik dan op Applicatie toevoegen.
  4. Selecteer de repository en de branch waarvan je wilt deployen.
  5. Geef je applicatie een unieke naam en kies een datacenterlocatie.
  6. Configureer vervolgens je bouwomgeving. Selecteer de Standard build machine config met de aanbevolen Nixpacks optie.
  7. Gebruik alle standaardconfiguraties en klik dan op Applicatie maken.

Het deployen neemt meestal een paar minuten in beslag en na succes ontvang je een link naar je applicatie en een dashboard met informatie over de deployment.

Kinsta biedt een robuuste en betrouwbare infrastructuur voor je applicaties. Het direct deployen van je Bun app op Kinsta’s platform is probleemloos dankzij de gebruiksvriendelijke interface – er is geen specifieke integratie nodig. Upload je code, configureer je instellingen en je app is klaar om live te gaan.

Samenvatting

Als JavaScript runtime heeft Bun om verschillende redenen aan populariteit ingewonnen. Het is ontworpen met een focus op prestaties en eenvoud en heeft als doel het ontwikkelingsproces te stroomlijnen en de algehele efficiëntie te verbeteren. Dankzij de modulaire architectuur kun je alleen de componenten kiezen die je nodig hebt voor specifieke projecten, waardoor onnodige overhead wordt verminderd.

In tegenstelling tot Node.js heeft Bun een lichtere footprint en snellere opstarttijden. Deze eigenschap is cruciaal voor applicaties die snelle reactietijden en efficiënt gebruik van resources vereisen. De eenvoud en modulaire aanpak van Bun dragen bij aan een meer eenvoudige en aanpasbare ontwikkelervaring.

Het hosten van je Bun applicaties met Kinsta’s Applicatie Hosting dienst biedt een naadloze en krachtige oplossing. De robuuste infrastructuur van Kinsta garandeert hoge performance, met features zoals automatisch schalen en snel ladende contentlevering.

Kiezen voor Kinsta betekent dat het hosten van je Bun applicaties een betrouwbare en efficiënte ervaring wordt, waardoor je de vrijheid krijgt om je te richten op het bouwen en optimaliseren van je projecten.

Wat is jouw mening over Bun? Denk je dat je al je Node.js applicaties moet overschakelen op Bun? Deel je gedachten met ons in de comments hieronder.

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.