Korvaako Bun tulevaisuudessa Node.js:n?
Mikä Bun on?
Siitä lähtien, kun Bun versio 1.0 julkaistiin viime syyskuussa 2023, se on kasvavissa määrissä herättänyt kiinnostusta kehittäjäyhteisössä. Bun on uusi JavaScript-ajoympäristö (runtime), ja sillä voi muun muassa korvata Node.js ajoympäristön. Bun on kehitetty moderneja JavaScript ekosysteemejä varten, ja se mainitsee kolmena tavoitteenaan nopeuden, optimoidut elegantit ohjelmointirajapinnat (APIs) ja yhtenäisen kehittäjäkokemuksen.
Nopeus on tähän asti ollut Bunin suurin myyntivaltti, ja se lupaa huomattavia parannuksia pakettien asennuksen ja testien ajon nopeudessa, sekä palvelinpuolen HTTP-pyyntöjen määrässä sekunnissa verrattuna muihin teknologioihin. Bun myös tarjoaa joukon optimoituja ohjelmointirajapintoja tyypillisten tehtävien suorittamiseen, kuten HTTP-palvelimen käynnistämiseen ja tiedostojen kirjoittamiseen. Bun pyrkii tarjoamaan työkaluja suorituskyvyn parantamiseen, monimutkaisuuden vähentämiseen ja kehittäjien tuottavuuden moninkertaistamiseen. Bunin voi asentaa globaalisti curl:n, NPM:n (Node.js Package Manager), Homebrewin, Dockerin tai Proton kautta. Kannattaa huomioida, että Bun ei vielä tue Windows ympäristöä, mutta toimii WSL:n (Windows Subsystem for Linux) kautta.
Jos Bunista lähtee lukemaan enemmän, joko heidän dokumentaatiostaan tai muista Bunista kertovista materiaaleista, tulee varmasti esille termi ”drop-in replacement for Node.js”. Tämä tarkoittaa, että Bun on suunniteltu toimimaan ja käyttäytymään samalla tavalla kuin Node.js, ja voit vaihtaa projektissa olemassa olevan Node.js-asennuksen Buniin ilman suuria muutoksia koodissa tai konfiguraatiossa, ja sovelluksesi pitäisi toimia. On kuitenkin tärkeää huomata, että "drop-in replacement" -käsite voi olla hieman liioiteltu, ja käytännössä saatat joutua tekemään joitakin muutoksia. Ongelmia voi esiintyä erityisesti, jos sovelluksesi hyödyntää tiettyyn Node.js-versioon liittyviä ominaisuuksia, ja jotkut moduulit eivät vielä toimi Bunin kanssa tai niissä voi olla bugeja Bun-ympäristössä. Ennen vaihtamista kannattaa tarkistaa dokumentaatio oleellisimpien riippuvuuksien osalta.
Miten Bun ja Node.js eroavat?
Bun keskittyy nopeisiin käynnistysaikoihin, optimoituun suorituskykyyn ja kevyeen suunnitteluun, ja sisältää paljon integroituja työkaluja kuten kääntäjän (transpiler) ja niputtajan (bundler). Bunin sisäinen kääntäjä muuntaa TypeScriptin, JSX:n ja TSX:n Vanilla-JavaScriptiksi ennen suorittamista, minkä ansiosta näiden tulisi olla nopeampia Bunilla kuin Nodella. Bun on kirjoitettu Zig-ohjelmointikielellä, ja se pyörii JavaScriptCorella, mikä nopeuttaa käynnistystä ja vähentää muistinkäyttöä.
Node on kirjoitettu C++:lla ja perustuu V8-moottoriin, mikä priorisoi nopeaa suoritusta ja suoritusajan optimointia. Nodella on laajempi ekosysteemi ja yhteisötuki, minkä ansiosta Node-ympäristöstä löytyy paljon laadukkaita tutoriaaleja ja muita esimerkkejä. Node on yhteensopiva useiden ohjelmointikielten kanssa ja se tarjoaa runsaamman valikoiman kolmannen osapuolen työkaluja ja kirjastoja. Isommissa projekteissa on myös olennaista, että useimmille Node on tuttu, kun taas Bun saattaa vaatia opettelua ja tiiminjäsenten löytäminen voi olla vaikeampaa.
Alla olevassa taulukossa on vertailtuna muutamia komentoja Bunin ja npm välillä. Tarkemmin näihin voi tutustua Bunin dokumentaation kautta.
|
Bun |
Node / npm |
Projektin alustus |
bun init |
npm init |
Projektin ajaminen |
bun run index.ts |
node index.js |
Paketin asennus |
bun add <package name> |
npm install <package name> |
Paketin poistaminen |
bun remove <package name> |
npm uninstall <package name> |
Paketin suoritus |
bunx <package name> |
npx <package name> |
Paketin päivitys |
bun update <package name> |
npm update <package name> |
Testien ajo |
bun test |
npm test |
Bunin tekniset vahvuudet
Bun pyrkii olemaan nopein ja modernein JavaScript ajoympäristö, pakettienhallintatyökalu sekä niputus- ja testaustyökalu. Bun on tehty nopeaksi pikkutarkalla optimoinnilla, ja Bunilla on valmiina monia sisäänrakennettuja hyödyllisiä ominaisuuksia, eikä erillisiä kirjastoja tarvitse asennella tavallisimpia käyttötarkoituksia varten.
Esimerkiksi HTTP-palvelimen käynnistys onnistuu Bun.serve komennolla, ja se tukee myös WebSocketteja. Bun.write on monitoimityökalu levylle kirjoittamiseen, ja Bun.file tiedostojen lukemiseen. Bun.password kokoelmaa voi käyttää salasanojen hajauttamiseen (hashing) ja varmentamiseen (verify), korvaten tarpeen käyttää esimerkiksi Bcryptjs-kirjastoa. Bunissa on myös natiivisti tehokas SQLite3-ohjain, jota voi käyttää sisäänrakennetulla bun:sqlite moduulilla. Bun sisältää valmiina monia muitakin ominaisuuksia, joihin voi tarkemmin perehtyä Bunin dokumentaatiosta.
Bun ja Node suorituskykyvertailu
Bunin suosio ei ole jäänyt huomaamatta Knowit-yhteisössä, mikä synnytti päätöksen aloittaa teknologiaan tutkiminen Innovation Zonessa. Innovation Zone on Knowitin yhteistyökeskus (collaboration hub), jossa tutkitaan uusia teknologioita ja menetelmiä. Oma taustani JavaScript- ja Node-teknologioista antoi minulle hyvän lähtökohdan vertailla Bun-in ja Node-ympäristöjen ominaisuuksia. Tein Innovation Zone projektina kaksi samanlaista palvelinta, joista toinen oli luotu Nodella ja toinen Bunilla.
Kuormitustesteissä sain Bun palvelimella hieman parempia tuloksia. Bun palvelimen vastausajan mediaani arvo oli jopa yli tuplasti nopeampi. Bun palvelin pystyi myös käsittelemään useampia pyyntöjä sekunnissa, vaikka kuormitustestin parametrit olivat samat ja palvelimet lähes identtiset. Nämä tulokset eivät kuitenkaan ihan yltäneet Bunin dokumentaatiossa oleviin vertailuarvoihin (benchmarks). Bunin sivuilla on esillä Hello World- tyyppinen palvelin vertailu, jossa Bun onnistui tekemään melkein neljä kertaa enemmän HTTP pyyntöä sekunnissa kuin Node, ja tuplasti enemmän kuin Deno.
Palvelimien vastausaika |
Bun |
Node |
Mediaani |
98 millisekuntia |
210 millisekuntia |
100. persentiili |
580 millisekuntia |
1400 millisekuntia |
Kuormitustestauksen tulosten perusteella Bunilla oli suurempi keskimääräinen datan koko per pyyntö. Tämä saattaa viitata vähemmän tehokkaaseen tiedonpakkaamiseen.
Bun mainostaa itseään ”drop-in” mallisena Noden korvaajana, mutta monilla ohjelmistokehittäjillä projektin nopeus ja tehokkuus ovat laskeneet korvattuaan Noden Bunilla. Kokonaan alusta alkaen Bunilla tehdyt projektit vaikuttaisivat suoriutuvan nopeammin ainakin tietyissä skenaarioissa, ja monet ovat saaneet huimia parannuksia projektien tehokkuuteen Bunin avulla. Ei kuitenkaan kannata täysin sivuuttaa useiden käyttäjien saamia tuloksia, joissa Node on kuitenkin ollut Bunia nopeampi heidän projekteissaan. Varsikin testaus ja pakettienhallinta nopeuksissa käyttäjät ovat tuoneet esille tapauksia, joissa Bun on suoriutunut kaikkein huonoiten verrattuna muihin teknologioihin.
Elysia
Elysia on TypeScript- kehys (framework) Bunille, jonka keskeisinä filosofioina ovat tehokkuus, yksinkertaisuus ja joustavuus. Tekemässäni projektissa pystyin Elysialla korvaamaan Expressin, jsonwebtoken ja cors -kirjastot. Elysiassa on myös muun muassa valmiina Cookie evästeiden käyttöön, sekä WebSocket-ominaisuus.
Elysian dokumentaatiossa Bun Elysia lupaa suorittavansa 18 kertaa enemmän pyyntöjä sekunnissa (RPS) kuin Node Expressia, ja kolme kertaa enemmän kuin Deno Fast. Käytin Bun projektissani Elysiaa, koska sitä suositeltiin monissa Bun esimerkeissä, ja minulla oli hieman ongelmia jsonwebtokenin kanssa. Omassa testauksessani Bun Elysian RPS oli 36.7 ja Node Express 30.8, eli se oli vain hieman nopeampi.
On hyvä ottaa huomioon, että tuloksiin saattoi vaikuttaa se, että Bunin ja Elysian osaamiseni ei ole vielä samalla tasolla kuin Noden ja Expressin, ja sen vuoksi Bun palvelin ei luultavasti ollut ihan täysin optimoitu. Vaikka monet tutoriaalit ja ohjeet suosittelevat Elysiaa, on hyvä huomioida, että se on vielä hyvin uusi kehys, mikä tekee siitä potentiaalisen riskin pidemmille projekteille, mikäli sen kehitys loppuu tai etenee hitaasti. Kaiken kaikkiaan se vaikutti kätevältä ja toimivalta Bunin kanssa, ja toivon mukaan sen kehitys jatkuu.
Bunin haasteet
Bun teknologiaan perehtyessä törmää nopeasti artikkeleihin ja videoihin, joissa on hyvin vastakkaisia mielipiteitä. Toiset ylistävät Bunia ihaillen sen tehokkuutta, ja ovat varmoja, että tämä teknologia mullistaa JavaScript maailman. Toiset puolestaan ovat skeptisiä, ja tuovat esille ongelmakohtia. Erityisesti moduulit, joita Bun ei vielä tue tai julkaisun jälkeen esille tulleet bugit saavat monet valitsemaan mieluummin Node.js tai Denon. Monet myös vertaavat Bunia Yarniin, koska Bunilla ei ole Windows tukea ja Yarn oli myös julkaisussaan paljon nopeampi kuin NPM. Kuitenkin viidessä vuodessa NPM onnistui kirimään Yarnin tasolle ja pitämään johtoasemansa JavaScript paketinhallinnassa. Bun on vielä niin uusi teknologia, että siihen kannattaa suhtautua varoen. On hyvä myös ottaa huomioon, että Bun on vielä aika pieni alle kymmenen hengen yritys, ja heidän voi olla hidasta korjata julkaisun jälkeen ilmenneitä ongelmia sekä samalla kehittää Windows -tukea.
Johtopäätökseni Bunista
Bun teknologiaan tutustumisen ja testailujen perusteella en toistaiseksi suosittelisi Bunia asiakasprojekteihin tai muihin isoihin ja tärkeisiin projekteihin vielä tässä vaiheessa. Voi olla parempi odottaa, että sillä on kunnollinen tuki Windowsille, jotta projekti on mahdollista pitää mahdollisimman monialustaisena. Toistaiseksi myös väittäisin, että Node on vielä tällä hetkellä stabiilimpi ja luotettavampi valinta, ja varsinkin Node ympäristön drop-in korvaaminen Bunilla saattaa aiheuttaa ongelmia.
Bun voi kuitenkin olla hyvä vaihtoehto projektille, jossa juuri nyt tarvitaan kaikkien nopein JavaScript ajoympäristö ja/tai testausympäristö, ja suosittelen ainakin kokeilemaan Bunia oppimismielessä omien tai pienempien projektien parissa. Jos on mahdollista, niin kannattaa testata drop-in ominaisuutta jollekin olemassa olevalle Node projektille. Haluaisin myös mainita, että Bunin koodi on avoimena GitHubissa, ja Bunin kehittäjä Jarred Sumner on pyytänyt käyttäjiä luomaan uuden issuen kaikista havaituista ongelmista. Tällä hetkellä avoimia issueita on yli 1900, joten jos sinulla on intoa ja osaamista Zig ohjelmointikielestä, kannattaa tutustua näihin ja mahdollisesti auttaa niiden ratkaisemisessa. Yhteisön tuella Bunin on mahdollista kehittyä entistä paremmaksi, ja jään ainakin itse seuraamaan sen kehitystä toiveikkaana.
Lue lisää: