A lecke végére el tudod magyarázni, mit jelent a kliensoldali renderelés (CSR), meg tudod mondani, mit lát a böngésző, a keresőrobot és a curl a szerver válaszában, és tudod, miért kell külön megtervezni a betöltési, üres és hibás állapotot.
Miért építi a böngésző a felületet?
Ha a nézet minden változásához új HTML-t kellene kérni a szervertől, a felület lassúnak és darabosnak érződne. Ha viszont a szerver adatot ad, a böngészőben futó program pedig ebből építi a nézetet, a változás gyors és folyamatos lehet, és ugyanazt az API-t más kliens is használhatja (5. fejezet). A kliensoldali renderelés (CSR, Client-Side Rendering) azt jelenti, hogy a felület jelentős részét a böngészőben futó JavaScript állítja össze. A szerver HTML-vázat, programot és adatot adhat, és a kliens ezekből építi fel az aktuális DOM-ot (3.2).
A kurzuslista összeáll a böngészőben
A Kurzuspont CSR-változata egy kis HTML-vázat és egy szkriptet küld. A szkript lekéri a kurzusokat az API-ból, és felépíti a listát. Az alábbi a szerver tényleges válasza (curl kimenet egy kipróbáló szerverről):
(A válasz egy sorban érkezik; a könnyebb olvashatóság kedvéért tördeltük.)
A válasz nem tartalmaz egyetlen kurzust sem, csak a „Betöltés...” szöveget és a programot. A lista a böngészőben jön létre: a szkript lefut, az /api/kurzusok kérésre megérkezik a JSON, és a program beírja a DOM-ba.
flowchart LR
H[HTML-váz] --> B[Böngésző]
J[JavaScript] --> B
A[API-adat] --> B
B --> D[DOM és látható felület]
Az ábra nem azt állítja, hogy CSR-nél a szerver nem küld HTML-t. A kiinduló váz is HTML. A döntő kérdés az, hol készül el a fő tartalmi nézet.
(Ezt a kódot böngészőben nem futtattuk, mert a document és a fetch-eredmény megjelenítése böngészőt igényel; a szervervalasz viszont tényleges kimenet. Az egyszerűség kedvéért a példa a cim mezőt közvetlenül HTML-be írja: valódi alkalmazásban az idegen eredetű szöveget nem szabad így beilleszteni, lásd a 8. fejezetben az XSS-t.)
A betöltési lánc következményei
A böngészőnek előbb le kell töltenie és futtatnia a programot, és ha a tartalomhoz API-adat kell, annak válaszára is várnia kell. Az első használható képernyő idejét így a HTML mellett a JavaScript mérete, futása és az adatlekérés is befolyásolja:
sequenceDiagram
participant B as Böngésző
participant S as Szerver
B->>S: GET /csr
S-->>B: HTML-váz + szkript
Note over B: A felhasználó "Betöltés..." szöveget lát
B->>S: GET /api/kurzusok
S-->>B: JSON
Note over B: A szkript felépíti a listát
Ha az API lassú vagy nem érhető el, a felhasználó a „Betöltés...” szövegnél marad. Gyenge eszközön a program feldolgozása különösen számíthat. Ezért nem elég a hálózati kérések számát nézni: a böngészőben végzett munka is a felhasználói élmény része.
Betöltési, üres és hibás állapot
A CSR-ben a felületnek legalább négy állapota van, és mindegyiket meg kell tervezni:
Állapot
Mit lát a felhasználó?
Betöltés
Visszajelzés, hogy az adat úton van (nem végtelen forgó jelzés)
Siker
A lista
Üres
„Nincs találat a szűrésre”: ez nem hiba
Hiba
Magyarázat és újrapróbálási lehetőség
Az „üres eredmény” nem azonos az „adatkérés sikertelen” állapottal; a kettőt a felhasználónak meg kell tudnia különböztetni.
Interakció és újrarajzolás
A kliensprogram gyorsan reagálhat helyi változásokra (szűrés, panel nyitása). Ha a változáshoz szerveradat kell, új HTTP-kérést indít. A DOM módosítása után a böngésző stílust és elrendezést is újraszámolhat (3.3). A felhasználó által érzett sebesség tehát a program tervezésétől, a hálózattól és a rendereléstől együtt függ.
Az alkalmazás adatmodellje és a megjelenő DOM nem azonos: a lista adatai lehetnek a memóriában, miközben a képernyőn csak a szűrt részük látszik. Ha az adat frissül, a programnak össze kell hangolnia a belső állapotot és a felületet (6.5).
Mit lát a „nem böngésző”?
Egy keresőrobot, egy hivatkozás-előnézet készítő vagy a curl a fenti válaszban csak a „Betöltés...” szöveget látja, ha nem futtatja a szkriptet. Egyes keresők futtatják a JavaScriptet, de ez további költséget és bizonytalanságot jelent (lásd a kereshetőség kérdését a 9. fejezetben). A fontos, nyilvános tartalmat ezért gyakran már a szerver válaszában érdemes elhelyezni, ami a következő lecke témája.
Kapcsolat az SPA-val
Végigvezetett példa: a Kurzuspont szűrője
A jelentkezési felület kurzuslistáján a hallgató szűr. A CSR változatban:
Az oldal betölt, a lista kezdetben „Betöltés...”.
A szkript lekéri az összes kurzust, és felépíti a listát.
Gépeléskor a szkript a már letöltött adatból szűr, hálózati kérés nélkül.
A „jelentkezem” gomb viszont új kérést küld, mert a szabad helyet a szervernek kell eldöntenie.
A szűrés gyors, mert helyi, de a jelentkezéshez mindig a szerver a végső bíró.
Gyakori tévhitek
Állítás
Pontosítás
„CSR esetén nincs szerver.”
A szerver HTML-vázat, programot és API-adatot ad.
„A JavaScript letöltése után az oldal kész.”
Futtatás, adatlekérés és renderelés még hátra lehet.
„A kliensoldali váltás mindig hálózatmentes.”
Friss adathoz új API-kérés kellhet.
„CSR = SPA.”
A renderelés helye és a navigációs modell két külön tengely.
„A keresők mindig látják a JavaScript által épített tartalmat.”
Nem garantált; a nyers válasz csak a vázat tartalmazza.
Röviden
CSR: a fő nézet a böngészőben, JavaScripttel áll elő; a szerver váza gyakran szinte üres.
Az első használható képernyő a programtól és az adatlekéréstől is függ.
A betöltés, siker, üres és hiba állapotát külön meg kell tervezni.
A nem böngésző kliensek (robot, curl) a nyers választ látják.
A CSR és az SPA nem azonos.
Ellenőrző kérdések
Mit tartalmaz a /csr válasza a kurzusokról?
Miért lehet lassabb az első használható képernyő CSR-nél?
Kliensoldali renderelés
Célok
A lecke végére el tudod magyarázni, mit jelent a kliensoldali renderelés (CSR), meg tudod mondani, mit lát a böngésző, a keresőrobot és a
curla szerver válaszában, és tudod, miért kell külön megtervezni a betöltési, üres és hibás állapotot.Miért építi a böngésző a felületet?
Ha a nézet minden változásához új HTML-t kellene kérni a szervertől, a felület lassúnak és darabosnak érződne. Ha viszont a szerver adatot ad, a böngészőben futó program pedig ebből építi a nézetet, a változás gyors és folyamatos lehet, és ugyanazt az API-t más kliens is használhatja (5. fejezet). A kliensoldali renderelés (CSR, Client-Side Rendering) azt jelenti, hogy a felület jelentős részét a böngészőben futó JavaScript állítja össze. A szerver HTML-vázat, programot és adatot adhat, és a kliens ezekből építi fel az aktuális DOM-ot (3.2).
A kurzuslista összeáll a böngészőben
A Kurzuspont CSR-változata egy kis HTML-vázat és egy szkriptet küld. A szkript lekéri a kurzusokat az API-ból, és felépíti a listát. Az alábbi a szerver tényleges válasza (
curlkimenet egy kipróbáló szerverről):(A válasz egy sorban érkezik; a könnyebb olvashatóság kedvéért tördeltük.)
A válasz nem tartalmaz egyetlen kurzust sem, csak a „Betöltés...” szöveget és a programot. A lista a böngészőben jön létre: a szkript lefut, az
/api/kurzusokkérésre megérkezik a JSON, és a program beírja a DOM-ba.flowchart LR H[HTML-váz] --> B[Böngésző] J[JavaScript] --> B A[API-adat] --> B B --> D[DOM és látható felület]Az ábra nem azt állítja, hogy CSR-nél a szerver nem küld HTML-t. A kiinduló váz is HTML. A döntő kérdés az, hol készül el a fő tartalmi nézet.
(Ezt a kódot böngészőben nem futtattuk, mert a
documentés afetch-eredmény megjelenítése böngészőt igényel; a szervervalasz viszont tényleges kimenet. Az egyszerűség kedvéért a példa acimmezőt közvetlenül HTML-be írja: valódi alkalmazásban az idegen eredetű szöveget nem szabad így beilleszteni, lásd a 8. fejezetben az XSS-t.)A betöltési lánc következményei
A böngészőnek előbb le kell töltenie és futtatnia a programot, és ha a tartalomhoz API-adat kell, annak válaszára is várnia kell. Az első használható képernyő idejét így a HTML mellett a JavaScript mérete, futása és az adatlekérés is befolyásolja:
sequenceDiagram participant B as Böngésző participant S as Szerver B->>S: GET /csr S-->>B: HTML-váz + szkript Note over B: A felhasználó "Betöltés..." szöveget lát B->>S: GET /api/kurzusok S-->>B: JSON Note over B: A szkript felépíti a listátHa az API lassú vagy nem érhető el, a felhasználó a „Betöltés...” szövegnél marad. Gyenge eszközön a program feldolgozása különösen számíthat. Ezért nem elég a hálózati kérések számát nézni: a böngészőben végzett munka is a felhasználói élmény része.
Betöltési, üres és hibás állapot
A CSR-ben a felületnek legalább négy állapota van, és mindegyiket meg kell tervezni:
Az „üres eredmény” nem azonos az „adatkérés sikertelen” állapottal; a kettőt a felhasználónak meg kell tudnia különböztetni.
Interakció és újrarajzolás
A kliensprogram gyorsan reagálhat helyi változásokra (szűrés, panel nyitása). Ha a változáshoz szerveradat kell, új HTTP-kérést indít. A DOM módosítása után a böngésző stílust és elrendezést is újraszámolhat (3.3). A felhasználó által érzett sebesség tehát a program tervezésétől, a hálózattól és a rendereléstől együtt függ.
Az alkalmazás adatmodellje és a megjelenő DOM nem azonos: a lista adatai lehetnek a memóriában, miközben a képernyőn csak a szűrt részük látszik. Ha az adat frissül, a programnak össze kell hangolnia a belső állapotot és a felületet (6.5).
Mit lát a „nem böngésző”?
Egy keresőrobot, egy hivatkozás-előnézet készítő vagy a
curla fenti válaszban csak a „Betöltés...” szöveget látja, ha nem futtatja a szkriptet. Egyes keresők futtatják a JavaScriptet, de ez további költséget és bizonytalanságot jelent (lásd a kereshetőség kérdését a 9. fejezetben). A fontos, nyilvános tartalmat ezért gyakran már a szerver válaszában érdemes elhelyezni, ami a következő lecke témája.Kapcsolat az SPA-val
Végigvezetett példa: a Kurzuspont szűrője
A jelentkezési felület kurzuslistáján a hallgató szűr. A CSR változatban:
A szűrés gyors, mert helyi, de a jelentkezéshez mindig a szerver a végső bíró.
Gyakori tévhitek
Röviden
curl) a nyers választ látják.Ellenőrző kérdések
/csrválasza a kurzusokról?Tanulási források