बिल्ड पूर्ण होण्याची वाट पाहत असलेल्या डेव्हलपर्सनी भरलेल्या खोलीत एक विचित्र प्रकारची शांतता असते. डोळे दुसऱ्या मॉनिटर्सकडे वळतात. अंगठे फोनवर स्क्रोल करतात. कोणीतरी कॉफीसाठी उठते, जी त्यांना खरंच हवी नसते. जर तुम्ही आधुनिक JavaScript कोडबेसमध्ये थोडा वेळही घालवला असेल, तर तुम्हाला ही थांबलेली वेळ माहित असेल. ही विश्रांती नाही. ती तुमच्या विचारांमध्ये निर्माण झालेली एक पोकळी आहे.

आपण फ्रेमवर्क्सबद्दल खूप बोलतो. React, Vue, Svelte आणि पुढच्या आठवड्यात जे काही नवीन येईल, ते सर्व लक्ष वेधून घेतात. कॉन्फरन्समध्ये फ्रेमवर्कच्या घोषणांसाठी तिकीटं संपतात. ब्लॉग पोस्ट्स सिंटॅक्स शुगरचे (syntax sugar) विश्लेषण करतात. पण या सर्व वापरकर्त्यांना दिसणाऱ्या गोंधळाच्या खाली, जमिनीखाली असे काही बदल होत आहेत जे प्रत्यक्षात तुम्ही कोड कसा लिहिता हे बदलून टाकतील. ही क्रांती कोणत्याही फ्रंटएंड फ्रेमवर्कमधून येत नाहीये. ती टूलिंग लेयरमध्ये (tooling layer) घडत आहे, आणि ती Rust आणि Go मध्ये लिहिली जात आहे.

अनेक वर्षांपासून, JavaScript टूल्स JavaScript नेच बनवले गेले होते. ते तर्कसंगत होते. Babel ने एका पिढीला आजच्या काळात उद्याचे सिंटॅक्स कसे लिहायचे हे शिकवले. Webpack ने आपल्या विभागलेल्या कोडला ब्राउझरला समजेल अशा स्वरूपात एकत्र केले. ESLint ने आपण कमिट करण्यापूर्वीच बग्स पकडले. ही टूल्स एका लहान वेबसाठी तयार करण्यात आली होती. त्यांनी काही शेकडो मॉड्यूल्सचा विचार केला होता, दहा हजारचा नाही. त्यांनी सिंगल रिपॉझिटरीजचा विचार केला होता, मोनोरेपॉझिटरीजचा नाही, जिथे शेअर केलेल्या UI पॅकेजमधील बदलाचा परिणाम डझनभर ॲप्लिकेशन्सवर होतो.

मग ॲप्स वाढले. कोडबेस प्रचंड रिपॉझिटरीजमध्ये रूपांतरित झाले. टूल्स मात्र तीच राहिली आणि लॅटन्सी (latency) वाढत गेली. दोन सेकंद लागणारा हॉट रीलोड (hot reload) बारा, मग तीस सेकंद लागणारा झाला. दुपारच्या जेवणापूर्वी पूर्ण टेस्ट सूट (test suite) चालवणे हे एक स्वप्न बनले. लिनटर्स (Linters) हजार वेळा तपासलेल्या फाईल्सवर अडखळू लागले. कागदावर प्रत्येक विलंब छोटा वाटतो. पण प्रत्यक्षात, हे विराम एकाग्रता भंग करतात. ते तुम्हाला तुमचे काम बॅचमध्ये करायला, एखादा फिक्स काम करतो की नाही हे तपासण्यापूर्वी द्विधा मनस्थितीत राहायला आणि प्रयोगांपासून दूर राहायला शिकवतात, कारण फीडबॅक मिळवण्यासाठी लागणारा वेळ खूप जास्त असतो.

टूलिंगची पुढची पिढी JavaScript च्या मार्गातील अडथळे दूर करून या लॅटन्सीवर हल्ला करत आहे.

नवीन इंजिन रूम

विशिष्ट कामे कशी पुन्हा मिळवली जात आहेत ते पहा.

Transformation म्हणजे पूर्वी Babel असायचे. ते एक युनिव्हर्सल प्रीप्रोसेसर होते, जे JSX आणि stage-3 प्रपोजल्सचे साध्या ES5 मध्ये रूपांतर करायचे. ते अजूनही प्रभावी सॉफ्टवेअर आहे, पण ते सिंगल-थ्रेडेड JavaScript वापरून JavaScript पार्स (parse) करत आहे. आता OXC ची एन्ट्री झाली आहे, जे एक Rust-आधारित टूलचेन आहे. ते Babel सारखीच कामे करते, पण बेंचमार्कनुसार ते सुमारे 40 पटीने वेगाने काम करते आणि ७०% कमी मेमरी वापरते. ही केवळ एक छोटी सुधारणा नाही. हे अशा टूलमधील फरक आहे जे तुम्हाला जाणवते आणि अशा टूलमधील फरक आहे जे चालू आहे हे तुम्ही विसरून जाता.

Bundling मध्ये सर्वात जास्त त्रास व्हायचा. Webpack दशकभर मानक होते, पण त्याची अंतर्गत रचना वेगळ्या स्केलसाठी बनवलेली होती. Turbopack, जो त्याचा Rust वारसदार आहे, तो केवळ वेगाने रीकम्पाईल करत नाही. तो नेमके काय बदलले आहे हे समजून घेण्यासाठी आणि फक्त तोच भाग पुन्हा तयार करण्यासाठी 'अॅग्रेसिव्ह मेमोइझेशन'चा (aggressive memoization) वापर करतो. एका मोठ्या ॲप्लिकेशनमध्ये, केवळ एक घटक (component) बदलल्यामुळे संपूर्ण ग्राफ ट्रॅव्हर्सल (graph traversal) करण्याची गरज पडू नये. Turbopack सह, बिल्ड्स त्वरित होतात. प्रोग्रेस बार गायब होतो कारण पाहण्यासारखे काही उरत नाही.

Testing मध्ये स्वतःचा वेग कमी करणारा घटक असतो. Jest ने JavaScript टेस्टिंगची व्याख्या बदलली, तरीही 'वॉच मोड'मध्ये असे वाटते की ते प्रत्येक कीस्ट्रोकवर तुमचा कोडबेस पुन्हा शिकत आहे. Vitest एक वेगळा आर्किटेक्चरल दृष्टिकोन घेते. ते स्वतःची डिपेंडन्सी ट्री (dependency tree) शून्यापासून तयार करण्याऐवजी Vite च्या मॉड्यूल ग्राफचा (module graph) पुनर्वापर करत असल्यामुळे, वॉच मोडमध्ये ते Jest पेक्षा सुमारे ८.५ पटीने वेगाने रिपोर्ट करते. येथे विजय केवळ वेगाचा नाही, तर सुसंगततेचा (coherence) आहे. तुमचा टेस्ट रनर आणि तुमचा डेव्ह सर्व्हर शेवटी तुमच्या प्रोजेक्टचे स्वरूप काय आहे यावर एकमत करतात.

Linting ला देखील अशाच प्रकारचा ओव्हरहेड सहन करावा लागतो. ESLint ची लवचिकता ही त्याची ताकद आहे; त्याचे नियम म्हणजे केवळ AST वर काम करणारे JavaScript फंक्शन्स आहेत. या लवचिकतेमुळे वेळ खर्च होतो. Rust मध्ये लिहिलेले Oxlint, केवळ सामान्य प्रकरणांवर लक्ष केंद्रित करते आणि वेगाने काम करते. ते ESLint पेक्षा ५० ते १०० पटीने वेगाने चालते. याचा व्यावहारिक परिणाम असा की, तुमच्या एडिटरमधील 'सेव्ह' ॲनिमेशन पूर्ण होण्यापूर्वीच लिंटिंग पूर्ण होते. तुम्ही समस्या सोडवल्यानंतरही काही सेकंद टिकून राहणाऱ्या लाल खुणांना (red squiggles) सहन करणे थांबवता.

कदाचित सर्वात प्रतीकात्मक बदल type checking मध्ये होत आहे. Microsoft सध्या TypeScript compiler, Go मध्ये पुन्हा लिहित आहे. सुरुवातीचे बेंचमार्क थक्क करणारे आहेत: नवीन अंमलबजावणीसह VS Code साधारण ८ पट वेगाने लोड होते आणि type checking स्वतः अंदाजे १० पट वेगाने होते. याचा अर्थ काय होतो याचा विचार करा. TypeScript ही JavaScript ची यशोगाथा आहे. ही अशी भाषा आहे जी JavaScript मध्ये compile होते, JavaScript ecosystems चे type-check करण्यासाठी वापरली जाते आणि आता तिचा स्वतःचा compiler एका native systems language कडे वळत आहे, कारण JavaScript ला आवश्यक असलेली कामगिरी (performance) देता येत नाही. हे साधन वेगासाठी स्वतःचाच मार्ग बदलत आहे.

यापैकी काहीही React ची जागा घेत नाही. यामुळे Next.js संपत नाही किंवा TypeScript कालबाह्य होत नाही. Frameworks अजूनही तुमचे component model आणि routing ठरवतात. ही नवीन साधने केवळ खालची सर्व प्रक्रिया वेगाने करतात. ते रस्ता आहेत, कार नाही.

जेव्हा वेग वर्तणूक बदलतो

Tooling संदर्भातील चर्चा अनेकदा बेंचमार्क चार्ट्समध्ये अडकून पडतात. संख्यांची तुलना करणे सोपे असते. परंतु खरा प्रभाव मानवी वर्तणुकीवर पडतो.

जेव्हा फीडबॅक सेकंदांवरून मिलिसेकंदात येतो, तेव्हा तुम्ही केवळ कामे वेगाने पूर्ण करत नाही, तर तुम्ही ती वेगळ्या पद्धतीने पूर्ण करता. तुम्ही बदल साठवून ठेवणे थांबवता. तुम्ही एक ओळ लिहिता, निकाल पाहता आणि त्यात सुधारणा करता. तुम्ही टेस्ट्स चालवता कारण त्या त्वरित होतात, तुमच्या pull request साठी आवश्यक आहेत म्हणून नाही. तुम्ही असा refactor करून पाहता जो कदाचित यशस्वी होणार नाही, कारण तो रद्द करण्यासाठी काहीही खर्च येत नाही. मशीनने तुम्हाला पुन्हा परवानगी देण्याची वाट पाहण्याऐवजी तुम्ही समस्येमध्येच मग्न राहता.

यालाच मानसशास्त्रज्ञ 'flow' म्हणतात. यासाठी कृती आणि परिणाम यांच्यात एक घट्ट दुवा आवश्यक असतो. जर ॲम्पने प्रत्येक नोटमध्ये विलंब केला, तर गिटारवादक वाजवू शकणार नाही. जर ब्रश अर्ध्या सेकंदाने अपडेट झाला, तर चित्रकार रंग मिसळू शकणार नाही. डेव्हलपर्सदेखील वेगळे नाहीत. Latency ही केवळ एक अडचण नाही, तर ती विचारांवर लादलेला एक कर आहे.

त्यामुळे, उत्पादकता वाढणे हे केवळ तांत्रिक नाही, तर ते सवयीशी संबंधित आहे. वेगवान साधने तुम्हाला प्रयोग करायला शिकवतात, तर संथ साधने तुम्हाला संकोच करायला शिकवतात. वर्षभरात, हा फरक पूर्णपणे वेगळ्या सॉफ्टवेअरमध्ये रूपांतरित होतो. ज्या टीमला त्वरित फीडबॅक मिळतो, ती अधिक आत्मविश्वासाने काम पूर्ण करते. ते कामाचे लहान तुकडे करतात कारण प्रयत्न करण्याचा खर्च शून्य असतो. त्यांचे code reviews कमी होतात कारण बग्स (bugs) वीस मिनिटांनंतर CI मध्ये न सापडता, त्याच क्षणी सापडतात.

अदृश्य काम

यामुळेच हेडलाईन्स दिशाभूल करणाऱ्या असतात. Frameworks बद्दल लिहिणे सोपे असते. त्यांना लोगो, APIs आणि ट्विटरवरील वाद असतात. इन्फ्रास्ट्रक्चर (Infrastructure) हे रचनेनुसारच अदृश्य असते. तुम्ही bundler कॉन्फिगर करण्यासाठी उत्साहाने उठत नाही. तुम्हाला ते अदृश्य व्हावे असे वाटते. पण चांगल्या इन्फ्रास्ट्रक्चरचे कामच हे आहे की ते अदृश्य व्हावे. ते सर्व भार पेलते जेणेकरून वरचा दृश्य स्तर हलका राहू शकेल.

जर तुम्ही एखादी टीम नेत असाल किंवा legacy codebase सांभाळत असाल, तर या गोष्टीने तुमच्या प्राधान्यक्रमांना दिशा दिली पाहिजे. React कडून Vue कडे स्थलांतरित (Migrating) केल्यामुळे तुमचे component tree बदलू शकते. Webpack कडून Turbopack कडे किंवा Babel कडून OXC कडे स्थलांतरित केल्यामुळे तुमचा संपूर्ण कामाचा दिवस बदलू शकतो. व्यवस्थापनाला (management) दुसरी गोष्ट पटवून देणे कठीण असते कारण त्यासाठी कोणताही नवीन होमपेज डेमो नसतो. तिथे फक्त एक अशी टीम असते जी त्यांच्या build terminal कडे बघून सुस्कारे सोडणे थांबवते.

तुम्हाला नेमके काय धीमे करत आहे याचे ऑडिट करा. जर तुम्ही २०१५ मध्ये तयार झालेल्या toolchain वर आधुनिक monorepo चालवत असाल, तर तुम्ही सावधगिरी बाळगत नाही आहात, तर तुम्ही दररोज 'friction tax' भरत आहात. याचे निराकरण नवीन frontend paradigm शिकण्यात नाही, तर इंजिन बदलण्यात आहे.

Frameworks येतच राहतील. त्यांना ट्विट्स आणि कॉन्फरन्समधील मुख्य भाषणे मिळत राहतील. परंतु JavaScript लिहिण्याचा अनुभव कसा असेल, यातील खरा बदल 'under the hood' घडत आहे—अशा compiled languages मध्ये ज्या तुमच्या वेळेला मौल्यवान समजतात. हीच खरी क्रांती आहे. एखादी यादी (list) रेंडर करण्याची नवीन पद्धत नाही, तर एक असे toolchain जे तुमच्या मार्गातील अडथळा न ठरता तुम्हाला विचार करण्यास मोकळीक देते.