Tingus krovimas ir taikymo hidratacija sąveikauja sudėtingai ir dažnai prieštaringai, pirmiausia todėl, kad hidratacijai reikia nekantriai vykdyti programos kodą, o tai kenkia tingaus pakrovimo pranašumams.
Kaip veikia hidratacija ir jo poveikis tinginiui krovimui
Hidratacija yra procesas, kurio metu serverio pateiktas HTML puslapis yra „suaktyvinamas“ kliento pusėje, paleidžiant „JavaScript“, kad pridėtų įvykių klausytojus, atkurtų komponento būseną ir padarytų puslapį interaktyviu. Šis procesas apima programos komponentų, pradedant nuo šaknies, vykdymą ir komponento medžio žemyn, kad būtų galima suprasti būseną, įrišimus ir įvykių tvarkytojus.
Kadangi hidratacija turi aplankyti kiekvieną dabartinio atvežamo medžio komponentą, kad nustatytų, ar jis turi būti interaktyvus, jis verčia visus šiuos komponentus įkelti ir atlikti nekantriai. Tai reiškia, kad net jei pažymėsite keletą tinginių krovimo komponentų, hidratacija vis tiek paskatins juos iškart įkelti, jei jie yra pradinio atvejų medžio dalis. Hidratacija yra nuosekli ir negali praleisti tarpinių komponentų, kad būtų tiesiogiai hidratuoti vaikų komponentai, todėl pirmiausia visi pirminiai komponentai turi būti hidratuoti [1] [6].
Kodėl hidratacijos sabotažai tingus krovimas
- Nekantriai vykdyti: hidratacijai reikia vykdyti visus komponentus, esančius „Render“ medyje, o tai neleidžia tingiai pakrauti šių komponentų kodo pakrovimo.
- Komponentų priklausomybės: Vaiko komponentai priklauso nuo pirminių komponentų rekvizitų, todėl pirmiausia tėvai turi būti hidratuoti, verčiantys nekantrios pakrovimo grandinę.
- Įvykių tvarkytojai ir būsena: hidratacija taip pat turi nustatyti įvykių klausytojus ir atkurti būseną, kuriai iš anksto reikia paleisti komponento kodą.
- Kūrėjų našta: Norėdami pasiekti tingų krovimą hidratacijos metu, kūrėjai turi rankiniu būdu valdyti išankstinį kūrimą ir kodo padalijimą, kuris gali būti sudėtingas ir linkęs į klaidas [6] [7].
Kai tingus krovimas veikia nepaisant hidratacijos
Tingus krovimas vis dar gali būti efektyvus komponentams, kurie nėra pradinio atvejų medžio dalis, todėl hidratacijos metu nėra lankomas. Pavyzdžiai:
- Dialogai ar modalai, atidaromi vartotojo sąveikoje
- Komponentai skirtinguose maršrutuose, kurie iš pradžių nepateikiami
Tokiais atvejais komponentai gali būti tikrai tingūs, nes hidratacija neverčia jų tiesioginio vykdymo [6].
Technikos, skirtos optimizuoti hidrataciją ir tingų krovimą
Kai kurie šiuolaikiniai rėmai ir bibliotekos bando optimizuoti šią sąveiką įgyvendindamos tingų hidrataciją ar selektyvią hidrataciją, kai komponentai yra hidratuoti tik tada, kai reikia, pavyzdžiui, kai jie tampa matomi peržiūros srityje:
-Bibliotekos, tokios kaip „Next’ Next Lazy-hidratacija-ant scroll “,„ Next.js “leidžia atidėti hidrataciją, kol komponentas slinks į vaizdą.
- Naudodamiesi „InterSectionObServer“ API, komponentai gali būti tingūs ir hidratuoti tik įvedant peržiūros sritį.
-„Vue/Nuxt“, tingus hidratacijos technikas ir papildinius (pvz., „Nuxt-Lazy-Hidrate“) įgalina hidrataciją atidėti, kol pagrindinis siūlas nebus naudojamas arba komponentas yra matomas, pagerinant laiką interaktyviam ir pirmajam įvesties delsos metrijoms [4] [5].
Santrauka
Hidratacija ir tingus krovimas iš esmės yra prieštaraujant, nes hidratacijai reikia nekantriai vykdyti komponentus „Render“ medyje, o tai neleidžia tingiai pakrauti atidėti kodo vykdymo. Tačiau tingus apkrova išlieka veiksminga komponentams, nepriklausantiems nuo pradinės hidratacijos apimties. Atsirandantys metodai, tokie kaip tingus hidratacija, siekia suderinti šį konfliktą atidėdama pačią hidrataciją, gerinant našumą ir vartotojo patirtį.
Iš esmės hidratacijos sabotažai tingus įkėlimas pradinio puslapio apkrovoje, tačiau kruopščiai pasirinkdami architektūrinius ir specializuotus įrankius, kūrėjai gali optimizuoti, kada ir kaip komponentai yra hidratuoti, kad atgautų tinginio krovimo pranašumus [1] [6] [7].
Citatos:
[1] https://www.infoq.com/presentations/hidration lazy-loading/
[2] https://qconsf.com/presentation/oct2023/hidration-and-lazy-loading-are-sccompatible
[3] https://github.com/vercel/next.js/discussions/29751
[4] https://www.wisp.blog/blog/lazy-loading-in-nextjs-the-future-of-resource-optimizacija
[5] https://vueschool.io/articles/vuejs-tuitorials/lazy-hydration-and-server-components-in-suxt-vue-js-3-performance/
[6] https://www.builder.io/blog/hydration-sabotages lazy-loading
[7] https://www.linkedin.com/posts/Misko-hevery-3883B1_Lazy-loading-is-Like-exercise-Everyone-Says-Actity-71150869393984641-5oxk
[8] https://www.techtarget.com/searchsoftwarequality/definition/lazy-loading