React, performance et -500 millisecondes au lancement - l'historique de nos optimisations en chiffres

contrĂ´ler la ligne rouge


Écartons-nous un peu du coronavirus et parlons de quelque chose de technique. Par exemple, sur la façon dont nous avons essayé d'améliorer le temps de démarrage à froid d'une application React et sur les résultats. Qui se soucie du sujet de la performance et du Web rapide dans son ensemble - s'il vous plaît, sous cat. À la fin, il y aura une petite enquête sur le prix / la nécessité de telles optimisations.


Tout d'abord, un peu de contexte. Habituellement, nous faisons différentes applications bancaires, qui ne sont généralement pas accessibles au grand public. Mais récemment, un petit miracle s'est produit et nous avons été chargés d'écrire une application publique (disons, presque publique). Parmi les exigences de base, seuls Mobile-First, React et IE ne peuvent pas être pris en charge (même 11). Parmi les fonctionnalités - une application unique (c'est-à-dire que l'utilisateur n'y va pas plus d'une fois par an) et sans données, l'application est absolument et complètement inutile. Il est inutile à tel point que nous ne pouvons même pas montrer un pied de page, car nous ne savons pas de quelle couleur le montrer et quoi y écrire du tout.


, . . Angular, , react, " ", " " . , , , " " Vue. , legacy .


. — react-router-dom, — mobx. — SCSS ( ) + css.modules . . , . "-" PureComponent React.memo, bundlesize + source-map-explorer. , .


, *. - mobile-first, client-facing, . . — . . . , , - UI . , , , + . Server Side Rendering. , , , .NET, . — .


* , ?


0,


- , , . , ( — 1000ms) Performance Audit devtools (online 4x CPU slowdown). :


  • Firts Paint (FP): 618ms
  • First Meaningful Paint (FMP): 2090ms

FP , (), FMP , UI ( ) - . , , 1000 ms (+) . , , . . — 4g* fast 3g **.


EventWIFI4GFast 3G
First Paint618ms815ms2389ms
First Contentful Paint2090ms2270ms3811ms

, 4g — 2270ms . , , , .


* 4g preset- - . — : download 4000kb/s, upload 3000kb/s, latency 20ms:
** *** , .
*** -, 3 , 10. , — , .


1, React.lazy


, . :


Index.html, React, . js — . , . , , . , .


, *, . — React.lazy, , . , lazy , , . .


:


EventWIFI4GFast 3G
FP658ms (+6%)791ms (-3%)2258ms (-5%)
FMP2135ms (+2%)2286ms ( )3725ms (-3%)

( ). , , , . ? shared , App.tsx. . , .


* , .


2, Core LazyComponent


, shared module . shared core , , — , , - .


, , , React.Lazy. "" , . , . , . : , . :


export const LazyComponent = <T extends {}>(importStatement: () => Promise<{ default: ComponentType<T> }>) => {
    const component = React.lazy(importStatement);
    return { component, load: importStatement };
};

:


EventWIFI4GFast 3G
FP487ms (-21%)570ms (-30%)1829ms (-23%)
FMP1965ms (-6%)2048ms (-10%)3468ms (-9%)

, , , 400ms fast3g - . . .


3, Spinner


, , . , ? "" ! , index.html , . index.html "" ? , . css, .


EventWIFI4GFast 3G
FP212ms (-56%)226ms (-60%)845ms (-53%)
FMP2150ms (+9%)2387ms (+17%)4593ms (+32%)

? , FP . FMP? :


// AppComponent.load();

. , .


EventWIFI4GFast 3G
FP208 (-57%)221 (-61%)782 (-57%)
FMP2002 (-2%)2065 ( )3487 ( )

, fast3g. , , , , - .


4,


. … ! , . / index.html . . . Fetch IE ( ), promise . . .


index.html :


(function(){const path = `${window.app.api}`; window.app.data = fetch(path); }());

. , promis- , , . — . , index.html .


:


EventWIFI4GFast 3G
FP245ms (+17%)219ms ( )786ms ( )
FMP1740ms (-13%)1735ms (-16%)3441ms (-1%)

. 300ms . , . , . , .


, API , . preconnect, API. Preconnect IE 11


.


5,


, ? , , . . , ?


LazyComponent ( , ), suspense, . :


EventWIFI4GFast 3G
FP262ms (+7%)387ms (+76%)1630ms (+107%)
FMP1729ms ( )1826ms (+5%)3280ms (-4%)

FP ( ). FMP . ? — - , , . , JS , index.html . :


css-delay


.


, css. - , , CSS . JS ( ). ? — . , CSS JS . , css , JS ( , ), CSS , JS .


6,


. — .


, , , . … , . ! , font-weight 100 .


, , :


  • . . . - .
  • ( 5-6 , HTTP v 1.x)
  • . , .
  • , , .

( , , JS).


. , . . , font-swap ( , ). , LightHouse .


. link/preload:


<link rel="preload" href="best_font_ever.otf" as="font" type="font/otf" crossorigin="anonymus">


EventWIFI4GFast 3G
FP136ms (-44%)201ms (-8%)666ms (-15%)
FMP1519ms (-12%)1418ms (-18%)3743ms (+8%)

, fast3g (, ). , . , . , UI - .


, :


EventWIFI4GFast 3G
FP-480ms-614ms-1700ms
FMP-570ms-852ms-68ms

500-850ms . , "" .


7,


defer (- page speed LightHouse ), , , .


, (0.5 1 - index.html) ( 480ms 1700ms), 500-800ms . , .


():



, .


, :


  1. ( )
  2. Brotli, gzip.
  3. HTTP2.0.

Jeff Cooper .


. ? . . // ( , ). - Google latency 100-400ms, 0.2%-0.6% ( ). CloudFlare , 2.4ms 3.3ms 0.4%, . . , , .


!


All Articles