fejlesztési módszer pro kontra
Sziasztok
A kérdésem pusztán elméleti.
Melyik a jobb megoldás : ha a kliens gépet dolgoztatom vagy ha a szerver oldali php scriptet? Józan (nem programozó végzettségű :) ) ésszel azt mondanám az első a jobb, de valóban így van?
Konkrét dolog:
Lekérsz adatokat a szerverről (mondjuk AJAXszal).
Mi a jobb megoldás?
Ha a szerverre beérkező kérés során nem csak az adatokat adjuk vissza hanem a megjelenítési formát is (magyarán a kész HTML kódot), vagy ha csak az adatokat adom vissza és hagyom hogy a kliens oldali javascript létrehozza a megjelenítéshez szükséges html formát?
■ A kérdésem pusztán elméleti.
Melyik a jobb megoldás : ha a kliens gépet dolgoztatom vagy ha a szerver oldali php scriptet? Józan (nem programozó végzettségű :) ) ésszel azt mondanám az első a jobb, de valóban így van?
Konkrét dolog:
Lekérsz adatokat a szerverről (mondjuk AJAXszal).
Mi a jobb megoldás?
Ha a szerverre beérkező kérés során nem csak az adatokat adjuk vissza hanem a megjelenítési formát is (magyarán a kész HTML kódot), vagy ha csak az adatokat adom vissza és hagyom hogy a kliens oldali javascript létrehozza a megjelenítéshez szükséges html formát?
Attol fugg
Cserebe viszont a vastagklienses fejlesztes sokkal konnyebben karbantarthato, mert eles elvalasztas van a backend logika es a frontend logika kozott (API-val elvalasztva).
Karbantartás
Nézzük a szükséges lépéseket:
Ebből az utolsó pont a lényeges, ahol a kérés típusától függően a vastagkliens esetében mondjuk JSON-t küldünk ki, egyébként meg HTML-t.
Szóval a hagyományos kliens esetében is tökéletesen el lehet választani a programlogikát a sablonozástól, így a karbantartásra nincs igazán hátránnyal ez a megközelítés.
Ha arra gondoltál, hogy itt kényszerűen szét van választva a két oldal, és emiatt nem lesz spagettikód, ez megvalósulhat, de például a múltkori Google Drive-os elemzésemben rámutattam, hogy ettől függetlenül magában a frontend kódban keveredtek a sablonok és az alkalmazáslogika.
Ez a szétválasztás abból a szempontból hasznos, hogy az adatok kérvényezője el tudja dönteni, hogyan dolgozza fel azokat.
Szerintem János
hanem arra, hogy ha már egyre több logikát viszünk ki a FE-re (kényelmi / használhatósági okokból), akkor minél élesebben van elválasztva, annál kevesebb a kvázi kódduplikáció.
Ha mindig html-t küldünk, akkor sanszos, hogy sok olyan apró-cseprő ellenőrzést viszünk ki FE-re is, amiknek meg kell lennie BE-n, de könnyen megvalósítható FE-n és gyorsabbá és / vagy kényelmesebbé teszi a használatot, ha normál esetben már FE-n kiderül, hogy ott még matatni kell a usernek.
API-t hívogatva pedig van egy kötött (adat)struktúrád, a FE eldönti, hogy hogyan állítja elő a requestet, BE meg dob egy k.. nagy errort, ha nem volt jó. Státuszkódokkal még külön lehet csoportosítani a hibákat.
Tisztább, szárazabb érzés.
Raadasul a JS single process
Olyan 2010 óta lehet WebWorker, mostanra már elég széles a támogatottsága.
Igen
Hát biztosan vicces hibákhoz
Többszálúság
A böngészők a dinamikus típusosság és egyebek miatt eleve jóval erőforrásigényesebbek, mint egy natív program, ha több szálat használnak és ezeket programozni is lehet WebWorkerekkel, akkor még rosszabb lesz a helyzet. Így egy rosszul megírt webes alkalmazás miatt nem csak egy magot, hanem mindet meg tudja ölni, vagy például kiválóan lehet így bányászni.
A legtöbb lassú weboldal és webes alkalmazás egyszerűen csak rosszul van megírva, és optimalizálással csodákat lehet művelni, de ehelyett egyszerűbb és csábítóbb áttenni bizonyos műveleteket más szálakra.
Az erőforrások korlátozottsága miatt születnek mindig a nagy ötletek.
Ez nem böngészős programokra
Vannak feladatok, amiket jól lehet offloadolni worker szálakra. Ennek támogatása nem hiszem, hogy visszalépés.
Más
A nem webes alkalmazásoknál mások a kritériumok. És biztosan vannak a weben is olyan feladatok, ahol érdemes használni a WebWorkereket.
Rengeteg dolgot nem tudsz megoldani szerveroldalon
Én ha már definiálni akarjuk a böngészőt, akkor azt mondanám, hogy a UX van ott, nem a megjelenítés. Van különbség a kettő között (validáció stb).
Én Facebookot mondjuk egyáltalán nem használok, viszont elég sokat használom a Google Drive-ot. Rengeteg doksit, táblázatot és prezentációt készítettem vele és a MS OneDrive-val is, napi szinten használom. Soha nem éreztem még lassúnak egyiket sem. A 6 éves laptopomon sem, az év elején vásárolton meg pláne nem. Őskövületeken, vagy a mai szoftverekhez nagyon alultervezett hardware-en nyilván lassú lehet. De egy pár éves gép elég jól viszi, márpedig arra kell méretezni.
Szerintem egyáltalán nem
Abban teljes mértékben egyetértek, hogy a többség átgondolatlanul vagy rosszul használja ezeket az eszközöket, de ez nem az eszközök hibája. Én a képzésben látom a megoldást ahelyett, hogy korlátoznánk az elérhető eszközök számát. Azt hiszem ez általánosságban igaz az általunk lefolytatott viták szinte mindegyikénél.
A háttérben történő workeres cryptocurrency bányászat valóban elterjedt pl pornó oldalakon.
Képzés
Nehezíti a helyzetet, ha az ember keretrendszerekkel dolgozik, mert azok bizonyos problémákat elfednek, viszont, ha kiderül, hogy ezek bármelyikénél szűk keresztmetszet, nem is lesz az egyszeri webfejlesztőnek eszköze, elképzelése arra, hogyan lehet jól megcsinálni, sőt, ha nem moduláris, akkor még lecserélni sem tudja.
Persze, de ez sem a
Nem egyértelmű
Értem..
Attól függ...
- Ha van 10 M adatod a db-ben és a user csak 100 k-t akar megnézni, ne küldd el mind a 10 M-t.
- Csoportosítás / sorba rendezés szintén sokkal könnyebb db lekérdezés során, esetleges mapping stb pedig php-ban.
- Fenti kettő viszont még mindig az adatokra vonatkozik, nem kell hozzá html.
A lényeg kb az, hogy minél pontosabb legyen az ajax request, a visszakapott adatokkal már ne kelljen a kliensen manipulálni, de a kiíratás lehet nyugodtan a kliens dolga.
Inkább olyankor fordulhat elő, hogy érdemes html-t válaszolni, amikor pár adatból bonyolult logika szerint bonyolult html-rész keletkezik. Ha viszont "nyers adat" van sok, de egyszerű kiírni, akkor ne szorozzuk az adatforgalmat x-el a html miatt.
Értem
Akkor a select esemény ismét ajaxszozzon? Nem elég egyszer áttolni a 10 M-t és akkor a user úgy válogat ahogy szeretne? A szerver "békénhagyása" mellett?
A lekérdezés, sorba rendezés valóban gyorsabb ha az adatbázis csinálja, de kérdés ha van a következő szitució amit fentebb említettem, akkor a select onchange ajax kérés ideje + megjelenítés majd újabb select onchange + megjelenítés vajon tényleg gyorsabb-e mintha egyszer átmegy a 10 M és utána a kliens gépe dolgozik?
Ez már pláne attól függ. :)
Szóval egészséges határokat érdemes tartani.
Én alapvetően backend-párti vagyok ha valami matekot igényel, mert azt a vasat könnyebben tudom növelni (ha kell), mint a userét... Utóbbiról nem is tudod, hogy behalt, "csak" buktál egy látogatót.
Jó, most utánanéztem
Még 1 MB sincs.
Méretek
Ha grafikonokat akarsz, akkor
Nehéz
Ha kliensoldalon állítod elő a tartalmat, akkor külön figyelmet kell szentelni a keresőknek, ha ez fontos számodra. Tehát szerveroldalon is el kell készíteni ilyenkor a HTML-t, és választhatsz, hogy ezt ugyancsak javascriptben végzed el, de akkor node.js-t kell használnod, és akkor nem kell kétszer dolgoznod. Vagy ha PHP-val állítod elő, akkor az kétszer annyi munkát fog jelenteni, kétszer annyi hibázási lehetőséggel és kétszer annyi fejlesztési és karbantartási idővel. Emellett a kliensprogram is bonyolultabb lesz némileg a következő bekezdésben leírtakhoz képest.Vastag kliens
Ha csak szerveroldalon állítod elő a HTML-t, minimális kliensre lesz szükséged, mert annak csak annyi dolga lesz, hogy a megfelelő helyen lecseréli a HTML kódot. A szerveroldalon ehhez úgy kell elkészíteni a logikát, hogy tudni kell, az adott kérésnél melyik blokk változik, azaz az oldalt több ilyen részre kell bontani, például menü, tartalom, fejléc. Amikor normál kérés jön, például keresőből, akkor az összes blokk HTML kódját le kell generálni, ha AJAX, akkor pedig csak a szükségeset.Vékony kliens
Egy ilyen programot előképzettség nélkül nem egyszerű elkészíteni, még a vékony klienset sem. Én ezért azt ajánlanám, hogy először javascript nélkül, kvázi statikus oldalként, szerveroldalon előállított HTML-lel készítsd el az egészet, hagyományos űrlapokkal. Ez a biztos, ez mindenhol és mindenkinél működni fog, és legegyszerűbb az elkészítése. Emellett szerveroldalon megvalósítasz minden funkciót, azaz a bejövő adatok feldolgozását, valamint a kimenő HTML előállítását.Hogyan?
Ha tökéletesen működik, akkor érdemes utánaolvasni a Progressive Enhancement nevű dolognak, amivel "feldíszítheted" a már működő oldalt javascript segítségével.
Mondok egy példát: az adataidat táblázatosan jeleníted meg, és van egy szűrő, aminek a segítségével különböző feltételek szerint részhalmazokat jeleníthetsz meg. Tegyük fel, hogy ez működik a hagyományos módon, űrlapokkal, GET vagy POST metódussal. Ekkor javascriptben írhatsz hozzá egy nagyon egyszerű függvényt, hogy a Szűrés gombra AJAX-szal küldje el az űrlap elemeinek az értékét, és a visszakapott HTML-lel cserélje a meglévő táblázatot.
Így minimálisan kellett kiegészítened a meglévő kódbázist, a böngészőkben talán picivel gyorsabb lesz a működés, de a keresők is fel tudják dolgozni.
Nehezen találok érveket a vastag kliens mellett, de annál könnyebben ellene. A vastag klienst mindig újra le kell tölteni, ha változik az alkalmazáslogika, ha pedig a sablonok nincsenek különválasztva, akkor azokat is. A vékony kliensnél ezzel szemben elég, ha a szerveroldalon megváltoztatod a sablont, és az AJAX kéréskor azonnal már az fog kimenni.
Végeztem egy mérést is, a gépemen találtam egy adatfájlt (XML és JSON formátumban), és a belőle előállított HTML-t. A számok bájtban:
A kimeneti HTML mérete: 27 869
A bemenő XML mérete: 15 714
A bemenő JSON mérete: 14 911
Gzip-pel tömörítve pedig:
HTML: 1 438
XML: 1 148
JSON: 1 059
Ebből látszik, hogy mindenképp érdemes tömöríteni (
ob_start('ob_gzhandler');
), és hogy igazán nagy különbség a méretek között nincs.Ha viszont kliensoldalon állítjuk elő a HTML-t, akkor nem szabad elfelejtkezni az overhead-ről, azaz a bejövő adatokat mindig át kell transzformálni. Ennek a sebessége függ a kliens hardverétől és a böngészőtől, amire nincs ráhatásunk. Lehet, hogy pár bájtot megspórolhatunk a nyers adatok küldésével, viszont mobil eszközökön jobban merítjük az akkumulátort.
Ha mindent a kliensoldalon állítasz elő, előfordulhat az, ami a World of Warcraft játéknál, ahol privát szerverekkel is működik a kliens, azaz elég volt elkészíteni a szerveroldali funkciókat.
Emellett bizonyos programrészeket a kliensen és a szerveroldalon is párhuzamosan el kell készíteni, például a klienstől érkező adatok ellenőrzését. Ez is negatív hatással van a fejlesztési és karbantartási időre.
A vastag kliens előnye lehet, hogy az adatokat nyers formában küldi, ezért nem csak böngészőben lehet feldolgozni, hanem akár mobilos alkalmazást is lehet hozzá írni. De egy jól megválasztott sablonozó rendszer (XML + XSLT) segítségével ez könnyen megoldható vékony klienssel is.
Vastag kliens:Összegzés
- ha a kliens változik, újra kell tölteni,
- ahhoz, hogy a keresők indexelhessék, plusz erőfeszítéseket kell tenni,
- a klienst bárki lemásolhatja, felhasználhatja
- nagyobb az erőforrásigénye, lassabb.
Vékony kliens:Köszönöm
Valóban, arra nem gondoltam, hogyha kliensen oldok meg dolgokat, akkor ha változik pl a javascript akkor a user amíg nem tölti le újra a teljes js-t addig nem fog megfelelően menni az oldal. És tényleg kétszer kell ellenőrizni a kérés adatait, egyiket a kliens oldalon kényelmi szempontból és egyszer a szerveren biztonsági okok miatt, persze kicsit máshogy.
A keresők nem érdekelnek, ez nem olyan weboldal, hogy minél nagyobb nézettséget produkáljon, célközönségnek szól akik tudják hol az oldal.
Erre én azt kérdezem vissza, miért nem szűrhet a kliens? Miért kell újra "hátramenni" a szerverhez a szűrt adatokért? Egyszer átadom a teljes táblázat adatait, majd ha a user a szűrésre kattint, akkor mindenféle szerver kommunikáció nélkül ott a kliens gépen végrehajtja a szűrést. Az ajax kérés ideje valóban kisebb lesz mintha a kliens végzi el pl js-ben a szűrést (persze ehhez hozzátartozik az adattömb megfelelő struktúrája)? Az ajax kérésnél mindig ott van a hálózat akadozás lehetősége, míg a második esetben csak olyan vis major dolgok jöhetnek közbe ami csak és kizárólag a kliens gépe miatt következik be.
nem tudom teljesen 100%-san
Itt is csak mérni kell. Mit nyersz azzal, ha minden lenn van a kliensen? És mit nyersz azzal, ha a listát mindig szerveroldalon generálod? Például jóval egyszerűbb lesz a program, könnyebb lesz a karbantartása és a fejlesztés.
Egyébként én már úgy dolgozom, hogy nem nagyon gondolkodok előre, hanem megírom úgy a programot, ahogyan jólesik, így gyorsan elkészül. Aztán ahogy használják, folyamatosan figyelem, és annak megfelelően csiszolok rajta.
Igen, az adatmennyiség
Nem tervezel?
Pedig kéne
Ezzel együtt persze ki lehet mondani (és kell is), hogy az oldal csak az x.y.z verziónál újabb böngészőket támogatja, de ez még nem jelenti önmagában azt, hogy mekkora RAM / CPU van a vasban.
Ahogy fentebb is írták, sok
- Mekkora a számítási igény a megjelenítésnél (pl adatok rendezése, svg készítés, stb.)?
- A számítási igényt elbírja-e egy átlag gép a célközönségedben minden erőlködés nélkül?
- Mennyire elavult az átlag böngésző a célközönségedben?
- Mennyire szokott gondot okozni az oldal karbantartása?
Talán még ezen felül is vannak szempontok, nekem most nem jut több eszembe. Talán annyi a lényeg, hogyha a klienst nagyon megdolgoztatod, akkor belassul az oldal, és rontani fogja a felhasználói élményt. Ha viszont erős a kliens és naprakész a böngésző, akkor a szervert tehermentesítheted, ha nagy a forgalom, és nehezen bírja.
Technikailag nagyon sokféle megoldás van.
Lehet HTML-t küldeni, ahogy írod, lehet JSON-al valami adatot küldeni, amit aztán átalakít HTML-re egy arra specifikus js kód, pl berakja egy sablonba. Itt az adat szempontjából van olyan módszer, hogy a model-nek megfelelő adatot küldöd el, és pl a sorba rendezés ilyesmi is a kliensen történik, vagy van olyan, hogy a viewmodel-t küldöd el, és a kliens tényleg csak annyit tesz, hogy sablonba illeszti. Lehet hypermedia-t is küldeni pl JSON-LD-vel, amit egy általános js kód alakít át HTML-re, amihez nem feltétlenül kell hozzányúlni, ha módosítasz valamit az adaton szemben az előző változattal.
Lehet websocket-et is használni AJAX helyett vagy mellett, hogyha realtime közeli kapcsolat kell, pl chatnél. Lehet webworker-t használni ha külön szálra akarsz tenni valami számításigényes dolgot, és nem akarod, hogy belassítsa az eredeti oldalt.
Vannak single page appok, amiknél az egész oldalt js kód hozza létre, van progressive enhancement, aminél js nélkül is megy az alap oldal simán HTML-el, a js csak extra funkciókat ad hozzá. Ilyesmik.
Mindennek van valamekkora előnye, és hátránya is, és érdemes a feladathoz eszközt választani. Ha pl csak annyi a szempont, hogy egy kis szeletét az oldalnak frissítsd újratöltés nélkül, akkor bőven elég a HTML fragmentet elküldeni.