23. Feb 2023Frontend

Optimalizace aplikací React SPA v benchmarkových nástrojích II.

Přináším vám druhou část tipů, jak optimalizovat SPA (single page apps) založené (nejen) na frameworku React. Pomoct zlepšit výkonnost a tím i skóre v benchmarkingových nástrojích. V tomhle dílu se podíváme na dynamické importy, odstraňování nepoužívaného kódu, refaktoring nebo Nginx Pagespeed.

Ján CvenčekFrontend Develooper

Uvedené tipy jsme aplikovali na apku React vytvořenou pomocí CRA (Create React App), která používá webpack v4. CRA má předkonfigurováno několik technik

pro lepší výkonnost a rychlost aplikace. Pokud chcete upravit konfiguraci webpacku v CRA bez provedení příkazu eject, musíte použít knihovny,

například craco nebo customize-cra. Produkční build aplikace se zobrazuje pomocí webového serveru Nginx.

Stejně jako v první části, kde jsem se věnoval hlavně kompresi souborů, webovým fontům a CSS, jsem pro měření výkonnosti a rychlosti použil nástroje:

Ve výstupech z nástrojů najdete navrhovaná řešení, jak jednotlivé problémy odstranit.

ℹ Níže uvedené postupy nejsou jediné, a tedy pro některé z nich existuje alternativa k řešení reportovaných problémů z nástrojů.

Dynamické importy

Dynamické importování modulů umožňuje, aby byl příslušný soubor *.chunk.js

prohlížečem dotažen až ve chvíli, kdy je potřeba. Důsledkem toho je:

  • menší velikost výsledného balíčku
  • víc souborů .js, tzv. chunků – modul zaobalující ucelenou funkcionalitu
  • rychlejší načítání stránek – stahuje se jen to, co je potřeba

Webpack v4 podporuje dynamické importy s využitím SplitChunksPlugin. Také CRA podporuje code splitting. Importy lze pojmenovat, měnit strategii načítání, prioritizovat load aj. přes parametry zapsané jako komentáře.

React.lazy

Umožňuje pro routy lazy loading komponent, které se mají na dané route renderovat. Je možné je upravovat prostřednictvím parametrů přes zmíněné komentáře.

Příklad importu

Odstranění nepoužívaného kódu, redukce velikosti balíčku

K nalezení nepoužívaného kódu/assetů můžete použít např. nástroj deadfile.

Pro analýzu velikosti jednotlivých balíčků JS jsou k dispozici:

Podle výstupu zkuste zmenšit velké balíčky, např. reactjs, lodash, momentjs, chartjs... Pokud existuje vhodná alternativa (preact, lodash-es, just...) s menší velikostí → nahraďte ji. Pomoct může i způsob importu, kdy se namísto importu celého modulu importuje pouze požadovaná funkcionalita, např.:

⚠ Prioritou je zachování funkčnosti před menší velikostí balíčku! ⚠

Lazy load elementů

Existuje několik knihoven, které pomáhají s lazy načítáním elementům, jako je <img>, <picture>, iframe, video, audio aj. Pomáhají taky s alokováním místa

v layoutu pro nerenderované elementy, s responzivností, dotahují obsah

do scroll kontejnerů podle potřeby atd. Jejich implementace je na uvážení vývojáře s ohledem na výkonnostní přínos pro aplikaci. V případě potřeby implementace z uvedených funkcionalit je možné použít:

Refaktoring

Pro dosažení lepšího výsledku v auditovacích nástrojích je často nutný refaktoring samotné aplikace nebo její části. Problémová místa v aplikaci nejsnáze najde programátor, který aplikaci zná do hloubky. Při refaktoringu

a hledání problémových míst v aplikaci můžou pomoct následující odkazy:

Nginx Pagespeed

PageSpeed je open-source serverový modul pro servery Nginx a Apache

od společnosti Google, který pomáhá optimalizovat web. Modul implementuje mnoho výkonnostních doporučení ze stránky Google PageSpeed Insights.

Zlepšuje latenci webových stránek tím, že mění zdroje na stránce tak,

aby odpovídaly osvědčeným postupům z hlediska výkonu webu.

  • Optimalizace obrázků – komprese, převod do formátu WebP (pro podporující prohlížeče), změna velikosti obrázků
  • Minimalizuje HTML
  • Minimalizuje a slučuje CSS, JavaScript
  • Optimalizuje ukládání souborů do paměti cache
  • Zkombinuje externí JavaScript a optimalizuje ho
  • Optimalizuje načítání souborů

Příklad konfigurace‍

/etc/nginx/pagespeed.conf

ℹKonfigurace byla nastavena na Docker image hitko/nginx-pagespeed s kompresí Brotli

Ján CvenčekFrontend Develooper