Hello. My name is Nick and I'm a front-end developer (liquid applause). In addition to writing code, I teach at the hh.ru School of Programmers.
The recordings of our lectures from the 2018-2019 academic year can be viewed on youtube
This year I had a lecture on optimizing frontend performance and decided to convert it to text format. The material turned out to be large, since the lecture was 3 hours long. Therefore, we got a text almanac.
Here is a presentation for those who are reluctant to read longread, but want to have a basic understanding of the content.
Longread can be used as a reference, so as not to read in one sitting. Here's a list of the topics we'll cover:
- Why think about performance
- FMP, TTI + read more in the report
- Critical render path, DOM, CSSOM, RenderTree
- Steps to improve first boot performance + more in the report
. , layout, repaint, composite . : https://habr.com/ru/company/hh/blog/517594/
?
0.1 β gap, , , \.
, , \\ , " ". , ( windows) - . . , , , ", , ".
. - ( ) , . : β ", . .
0.1 ? , " ".
β30 seconds to mars β hurricaneβ. - 9:30. , .
1 β . - . 1 β . , .
, : , , , , , ( ), , . β .
1 β , , .
10 β , " " : 30 . 5 1/6 . 10 β .
β 1 10 . β , β , .. ? . . , , , , , 2007, . .
β , . , ..
:
- Walmart: 1 + 2%
- Amazon: 0,1 1%
- - ( , )
, .
lighthouse hh.ru. β β ( mobile, desktop ):
:
- ?
- ?
" ".
: " β β . β β . .
3 :
- ( html )
- ( ..)
- SPA β
, . : FMP (First Meaningful Paint) TTI (Time to interactive), , :
: FMP == , (, ). TTI == . , , .
FMP\TTI , , ++. , .
β FMP. , " " , . C ( ) FMP , Critical render path. Critical render path β , , , , . β html, css ( - ), .
Critical render path , ?
TL&DR;
- (DNS resolve, TCP ..);
- HTML-;
- HTML ;
- DOM tree (document object model);
- . CSS, JS ( );
- CSS- ( JS-);
- CSSOM tree;
- JS-. layout, js reflow;
- DOM tree ( );
- Render tree;
- (layout β paint β Composite).
:
:
Request
, DNS, IP, TCP , .. , .
Response
, , . , :
, , text/html, "navigate" ( ServiceWorker) html DOM.
, :
DOM
DOM
. :
. , .
html . CSS, JS , DOM, ( css preload + rel stylesheet). , JS, .
, , . , , . , head, , . DOM :
CSSOM
, meta title style ( link). DOM, CSS, , CSS. :
(head) CSSOM , . , .
CSSOM , RenderTree.
RenderTree
.
, . , head, . :
, . ? DevTools βDOM". , , DevTools DOM , RenderTree.
:
Elements. "" . , , , ..
RenderTree, β Layout β Paint β Composite . .
Layout β Paint β Composite , . .
, FMP TTI?
TL&DR;
1) :
1.1) . js, css. , .
1.2) , ( !)
1.3) third-party
1.4)
2) HTTP2.0 / HTTP3.0:
2.1)
2.2)
2.3) Server push
3) Brotli
4) , ETag + Service worker
:
. JS
2 : .
β , . . loadable-components react-imported-component vue .. , .
:
- JS
- .
. , , ββ ββ. .
:
1: β ,
, (index.html), 2 : Common.JS
+ applicant+index.JS
, /applicant 4 . . HTTP2.0.
:
+: ,
+: ,
-: . HTTP2.0.
2: :
, , , . , . 1 ? Chrome.
+:
-: , HTTP2.0
-: , 1 . Service worker. .
, .
3: :
+: . JS + Common.JS
-: unused JS
-: , .
, .
- 1: , common:
. , . , 2 : Common.JS Index.JS . , Dropdown.JS Graph.JS .
, .
. TTI . JS, . ? JS .
. 30 JS , 30
JS , , - , .
, JS , , , .
, JS , .
. CSS
FMP, CSS.
react\vue\angular, , . , react- :
import './styles.css'
, JS- CSS, . common.css
, applicant-page.css
applicant+employer.css
.
CSS , used-styles : "optimising css delivery". kashey :)
, hh.ru lighthouse:
, , .
. , . , .
, . CSS, . CSS, , popup-, JS , , rel=stylesheet
JS , prefetch
onload
.
, FMP. , , .
third-party
hh . !
? -10 7 β third-party.
?
- , FMP.
- ( , popup- ) β "" . ,
requestIdleCallback
. , .
FMP, TTI - . third-part .
TTI. , - , , , . :
HTTP2.0
HTTP2.0 , .
HTTP2.0
, HTTP2.0 .
, 6 , , . JS. , HTML:
:
- : . .
, TCP handshake . , - .
β CSS \ JS β β .
?
HTTP :
, . .
HTTP2.0
. , HPACK :
:
- β
- β
Huffman coding. .
HTTP2.0 Server push
server push . . : html , - , - css, - - JS.
(nginx):
location = /index.html {
http2_push /style.css;
http2_push /bundle.JS;
http2_push /image.jpg;
}
, :
. , -. - , nginx, http2_push .
hh.ru gzip . 736 657. 12%.
Brotli "" . , gzip. nginx , , . . gzip.
Brotli β ! - 3G , , lighthouse.
: lighthouse, . FMP, TTI.
, Service Worker.
, 3 :
- last-modified expires
- ETag
- Cache-control
(last-modified expires) , ETag β , , 304 . , . Nginx :
location ~* ^.+\.(js|css)$ {
...
etag on;
}
Disk cache dev tools:
Cache-control β , . , cache-control: no-cache, html , . max-age, . , Cache-control:
cache-control: max-age=315360000, public
( ), . , , ..
, , v8
:
" " : cold\warm hot run. , hot run, . .
, hot run, ( ) 72 . β warm run, .
hot run, Service Worker. :
- Service Worker;
- Service worker fetch;
- fetch , ;
- .
hot run . , .
:
self.addEventListener('fetch', function(event) {
// ,
if (event.request.url.indexOf(staticHost) !== -1 && event.request.url.search(/\.(svg|png|jpeg|jpg|gif)/) === -1) {
return event.respondWith(
//
caches.match(event.request).then(function(response) {
if (response) {
return response;
}
// , , cacheStatic
return fetch(event.request).then(function(response) {
caches.open(cacheStatic).then(function(cache) {
cache.add(event.request.url);
});
return response;
});
})
);
}
});
Critical render path ( , DNS, handshake, ..). , , . ( ..)/ : , , , .
, .
: , . , chrome 85 content-visibility
, .