Porazí Bun 1.0 neohrozený NodeJS?

Môj pracovný deň sa obyčajne začína, okrem rýchleho updatu zo života kolegov, krátkym prieskumom toho, čo je v IT svete nové. Jedna z tém, ktorú posledné mesiace sledujem, je engine/all-in-one JavaScript runtime & toolkit Bun. Už od verzie 0.3 o ňom všade hovoria ako premožiteľovi NodeJS. Ale je to naozaj tak? Podľa mňa iba z časti.

Bun vs. NodeJS – aké sú rozdiely?

Kým začnem opisovať Bun, pripomeňme si ešte, čo je vlastne NodeJS. Ide o environment, ktorý slúži na vytváranie a spúšťanie moderných aplikácií písaných v JavaScripte. Je napísaný v jazyku C a využíva na čítanie a prekladanie engine V8 (a všetky jeho deriváty), ktorý je používaný v prehliadači Chromium. Jeho hlavnou výhodou je spúšťanie konkurenčných requestov.

Bun je v podstate niečo ako NodeJS. Má slúžiť na to isté, t.j. na písanie a prekladanie aplikácií vytvorených v JavaScripte, ale vo svojom základe má integrovaných viac vychytávok. K tým sa vrátim neskôr. 

Prvý rozdiel medzi Bun a NodeJS je, že Bun využíva ako engine JavaScriptCore, ktorý sa používa v Safari. Momentálne ešte neviem povedať, či je to lepšie, keďže jeho primárne určenie je menšie, ale v budúcnosti sa to určite ukáže. 

Ďalší výrazný rozdiel je použitie jazyka Zig, v ktorom je celý Bun navrhnutý. Ak ste o Zig nikdy nepočuli, možno vám niečo viac povie Rust. Zig je v podstate podobný ako Rust – navrhnutý najmä na bezpečnosť, multivláknový, moderný (ale písaný tradičnejšie), a plne kompatibilný s C/C++.

Čo má Bun navyše?

Ako som spomínal, Bun má vstavané niektoré aplikácie a moduly, ktoré majú vývojárom pomôcť zefektívniť ich prácu. Vypichnem tie, ktoré sú pre mňa osobne najdôležitejšie:

  1.  TypeScript aplikácie: Bun obsahuje TypeScript transpiler už v základe, čiže nie je nutné žiadne nastavovanie alebo ladenie. Ak máte svoj vlastný tsconfig.json, viete si vďaka nemu fungovanie transpilera doladiť, ale ak vám stačia bežné nastavenia, nie je to vôbec potrebné. Jednoducho si vytvoríte súbor s príponou .ts alebo .tsx a už fičte.
  2. Development mode: Ukrutne rýchly –watch mode, ktorý okamžite prekladá akúkoľvek aplikáciu, a –hot mode na rýchle prekresľovanie zmenených častí.
  3. package.json: Plná podpora package.json súboru a node_module priečinku.
  4. Testy: Bun už v základe podporuje písanie testov. Syntax je kompatibilná s Jest, beží to rýchlo a je tu aj podpora snapshotov.
  5. Kompatibilita: Bun je takmer kompletne kompatibilný s aplikáciami písanými pre NodeJS. Využíva totiž rovnaký JavaScript a podporované je aj API a veľká časť najčastejšie používaných NodeJS príkazov. Na internete sa už objavuje množstvo návodov, ako migrovať alebo testovať svoje aplikácie z NodeJS do Bun. Oplatí sa ich vyskúšať.
Obrázok 1: Konfigurácia servera. Zdroj: https://dev.to/mourishitz/running-nestjs-server-with-bun-4cdl
Obrázok 2: Test z konfigurácie v obrázku 1 pre development – skoro 2x viac requestov zvladnutých za 30s. Zdroj: https://dev.to/mourishitz/running-nestjs-server-with-bun-4cdl 
Obrázok 3: Test z konfigurácie v obrázku 1 pre buildnuty projekt – skoro 3x viac requestov zvladnutých za 30s. Zdroj: https://dev.to/mourishitz/running-nestjs-server-with-bun-4cdl

Porovnanie praxou

Nebudem tu zbytočné popisovať bežné testy na hello-world deme. Radšej sa podelím o vlastné skúsenosti a svoje pocitové testy z praxe. Prišiel som na to, že:

  • Väčší výkon je citeľný na všetkých frontoch – v spúšťaní aplikácií, testoch a hlavne pri –watch mode v developmente. Tu by som rozdiel dokonca opísal ako brutálny :)
  • Bun je už v základe pripravený na veľkú škálovateľnosť a paralelizmus. Rádovo teda zvládne za sekundu aj 2 – 3x viac requestov, ako NodeJS. Ešte je však otázne, ako to bude so stabilitou.
  • Kvôli redukovanému kódu a optimalizácii RAM a výkonu nemá BUN veľký rozptyl na latencii (oneskorenie medzi akciou používateľa a odpoveďou webovej aplikácie na túto akciu). Pohybuje sa to niekde medzi 0.5-10s, pričom pri NodeJS sú tieto hodnoty okolo 0.05-100s.
  • Bun využíva o niečo viac RAM, ale menej CPU ako NodeJS. Toto môže byť kameňom úrazu, ale stále je tu miesto na ďalšie optimalizácie.

Veľa veľkých projektov už má svoje testovacie prostredia alebo testovacie verzie kompatibilné ako pre NodeJS, tak aj pre Bun. Stačí si teda prakticky len vybrať.

Spotreba CPU pri 200 paralénych requestoch hello world. Zdroj: https://medium.com/deno-the-complete-reference/hello-world-performance-bun-vs-node-js-2c9d383b94c1
Spotreba RAM pri 200 paralelných requestoch hello world. Zdroj: https://medium.com/deno-the-complete-reference/hello-world-performance-bun-vs-node-js-2c9d383b94c1

Môže v tom byť háčik?

Ja vidím problém hlavne v tom, že Bun je ešte stále nový. Vo svete IT sa veľakrát stretnete s až prehnaným nadšením pre niečo nové a revolučné, no po čase to často zapadne prachom, lebo sa vyskytol problém s bezpečnosťou, alebo sa vývojárom riešenia nechcelo svoj výtvor ďalej vylepšovať.

Aktuálne je najväčšia sila Bun-u v tom, že sa jedná o malú knižnicu, vďaka čomu môže pracovať super rýchlo. Je to ale iba verzia 1.0. Naproti tomu NodeJS si prešiel už 21 veľkými cyklami opráv, vylepšení, a hlavne neustálym načúvaním komunity a reakciou na jej požiadavky. To jedno zatiaľ Bun nemá – roky skúseností, chýb a omylov. Nerád by som videl, ako táto nádejná knižnica kvôli nadbytočnostiam či nabaľovaniu fixov postupne spomaľuje.

Kto vie, v budúcnosti sa možno objaví ďalší “premožiteľ”, ktorý sa postaví spolu Bun-u aj NodeJS. Napriek tomu si ale myslím, že “starý dobrý” NodeJS tu bude s nami aj o 10 rokov. Veď aj také PHP-čko už niekoľkokrát podľahlo klinickej smrti, no stačil jeden podarený reštart a komunita vývojárov sa k nemu opäť vracia.