Bun JavaScript runtime: greičio revoliucija

Kas iš tiesų yra Bun ir kodėl visi apie jį kalba?

Jei sekate JavaScript ekosistemos naujienas, tikriausiai pastebėjote, kad pastaruoju metu vis dažniau pasigirsta žodis „Bun”. Ne, tai ne kepinys pusryčiams, o naujas JavaScript runtime, kuris grasina sugriauti įprastą Node.js dominavimą. Kai 2022 metų pabaigoje Jarred Sumner pristatė Bun 1.0 versiją, daugelis kūrėjų nusišypsojo skeptiškai – dar vienas „Node.js žudikas”, matyt. Tačiau po kelių mėnesių naudojimo tampa aišku, kad čia ne tik tuščios kalbos.

Bun yra visapusiškas JavaScript ir TypeScript runtime, parašytas Zig programavimo kalba ir naudojantis JavaScriptCore variklį (tą patį, kurį naudoja Safari naršyklė). Skirtingai nuo Node.js, kuris remiasi V8 varikliu, Bun pasirinkimas – JavaScriptCore – leidžia pasiekti itin greitą paleidimo laiką. Bet greitis čia tik viena medalio pusė.

Kas iš tiesų daro Bun įdomų, tai jo visapusiškumas. Tai ne tik runtime – tai pilnas įrankių rinkinys, apimantis paketų tvarkyklę, bundlerį, test runner’į ir transpilerį. Vienu smūgiu Bun bando pakeisti npm/yarn, webpack/vite, jest/vitest ir dar kelias kitas įrankines. Ambicinga? Be abejo. Ar veikia? Pažiūrėkime giliau.

Greičio palyginimas: skaičiai, kurie verčia susimąstyti

Kalbant apie spartą, Bun komanda nemėgsta kuklių teiginių. Jų oficialūs benchmark’ai rodo, kad Bun gali būti 2-3 kartus greitesnis už Node.js įvairiose užduotyse. Tačiau realybė, kaip visada, šiek tiek sudėtingesnė.

Serverio paleidimo greitis – čia Bun tikrai šviečia. Ten, kur Node.js aplikacija užsikrauna per 300-400ms, Bun gali tai padaryti per 100-150ms. Tai gali atrodyti nereikšminga, bet kai kalbame apie serverless funkcijas ar mikroservisus, kurie nuolat paleidžiami ir sustabdomi, šis skirtumas tampa labai realus. Jūsų AWS Lambda sąskaita tai tikrai pajus.

Paketų įdiegimo greitis – čia Bun tiesiog sutriuškina konkurentus. Ten, kur npm install užtrunka 30 sekundžių, bun install gali atlikti tą patį darbą per 5-8 sekundes. Taip, tikrai. Pirmą kartą išbandžius šią funkciją, net atrodo, kad kažkas neveikia – per greitai įvyko. Bet ne, viskas veikia puikiai.

Tačiau būkime sąžiningi – ne visose srityse Bun yra absoliutus lyderis. CPU intensyviose užduotyse Node.js su V8 varikliu kartais vis dar laimi. V8 turėjo daugiau nei dešimtmetį optimizacijų, ir tai jaučiasi. Bet bendras vaizdas vis tiek labai palankus Bun.

Suderinamumas su Node.js: ar galiu tiesiog pakeisti?

Štai čia prasideda įdomiausia dalis. Bun kūrėjai nuo pat pradžių pabrėžė, kad vienas pagrindinių tikslų – maksimalus suderinamumas su Node.js. Teoriškai turėtumėte galėti paimti savo esamą Node.js projektą ir tiesiog paleisti jį su Bun. Praktikoje? Na, priklauso.

Jei jūsų projektas naudoja standartines bibliotekas ir populiarius npm paketus, tikimybė, kad viskas veiks iš karto, yra gana didelė. Išbandžiau Bun su keliais Express.js projektais, ir jie veikė be jokių pakeitimų. Fastify taip pat veikia puikiai. Net kai kurie sudėtingesni projektai su Prisma ORM paleidžiami be problemų.

Tačiau yra ir probleminių sričių. Natyvūs Node.js moduliai (tie, kurie parašyti C++ ir kompiliuojami per node-gyp) dažnai nesuderinamai. Jei jūsų projektas remiasi tokiais paketais kaip bcrypt ar sharp, gali tekti ieškoti alternatyvų arba laukti, kol Bun komanda išspręs šias problemas. Gerosios naujienos – daugelis populiarių paketų jau turi grynus JavaScript alternatyvus.

Dar viena sritis, kur reikia atsargumo – stream’ai ir buffer’iai. Nors Bun deklaruoja pilną Node.js API suderinamumą, yra subtilių skirtumų, kurie gali pasireikšti netikėtomis klaidomis. Ypač jei jūsų aplikacija intensyviai dirba su failų sistemomis ar tinklo stream’ais.

Integruoti įrankiai: viskas viename pakete

Viena iš labiausiai intriguojančių Bun savybių – tai, kad jis bando būti „all-in-one” sprendimu. Pažvelkime, ką tai reiškia praktiškai.

Paketų tvarkyklė: bun install ne tik greitesnis už npm – jis dar ir protingesnis. Bun automatiškai aptinka ir taiso kai kuriuos įprastus dependency konfliktus. Jis taip pat kuria globalų cache, todėl jei keliuose projektuose naudojate tą patį paketą, jis fiziškai diske saugomas tik vieną kartą. Tai sutaupo ne tik vietos, bet ir laiko.

Transpileris: TypeScript, JSX, TSX – visa tai veikia iš dėžės, be jokios konfigūracijos. Nereikia tsconfig.json, nereikia babel, nereikia nieko. Tiesiog parašote bun run app.tsx ir viskas veikia. Tai gali skambėti kaip smulkmena, bet kai dirbi su nauju projektu ir nori greitai kažką išbandyti, šis paprastumas yra neįkainojamas.

Test runner: bun test suteikia Jest-panašią patirtį, bet daug greitesnę. Testai vykdomi lygiagrečiai pagal nutylėjimą, ir rezultatai pasirodo beveik akimirksniu. Jei kada nors laukėte, kol Jest paleis 500 testų, suprasite, kodėl tai svarbu.

Bundler: Bun gali sujungti jūsų kodą į vieną failą produkcijai. Nors šioje srityse jis dar nėra toks brandus kaip esbuild ar Vite, jis jau dabar pakankamai geras daugeliui projektų. Ir, žinoma, jis greitas – paprastą React aplikaciją sujungia per kelias sekundes.

Realūs naudojimo scenarijai ir patirtis

Teorija teorija, bet kaip Bun jaučiasi realiame darbe? Pabandžiau jį keliuose skirtinguose projektuose per pastaruosius kelis mėnesius.

Serverless funkcijos: Čia Bun tikrai spindi. Sukūriau kelias AWS Lambda funkcijas su Bun, ir rezultatai buvo įspūdingi. Cold start laikas sumažėjo maždaug 40%, o tai reiškia greitesnius atsakymus vartotojams ir mažesnes sąskaitas. Vienintelė problema – reikia custom Lambda layer, nes AWS natively nepalaiko Bun. Bet tai nesudėtinga nustatyti.

REST API serveriai: Sukūriau kelias REST API su Fastify ir Bun kombinacija. Veikia puikiai, ir atsakymo laikai tikrai geresni nei su Node.js. Tačiau pastebėjau, kad kai kurie middleware’ai, kurie remiasi specifinėmis Node.js savybėmis, kartais elgiasi keistai. Nieko kritinio, bet reikia papildomo testavimo.

Build įrankiai ir CLI: Jei kuriate CLI įrankius ar build scriptus, Bun yra fantastiškas. Greitas paleidimas reiškia, kad jūsų įrankiai jaučiasi responsive. Sukūriau keletą vidaus naudojimo CLI įrankių su Bun, ir komandos nariai pastebėjo skirtumą.

Pilnos aplikacijos: Čia reikia būti atsargesniems. Jei jūsų projektas yra didelis, su daug priklausomybių, yra didesnė tikimybė susidurti su suderinamumo problemomis. Rekomenduočiau pradėti nuo naujų projektų arba mikroservisų, o ne bandyti iškart migruoti visą monolitinę aplikaciją.

Ekosistema ir bendruomenė: ar Bun pasiruošęs produkcijai?

Vienas iš svarbiausių klausimų, kurį turėtų užduoti kiekvienas kūrėjas prieš pasirinkdamas naują technologiją – ar ekosistema pakankamai brandi? Su Bun atsakymas yra… sudėtingas.

Iš vienos pusės, Bun komanda yra neįtikėtinai aktyvi. GitHub issues sprendžiamos greitai, naujos versijos išleidžiamos reguliariai, ir dokumentacija nuolat tobulėja. Discord serveris aktyvus, ir dažnai galite gauti pagalbą tiesiai iš core komandos narių. Tai įkvepia pasitikėjimą.

Iš kitos pusės, Bun vis dar yra palyginti jaunas. Nors 1.0 versija buvo išleista, vis dar pasitaiko bugų. Ne kritinių, bet jie yra. Pavyzdžiui, neseniai susidūriau su keista problema, kai Bun neteisingai apdorojo tam tikrus environment variables edge case’us. Problema buvo išspręsta per savaitę, bet vis tiek – tokių dalykų Node.js jau nebeturi.

Dėl paketų suderinamumo situacija gerėja kiekvieną dieną. Daugelis populiarių bibliotekų jau oficialiai palaiko Bun arba bent jau yra testuojamos su juo. Tačiau jei naudojate kažką egzotiško ar labai specifinio, gali tekti papildomai pasidomėti.

Ar rekomenduočiau naudoti Bun produkcijoje? Priklauso nuo jūsų rizikos tolerancijos. Jei tai naujas projektas, jei turite gerą test coverage, ir jei esate pasirengę kartais susidurti su netikėtomis problemomis – eikite į priekį. Jei tai kritinė sistema, nuo kurios priklauso milijonai dolerių pajamų – galbūt dar palaukite keletą mėnesių.

Praktiniai patarimai migravimui ir pradžiai

Jei nusprendėte išbandyti Bun, štai keletas praktinių patarimų, kurie padės išvengti įprastų spąstų.

Pradėkite nuo įdiegimo: Bun įdiegimas paprastas – curl -fsSL https://bun.sh/install | bash Linux/macOS sistemose. Windows naudotojams reikės WSL. Taip, native Windows palaikymas vis dar beta stadijoje, bet WSL veikia puikiai.

Testuokite su esamais projektais: Prieš keisdami bet ką, tiesiog pabandykite paleisti savo projektą su Bun. Dažnai tai taip paprasta kaip bun run index.js vietoj node index.js. Jei veikia – puiku. Jei ne – bent žinosite, su kuo susiduriate.

Pakeiskite package.json scripts: Vietoj "start": "node server.js" naudokite "start": "bun run server.js". Tai leidžia komandos nariams, kurie dar nenaudoja Bun, toliau dirbti su Node.js, o jums – mėgautis spartesniu darbu.

Naudokite bun.lockb: Bun sukuria savo lock failą, kuris yra binarinis ir daug greitesnis už package-lock.json. Įtraukite jį į version control. Jei komandoje yra žmonių, kurie vis dar naudoja npm, jie gali turėti abi versijas – tai netrukdo.

Atkreipkite dėmesį į environment variables: Bun automatiškai įkelia .env failus, be jokių papildomų bibliotekų. Tai patogu, bet gali sukelti netikėtų rezultatų, jei jūsų projektas jau naudoja dotenv ar panašų paketą. Kartais gaunate dubliuotą logiką.

Monitorinkite memory usage: Nors Bun paprastai naudoja mažiau atminties nei Node.js, kai kuriose situacijose gali būti atvirkščiai. Ypač jei jūsų aplikacija intensyviai naudoja stream’us. Turėkite monitoring’ą, bent jau pradžioje.

Ateities perspektyvos ir ko tikėtis toliau

Bun roadmap atrodo ambicinga ir žadanti. Komanda aktyviai dirba prie kelių svarbių dalykų.

Windows native palaikymas yra vienas iš prioritetų. Nors WSL veikia, native palaikymas būtų žymiai patogesnis daugeliui kūrėjų. Beta versija jau veikia, ir stabilios versijos tikimasi artimiausiais mėnesiais.

Debugger integracija tobulėja. Dabar galite naudoti Bun su VS Code debugger’iu, bet patirtis dar nėra tokia sklandži kaip su Node.js. Tai aktyviai tobulinamas aspektas.

Plugin sistema plečiasi. Bun leidžia kurti custom loader’ius ir plugin’us, kurie gali transformuoti kodą runtime metu. Tai atveria duris įvairiems įdomiems use case’ams, nuo custom failo formatų iki eksperimentinių JavaScript feature’ų.

Serverless platformų integracija gerėja. Vercel, Netlify ir kitos platformos pradeda eksperimentuoti su Bun palaikymu. Kai tai taps mainstream, Bun priėmimas tikriausiai labai išaugs.

Kodėl Bun svarbus net jei jo nenaudosite

Net jei nuspręsite pasilikti su Node.js, Bun egzistavimas yra svarbus visai JavaScript ekosystemai. Konkurencija skatina inovacijas.

Node.js komanda jau reaguoja. Pastarieji Node.js release’ai rodo aiškų fokusą į spartą ir performance. Tai tiesioginis atsakas į Bun iššūkį. Permission model, native test runner, improved startup time – visa tai atsirado ar pagreitėjo dėl konkurencijos.

Deno taip pat jaučia spaudimą. Jie pristatė npm compatibility layer ir kitas funkcijas, kurios anksčiau nebuvo prioritetas. Ekosistema tampa geresnė visiems.

Bun taip pat keičia lūkesčius. Kūrėjai dabar žino, kad JavaScript runtime gali būti greitas, paprastas ir visapusiškas vienu metu. Tai kelia kartelę visiems kitiems įrankiams. Nebegalime taikstytis su lėtais build procesais ar sudėtinga konfigūracija – Bun parodė, kad galima geriau.

Bun įrodo, kad JavaScript ekosistema vis dar gali inovuoti ir stebinti. Po metų dominuojančio Node.js, atrodė, kad viskas jau nusistovėjo. Bet ne – vis dar yra vietos radikaliems pagerinimams. Tai įkvepia ir kitus eksperimentuoti, kurti, bandyti naujus dalykus.

Taigi ar turėtumėte išbandyti Bun? Jei esate smalsus kūrėjas, kuris mėgsta būti technologijų priešakyje – definityviai taip. Jei ieškote būdų pagreitinti savo development workflow – taip pat taip. Jei jums reikia absoliučiai stabilios, battle-tested platformos kritinėms sistemoms – galbūt dar palaukite šiek tiek. Bet stebėkite šį projektą – jis tikrai vertas dėmesio ir greičiausiai taps dar svarbesnis ateityje.

Daugiau

Semantic UI: intuityvus CSS framework