Kuna aina fulani ya ukimya wa ajabu katika chumba kilichojaa watengenezaji wakisubiri build iishe. Macho huelekea kwenye vioo vya pili vya kompyuta. Vidole huteleza kwenye simu. Mtu fulani anaondoka kwenda kunywa kahawa ambayo haimuhitaji sana. Ikiwa umetumia muda wowote kwenye codebase ya JavaScript za kisasa, unajua kusimama huku. Si mapumziko. Ni pengo katika mawazo yako.
Tunazungumzia sana kuhusu frameworks. React, Vue, Svelte, na chochote kitakachotolewa wiki ijayo huchukua uangalizi wote. Mikutano ya teknolojia hujaa kwa ajili ya matangazo ya frameworks. Machapisho ya blogu huchambua syntax sugar. Lakini chini ya kelele zote hizo zinazomlenga mtumiaji, misingi inabadilika kwa namna itakayobadilisha jinsi unavyoandika kodi. Mapinduzi hayaji kutoka kwa frontend framework. Yanatokea katika tabaka la zana (tooling layer), na yanaandikwa kwa kutumia Rust na Go.
Kwa miaka mingi, zana za JavaScript zilijengwa kwa kutumia JavaScript. Hilo lilikuwa na mantiki. Babel ilifundisha kizazi kizima jinsi ya kuandika syntax ya kesho leo. Webpack ilikusanya kodi zetu zilizogawanywa kuwa kitu ambacho vivinjari (browsers) vingeweza kukitumia. ESLint ilikamata hitilafu (bugs) kabla hatujaziweka (commit). Zana hizi zilisanifiwa kwa ajili ya mtandao mdogo. Zilichukulia kuwa kuna moduli mamia machache, si elfu kumi. Zilichukulia kuwa kuna repos moja, si monorepos ambapo mabadiliko katika kifurushi cha UI kinachoshirikishwa huathiri programu kadhaa.
Kisha programu zilikua. Codebases ziligeuka kuwa ghala (repositories) kubwa sana. Zana zilikaa vile vile, na ucheleweshaji (latency) ukaanza kuingia. Hot reload iliyochukua sekunde mbili ikawa sekunde kumi na mbili, kisha sekunde thulathini. Kuendesha seti kamili ya majaribio (test suite) kabla ya chakula cha mchana ikawa ndoto. Linters zilishindwa kufanya kazi vizuri kwenye faili ambazo zilikuwa zimekaguliwa mara elfu. Kila ucheleweshaji unaonekana mdogo kwenye karatasi. Lakini kwa vitendo, kusimama huku kunavunja umakini. Kunakufundisha kufanya kazi kwa makundi, kusita kabla ya kuangalia ikiwa marekebisho yamefanya kazi, na kuepuka majaribio kwa sababu gharama ya kupata mrejesho ni kubwa mno.
Kizazi kijacho cha zana kinashambulia ucheleweshaji huo kwa njia rahisi ya kuacha JavaScript iendelee bila vikwazo.
Chumba Kipya cha Injini
Angalia jinsi kazi mahususi zinavyorejeshwa.
Transformation zamani ilimaanisha Babel. Ilikuwa preprocessor ya ulimwengu wote, ikitafsiri JSX na mapendekezo ya stage-3 kuwa ES5 ya kawaida. Bado ni programu ya kuvutia, lakini ni JavaScript inayofanya kazi kwa single-threaded ikichambua JavaScript. Hapa ndipo OXC inapoingia, mfululizo wa zana (toolchain) unaotegemea Rust. Inashughulikia kazi zilezile Babel inazofanya, lakini vipimo (benchmarks) vinaonyesha kuwa ni haraka zaidi mara 40 hivi huku ikitumia kumbukumbu (memory) ndogo kwa 70%. Hiyo si mabadiliko madogo tu. Hiyo ni tofauti kati ya zana unayoiona na zana unayoisahau kuwa inafanya kazi.
Bundling ndipo ambapo tatizo lilikuwa kali zaidi. Webpack ilikuwa kiwango cha juu kwa muongo mmoja, lakini sehemu zake za ndani zimejengwa kwa ajili ya kiwango tofauti. Turbopack, mrithi wake wa Rust, haupandishi kodi upya (recompile) kwa haraka tu. Inategemea aggressive memoization ili kuelewa hasa nini kimebadilika na kujenga upya sehemu hiyo tu. Katika programu kubwa, kubadilisha component moja haipaswi kukugharimu mchakato mzima wa graph traversal. Kwa Turbopack, ujenzi (builds) unakaribia kuwa wa papo hapo. Bar ya maendeleo (progress bar) inatoweka kwa sababu hakuna cha kusubiri.
Testing ina mzigo wake wa kipekee. Jest ilibadilisha mfumo wa majaribio ya JavaScript, lakini katika watch mode inaweza kuhisi kana kwamba inajifunza upya codebase yako kwa kila herufi unayobofya. Vitest inatumia mbinu tofauti ya usanifu. Kwa sababu inatumia tena module graph ya Vite badala ya kujenga mti wake wa utegemezi (dependency tree) kuanzia mwanzo, inaripoti kasi ya haraka zaidi mara 8.5 hivi kuliko Jest katika watch mode. Ushindi hapa si kasi tu. Ni uwiano. Test runner wako na dev server wako hatimaye wanakubaliana kuhusu jinsi mradi wako ulivyo.
Linting inasumbuliwa na mzigo unaofanana. Unyumbufu wa ESLint ndio nguvu yake kuu; sheria zake ni kazi za JavaScript tu zinazofanya kazi kwenye AST. Unyumbufu huo unagharimu cycles. Oxlint, iliyoandikwa kwa Rust, inapunguza wigo kwenye matukio ya kawaida na kukimbia kwa kasi. Inafanya kazi kati ya mara 50 na 100 haraka kuliko ESLint. Athari yake ya vitendo ni linting inayomalizika kabla hata ya animation ya kuhifadhi (save) kwenye edita wako. Unaacha kuvumilia mistari nyekundu inayochelewa kwa sekunde kadhaa baada ya wewe tayari kuwa umeshabadilisha tatizo.
Labda mabadiliko yenye maana kubwa zaidi yanatokea katika type checking. Microsoft kwa sasa inandika upya TypeScript compiler kwa kutumia Go. Vipimo vya awali (benchmarks) vinashangaza: VS Code inajipakia takriban mara 8 kwa kasi zaidi kwa utekelezaji mpya, na type checking yenyewe ni takriban mara 10 ya kasi zaidi. Fikiria maana yake. TypeScript ni hadithi ya mafanikio ya JavaScript. Ni lugha inayobadilishwa kuwa JavaScript, inayotumika kufanya type-check kwenye mifumo ya JavaScript, na sasa compiler yake yenyewe inahamia kwenye lugha ya mifumo ya asili (native systems language) kwa sababu JavaScript haiwezi kutoa ufanisi unaohitajika na mfumo huo. Chombo hiki kinajiongezea kasi kwa kujiboresha chenyewe.
Hakuna kati ya haya inayobadilisha React. Haiui Next.js wala kuifanya TypeScript kuwa ya kizamani. Frameworks bado zinaamua mfumo wako wa component na routing yako. Zana hizi mpya zinachofanya tu ni kufanya kila kitu kilicho chini yake kuwa cha haraka zaidi. Ni barabara, si gari.
Wakati Kasi Inapobadilisha Tabia
Mazungumzo kuhusu zana mara nyingi hukwama kwenye chati za benchmark. Namba ni rahisi kulinganisha. Lakini athari halisi iko katika tabia ya binadamu.
Wakati mrejesho (feedback) unapopungua kutoka sekunde hadi milisekunde, huishii tu kumaliza kazi kwa haraka zaidi. Unazimaliza kwa namna tofauti. Unaacha kuhifadhi mabadiliko mengi kwa pamoja. Unaandika mstari mmoja, unaona matokeo, kisha unarekebisha. Unafanya majaribio (tests) kwa sababu ni ya papo hapo, si kwa sababu pull request yako inayahitaji. Unajaribu refactor ambayo huenda isifanye kazi kwa sababu kuifuta haigharimu kitu. Unabaki ndani ya tatizo badala ya kusubiri mashine ikuruhusu kurudi tena.
Hii ndiyo kitu ambacho wanasaikolojia wanakiita flow. Inahitaji mzunguko wa karibu kati ya kitendo na matokeo. Mpiga gitaa hawezi kucheza ikiwa amplifier inachelewesha kila nota. Mchoraji hawezi kuchanganya rangi ikiwa brashi inajisajili (updates) nusu sekunde baadaye. Watengenezaji (developers) hawafanani na hivyo. Latency si usumbufu tu. Ni kodi inayozuia kufikiri.
Hivyo basi, ongezeko la uzalishaji si la kiufundi tu. Ni la tabia. Zana za haraka zinakufundisha kufanya majaribio. Zana za polepole zinakufundisha kusita. Katika kipindi cha mwaka mmoja, tofauti hiyo inajijenga na kuleta programu tofauti kabisa. Timu yenye mrejesho wa papo hapo hutuma kazi (ships) kwa ujasiri zaidi. Wanagawanya kazi katika vipande vidogo kwa sababu gharama ya kujaribu ni sifuri. Mapitio yao ya kodi (code reviews) hupungua kwa sababu hitilafu (bugs) hugunduliwa papo hapo, si kwenye CI dakika ishirini baadaye.
Kazi Isiyoonekana
Hii ndiyo sababu vichwa vya habari vinapotosha. Ni rahisi kuandika kuhusu frameworks. Zina nembo, API, na drama za Twitter. Miundombinu (infrastructure) imesanifiwa isiweonekana. Hauamki ukiwa na msisimko wa kusanidi (configure) bundler. Unataka itoweke. Lakini kutoweka ndiyo hasa kazi ya miundombinu nzuri. Inabeba uzito ili tabaka linaloonekana liwe nyepesi.
Ikiwa unaongoza timu au unadumisha codebase ya zamani (legacy codebase), hili linapaswa kuongoza vipaumbele vyako. Kuhama kutoka React kwenda Vue kunaweza kubadilisha muundo wa component tree yako. Kuhama kutoka Webpack kwenda Turbopack au kutoka Babel kwenda OXC kunaweza kubadilisha siku yako nzima ya kazi. Jambo la pili ni gumu zaidi kulielezea kwa uongozi kwa sababu hakuna demo mpya ya ukurasa wa nyumbani. Kuna timu tu ambayo inaacha kuhema kwa kuchoshwa mbele ya terminal yake ya build.
Kagua kile kinachokupunguza kasi hasa. Ikiwa unatumia monorepo ya kisasa kwenye toolchain iliyoundwa mwaka 2015, hauko makini tu. Unalipa kodi ya kila siku ya vikwazo (friction tax). Suluhisho si kujifunza mfumo mpya wa frontend. Ni kubadilisha injini.
Frameworks zitaendelea kuja. Zitaendelea kupata tweets na hotuba za mikutano. Lakini mabadiliko halisi katika jinsi JavaScript inavyohisi kuandikwa yanatokea chini ya kapeti, katika lugha zinazobadilishwa (compiled languages) ambazo zinathamini muda wako kama kitu cha thamani. Hiyo ndiyo mapinduzi. Si njia mpya ya kuonyesha (render) orodha, bali ni toolchain ya haraka ya kutosha kukuacha uendelee na kazi yako na kukuacha ufikiri.
