Výkon webových aplikací se stal klíčovým faktorem pro uživatelskou spokojenost. Optimalizace výkonu se zaměřuje nejen na zrychlení načítání stránky, ale také na udržení plynulosti při interakci s aplikací. V dnešní době je vysoce důležité využívat správné nástroje a frameworky, které dokáží minimalizovat dobu načítání a poskytují vysoce efektivní způsob vykreslování uživatelského rozhraní. Tento text se zaměřuje na analýzu a optimalizaci procesu načítání aplikace, přičemž se soustředí na hlavní příčiny zpomalení výkonu a na novější přístupy v oblasti JavaScriptových knihoven a frameworků.
Proces načítání aplikace je komplexní a zahrnuje několik kroků. Během inicializace aplikace, při jejím zavádění nebo načítání nové stránky, se uděje několik klíčových věcí. Prvním faktorem je stahování JavaScriptu. Čím větší je velikost souboru, tím pomaleji se stahuje a tím déle trvá jeho načítání. Tento krok zahrnuje nejen samotný kód aplikace, ale i kód frameworku a třetích stran, jako jsou knihovny a další skripty.
Další fáze zahrnuje provádění JavaScriptu. Kód musí být dekomprimován, načten do paměti a následně analyzován JavaScriptovým enginem pro just-in-time (JIT) vykonávání. K tomu je potřeba nejen správně provést parsing kódu, ale i spojit DOM elementy a rámcové hooky. Tento proces může být výrazně zpožděn, pokud kód není optimalizován pro rychlé vykonávání.
Následně přichází fáze "hydrace" aplikace. Framework musí vypočítat stav aplikace, což zahrnuje jak vizuální, tak datové aspekty. Také je nutné připojit event listenery k DOM elementům a vykreslit obsah. Tento krok je nezbytný, aby aplikace fungovala správně, ale může být časově náročný při větších aplikacích.
Dalším krokem je detekce změn. Framework musí prozkoumat strom komponent, aby určil, zda by mělo dojít k aktualizaci uživatelského rozhraní v případě změny stavu. Tento proces je opět závislý na velikosti aplikace a počtu komponent, které je třeba kontrolovat.
Hlavními příčinami zpomalení výkonu velkých webových aplikací jsou tedy výše uvedené kroky. V současnosti je nemožné se těmto problémům vyhnout, neboť jsou součástí základního fungování SPA frameworků, jako je Angular, React nebo Vue. Řešením těchto problémů je často nutnost přizpůsobení chování frameworku pomocí vlastních zásahů do životního cyklu komponent.
Moderní minimalistické JavaScriptové knihovny, jako je ArrowJS, nabízejí možnost vyvinout výkonné a reaktivní aplikace s minimálním kódem. ArrowJS umožňuje vytvářet aplikace s necelými 2 kB kódu, což dramaticky zlepšuje výkon a zjednodušuje vývoj. Používá takové nástroje jako WeakMap, Proxy, Set a Tagged template literals, které společně umožňují efektivní správu stavu aplikace a reaktivní vykreslování.
Na druhé straně Qwik.js, vytvořený zakladatelem Angularu Miškou Heverym, přináší nový přístup k výkonu webových aplikací. Qwik.js je postaven na principu "resumability", což znamená, že aplikace je připravena k vykreslení již po počátečním stažení HTML, čímž se výrazně zkracuje čas potřebný pro vykreslení stránky. Qwik využívá minimální velikost knihovny (~1 kB), ale přesto nabízí bohatou sadu funkcí pro vývoj aplikací. Tento přístup eliminuje potřebu hydrace, což znamená, že aplikace je připravena na interaktivitu ihned po jejím načtení, bez čekání na vykonání složitých JavaScriptových operací.
Dalším důležitým nástrojem pro zajištění výkonu je server-side rendering (SSR). SSR umožňuje vykreslit aplikaci na straně serveru, což znamená, že stránka je připravena jako HTML, které může být rychle načteno do prohlížeče. Tento přístup výrazně zlepšuje výkon na zařízeních s nízkým výpočetním výkonem nebo pomalým připojením k internetu. Server je schopný vykonat tuto úlohu efektivně bez ohledu na hardware uživatele, což je zvláště důležité na mobilních zařízeních nebo starších počítačích.
Dále, SSR zjednodušuje indexování webových stránek vyhledávači, což pozitivně ovlivňuje SEO (Search Engine Optimization). Když server již poskytuje vykreslený obsah, vyhledávače mohou snadněji procházet stránku a indexovat její obsah, což vede k lepšímu umístění ve výsledcích vyhledávání.
Pro optimalizaci výkonu v Angularu existují konkrétní techniky, jako je zjednodušení životního cyklu komponent, minimalizace počtu změnových detekcí a efektivní využívání lazy loadingu pro načítání kódu pouze při potřebě. To umožňuje snížit množství JavaScriptového kódu, který je potřeba stáhnout a provést, což zlepšuje dobu načítání a celkový výkon aplikace.
Všechny tyto techniky a přístupy k optimalizaci výkonu jsou navrženy tak, aby vyřešily problém zpomalení webových aplikací a poskytly uživatelům plynulé a rychlé zážitky při interakci s aplikacemi.
Jak optimalizovat výkon Angular aplikace pomocí SSR, Hydratace a dalších technik
Pokud se rozhodnete začlenit SSR (Server-Side Rendering) do vaší Angular aplikace, nejlepší je začít s tímto procesem co nejdříve. Tímto způsobem můžete postupně řešit a testovat možné problémy s konfigurací, což je méně riskantní než přidávat SSR později, když aplikace roste. K vytvoření nového projektu s SSR můžete použít následující příkazy:
nebo
Pokud chcete přidat SSR do již existujícího projektu, použijte:
Po načtení všech prostředků a inicializaci SPA (Single Page Application) je aplikace připravena na plnou interaktivitu, ale musí přejít z statického stavu do dynamického. Tento přechod může být často pro uživatele rušivý. V tomto kontextu je nezbytné použít hydrataci, jak jsme se již dozvěděli v případě Qwik. Hydratace zajišťuje plynulý přechod z doby, kdy aplikace není interaktivní, na dobu, kdy je plně funkční a připravena reagovat na akce uživatele.
Pokud používáte FlexLayout, pro aktivaci SSR konfigurace je nutné do aplikace přidat modul FlexLayoutServerModule. Tento krok zajistí, že rozvržení aplikace bude správně fungovat jak na straně serveru, tak na straně klienta. Další detaily lze najít na oficiálním GitHubu Angular Flex Layout zde.
Dalším nezbytným krokem je zavedení klientské hydratace, kterou umožníte přidáním provideru v AppComponent:
Díky klientské hydrataci může vaše SPA znovu použít již vykreslené struktury DOM na straně serveru, stav aplikace, stáhnutá data a další procesy pro plynulý přechod do plně interaktivní podoby. Více o využívání SSR a hydratace v Angularu lze najít na oficiálních stránkách zde a zde.
Další technologií, kterou lze implementovat pro zlepšení výkonu, je App Shell. Tento koncept je podobný SSR, ale místo toho, aby server vykreslil stránku, můžete přede-renderovat stránku nebo trasu již během build procesu. To znamená, že uživatelé mohou mít statický zážitek z přistání na stránce nebo při lenivém načítání velkých modulů a následně přejít na interaktivní stav, jakmile jsou připraveny všechny zdroje. Tento proces je jednoduchý na implementaci, ale může být nutné některé aspekty landing pages upravit pro kompatibilitu s před-renderováním.
Pokud máte problém s termínem dodání projektu a stále potřebujete řešení pro optimalizaci načítání, můžete zvážit přidání App Shell do vašeho projektu pomocí příkazu:
App shells jsou také velmi užitečné pro aplikace, které potřebují pracovat offline. Další informace o app shells najdete na této stránce.
Kromě toho, abyste aplikaci učinili nativními aplikacemi, můžete využít Service Workers. Tato technologie vám umožňuje přidat funkce Progressive Web Apps (PWA), jako je podpora offline režimu, push notifikace nebo synchronizace dat na pozadí. Spuštění těchto úkolů v samostatném vláknu uvolňuje hlavní vlákno pro vykreslování a interaktivitu uživatele. Přidání podpory pro PWA do vaší aplikace lze provést pomocí následujícího příkazu:
Pro složitější scénáře můžete zvážit použití Workbox od Google, což je sada knihoven a nástrojů pro service workery, která je často používaná ve firemních aplikacích. Další podrobnosti o Workbox naleznete zde.
Dále, pokud máte problémy s výkonem v Angular aplikacích, které mají velký rozsah, může být řešením RxAngular, což je nástroj, který řeší výkonnostní problémy u velkých Angular aplikací. Tento nástroj poskytuje kompletní sadu nástrojů pro zpracování plně reaktivních aplikací v Angularu, přičemž se zaměřuje především na výkon během běhu aplikace a vykreslování šablon.
Defaultní proces detekce změn v Angularu může být výpočetně náročný, což může způsobit, že se celé části aplikace přerenderují, i když to není potřeba. V případě velkých aplikací může být tento proces problémem, zejména pokud se časté změny ve stavu aplikace přenášejí na více komponent. Pro omezení této zátěže můžete využít OnPush strategii detekce změn, která zakáže automatickou detekci změn, dokud ji manuálně neaktivujete.
Pokud chcete ještě více optimalizovat detekci změn, můžete použít direktivy a pipy z RxAngular, jako například RxLet, RxFor a RxIf, které umožňují Angularu detekovat změny pouze v případě, že se změní specifikované observables. Tento přístup šetří značné množství výpočetního výkonu, protože se neprovádí celkové zpracování změn, ale pouze těch, které se skutečně týkají uživatele.
Pokud máte již existující velkou Angular aplikaci a není možné ji přepsat, RxAngular může být vaší jedinou cestou k řešení problémů s výkonem.
Endtext

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский