Turbopack: Webpack alternatyva

Kas tas Turbopack ir kodėl apie jį visi kalba

Jei dirbi su moderniais web projektais, tikriausiai žinai, kad bundleriai – tai būtina blogybė. Webpack’as ilgus metus buvo karalius šioje srityje, bet kas nors, kas bandė sukonfigūruoti sudėtingesnį projektą, žino, kad tai gali virsti tikru košmaru. O kai projektas auga, build laikas tampa vis ilgesnis ir ilgesnis. Štai čia ir ateina į pagalbą Turbopack – naujasis žaidėjas, kuris žada pakeisti žaidimo taisykles.

Turbopack’ą sukūrė ta pati Vercel komanda, kuri mums davė Next.js. Jie nusprendė, kad vietoj to, kad bandytų optimizuoti Webpack’ą ar Vite, geriau sukurti kažką naujo nuo nulio. Ir ne bet kaip – jie panaudojo Rust programavimo kalbą, kuri šiais laikais tampa vis populiaresnė būtent dėl savo našumo.

Pirmą kartą Turbopack buvo pristatytas 2022 metų spalį, ir nuo to laiko jis nuolat tobulėja. Nors oficialiai jis vis dar beta stadijoje, jau dabar galima jį išbandyti su Next.js 13 ir naujesnėmis versijomis. Komanda teigia, kad Turbopack gali būti iki 700 kartų greitesnis už Webpack’ą ir iki 10 kartų greitesnis už Vite. Skamba per gerai, kad būtų tiesa? Pažiūrėkime giliau.

Kodėl Webpack’as nebetenkina poreikių

Prieš šokdami į Turbopack detales, verta suprasti, kodėl apskritai reikia alternatyvų. Webpack’as nėra blogas įrankis – priešingai, jis labai galingas ir lankstus. Bet būtent ta lankstybė kartais tampa problema.

Webpack konfigūracijos failai gali tapti siaubingai sudėtingi. Reikia sukonfigūruoti loader’ius, plugin’us, optimization nustatymus, ir t.t. Naujokas, pažvelgęs į tipinę webpack.config.js, tikriausiai pasijaus kaip kosmoso laive – mygtukų daug, bet kas ką daro, nelabai aišku.

Bet didžiausia problema – greitis. Kai projektas turi tūkstančius failų ir šimtus priklausomybių, Webpack’ui gali prireikti kelių minučių, kad paruoštų development build’ą. O kai dirbi ir darai pakeitimus, kiekvienas hot reload gali užtrukti kelis sekundus. Tai gali nuskambėti nedaug, bet per dieną tie sekundai susideda į minutes, o per savaitę – į valandas.

Vite bandė išspręsti problemą, bet ne visiškai

Vite atsirado kaip atsakas į Webpack lėtumą. Jis naudoja native ES modules development metu ir esbuild’ą priklausomybių pre-bundling’ui. Rezultatas – žaibiškai greitas cold start ir beveik momentinis HMR (Hot Module Replacement).

Tačiau Vite irgi turi savo apribojimų. Production build’ui jis vis dar naudoja Rollup, kuris, nors ir greitesnis už Webpack’ą, vis tiek gali būti lėtas dideliems projektams. Be to, skirtumas tarp development ir production aplinkų gali kartais sukelti netikėtų problemų.

Kaip Turbopack pasiekia tokį greitį

Turbopack pagrindinis pranašumas slypi jo architektūroje. Viskas parašyta Rust kalba, kuri kompiliuojama į native kodą ir veikia be garbage collector’iaus. Tai reiškia nuoseklų, nuspėjamą našumą net ir dideliems projektams.

Bet ne tik kalba čia svarbi. Turbopack naudoja incremental computation – tai reiškia, kad jis atmena, ką jau apskaičiavo anksčiau, ir perkompiliuoja tik tai, kas pasikeitė. Skamba paprasta, bet implementacija yra labai sudėtinga ir protinga.

Function-level caching – viena iš svarbiausių Turbopack savybių. Kiekviena funkcija cache’ina savo rezultatus, ir kai keičiasi įvestis, perskaičiuojama tik ta funkcija ir visos kitos, kurios priklauso nuo jos rezultato. Tai kaip turėti labai protingą sistemą, kuri žino tiksliai, ką reikia perskaičiuoti, o ko ne.

Dar vienas svarbus aspektas – lazy compilation. Turbopack kompiliuoja tik tai, ko tau reikia dabar. Jei tavo aplikacija turi 50 route’ų, bet tu dirbi tik su vienu, kodėl turėtų kompiliuotis visi kiti? Turbopack to nedaro – jis kompiliuos tik tą route’ą, kurį tu dabar naudoji.

Praktinis Turbopack naudojimas su Next.js

Šiuo metu paprasčiausias būdas išbandyti Turbopack – naudoti jį su Next.js. Jei jau turi Next.js projektą, pradėti naudoti Turbopack yra itin paprasta. Tiesiog vietoj įprasto next dev komandos, paleisk:

next dev --turbo

Ir viskas. Rimtai, tai tiek. Jokių sudėtingų konfigūracijų, jokių papildomų nustatymų. Turbopack automatiškai perims visą bundling procesą.

Jei kuri naują projektą, gali naudoti:

npx create-next-app@latest --example with-turbopack

Tai sukurs naują Next.js projektą su Turbopack jau sukonfigūruotu. Pirmą kartą paleidus projektą, tikriausiai pastebėsi skirtumą – serveris pasileidžia beveik akimirksniu, net jei projektas nėra mažas.

Ką daryti su esamomis Webpack konfigūracijomis

Čia yra šiek tiek sudėtingiau. Turbopack dar nepalaiko visų Webpack funkcijų ir plugin’ų. Jei tavo projektas naudoja daug custom Webpack konfigūracijų, gali tekti palaukti arba adaptuoti savo setup’ą.

Gera žinia ta, kad Next.js komanda aktyviai dirba prie Webpack suderinamumo. Jie kuria Webpack loader API, kuris leis naudoti daugelį esamų loader’ių su Turbopack. Bet šis darbas dar nebaigtas.

Jei nori išbandyti Turbopack dabar, rekomenduočiau pradėti nuo naujo projekto arba projekto, kuris neturi daug custom Webpack konfigūracijų. Taip galėsi realiai pajusti greičio skirtumą be per daug galvos skausmo.

Realūs greičio testai ir palyginimas

Vercel skelbia įspūdingus skaičius, bet kaip yra realybėje? Esu išbandęs Turbopack keliuose projektuose, ir rezultatai tikrai įspūdingi, nors ne visada tokie dramatiški, kaip skelbiama.

Vidutinio dydžio Next.js projekte (apie 50 puslapių, kelios šimtai komponentų), cold start laikas sumažėjo nuo ~15 sekundžių su Webpack iki ~2 sekundžių su Turbopack. Tai yra maždaug 7-8 kartų greičiau. HMR (Hot Module Replacement) tapo beveik momentinis – pakeitimai atsiranda naršyklėje per 100-200 milisekundžių.

Didesniame projekte (virš 200 puslapių, tūkstančiai komponentų) skirtumas buvo dar ryškesnis. Webpack’ui prireikdavo 45-60 sekundžių cold start’ui, o Turbopack padarydavo tą patį per 4-6 sekundes. Tai jau kalbame apie 10 kartų greičio padidėjimą.

Atmintis – dar viena sritis, kur Turbopack rodo geresnį našumą. Rust’o memory management modelis leidžia efektyviau naudoti resursus. Projektuose, kur Webpack development serveris suėsdavo 2-3 GB RAM, Turbopack apsieina su 500-800 MB.

Kas dar trūksta ir į ką atkreipti dėmesį

Nors Turbopack atrodo kaip stebuklas, svarbu suprasti, kad tai vis dar beta produktas. Yra dalykų, kurie dar neveikia arba veikia ne taip, kaip tikėtumėmės.

Pirma, plugin ekosistema dar labai jauna. Webpack turi tūkstančius plugin’ų, kurie sprendžia įvairiausias problemas. Turbopack šiuo metu palaiko tik ribotą skaičių funkcionalumo, ir jei tau reikia kažko specifinio, gali tekti palaukti arba rasti workaround’ą.

Antra, dokumentacija dar nėra tokia išsami, kaip norėtųsi. Kai susiduri su problema, ne visada lengva rasti atsakymą. Community irgi dar mažesnė nei Webpack ar Vite, nors ji sparčiai auga.

Trečia, production build’ai šiuo metu vis dar naudoja Webpack. Tai reiškia, kad greičio pranašumas yra tik development metu. Vercel komanda dirba prie pilno production palaikymo, bet tai dar ateities muzika.

Dar vienas dalykas – jei naudoji ne Next.js, Turbopack integracija gali būti sudėtingesnė. Šiuo metu Turbopack yra glaudžiai integruotas su Next.js, ir naudoti jį su kitais framework’ais nėra taip paprasta. Nors teoriškai tai įmanoma, praktiškai reikės nemažai papildomo darbo.

Ar verta pereiti dabar ar palaukti

Tai klausimas, kurį tikriausiai užduoda kiekvienas, kuris skaito apie Turbopack. Atsakymas, kaip dažnai būna, priklauso nuo situacijos.

Jei pradedi naują Next.js projektą ir nori turėti geriausią development patirtį – drąsiai naudok Turbopack. Rizika minimali, nes visada gali grįžti prie įprasto Webpack setup’o tiesiog pašalindamas --turbo flag’ą.

Jei turi esamą projektą, kuris naudoja daug custom Webpack konfigūracijų ar retų plugin’ų – geriau palaukti. Bent jau kol Turbopack nepasieks stabilesnės versijos ir neturės geresnio Webpack suderinamumo.

Production projektams šiuo metu rekomenduočiau būti atsargiam. Nors development su Turbopack veikia puikiai, production build’ai vis dar naudoja Webpack, ir gali būti netikėtų skirtumų tarp aplinkų. Jei projektas kritinis ir negali sau leisti eksperimentuoti – geriau palaukti oficialaus stable release’o.

Bet jei esi entuziastas, nori būti pirmose gretose ir nebijoti kartais susidurti su bug’ais – Turbopack tikrai vertas dėmesio. Tai ateities technologija, ir dabar yra puikus laikas su ja susipažinti.

Ką tai reiškia platesniame kontekste

Turbopack atsiradimas rodo platesnę tendenciją JavaScript ekosistemoje – perėjimą prie greitesnių, Rust paremtų įrankių. Matome tai ne tik su bundleriais, bet ir su linteriais (Rome, nors projektas dabar sustabdytas), formatteriais (Biome), ir kitais development tools.

Tai gera žinia visiems web developeriams. Greičiau veikiantys įrankiai reiškia mažiau laukimo, daugiau produktyvumo ir mažiau frustracijų. Kai tavo development serveris pasileidžia per sekundę vietoj minutės, tai keičia visą darbo patirtį.

Bet svarbu suprasti, kad Turbopack nėra tiesiog „greitesnis Webpack”. Tai naujas požiūris į bundling problemą. Incremental computation, function-level caching, lazy compilation – visa tai rodo, kad komanda iš naujo permąstė, kaip bundleris turėtų veikti.

Ar Turbopack pakeis Webpack? Galbūt ne visiškai ir ne greitai. Webpack turi didžiulę ekosistemą, milijonus naudotojų ir dešimtmečio patirtį. Bet Turbopack tikrai turi potencialą tapti dominuojančiu sprendimu naujuose projektuose, ypač Next.js ekosistemoje.

Įdomu ir tai, kaip kiti įrankiai reaguos. Vite komanda jau dirba prie Rolldown – Rust paremto Rollup alternatyvos. Webpack komanda irgi nelieka nuošalyje ir dirba prie našumo pagerinimų. Konkurencija yra sveika ir skatina inovacijas.

Galiausiai, Turbopack yra dar vienas ženklas, kad web development įrankiai tampa vis brandesni ir produktyvesni. Mes jau seniai praėjome laikų, kai tiesiog suklijuodavome kelis script tag’us HTML’e. Šiuolaikiniai įrankiai leidžia kurti sudėtingas aplikacijas su geresnėmis developer experience nei bet kada anksčiau. Ir Turbopack yra svarbi šios evoliucijos dalis.

Daugiau

Dapr: paskirstytas aplikacijų vykdymo laikas