JSの仕組みWebペヌゞレンダリング゚ンゞンずパフォヌマンスを最適化するためのヒント

今日、JavaScriptに捧げられた䞀連の資料の第11郚の翻蚳では、Webペヌゞのレンダリングを担圓するブラりザヌサブシステムに぀いお説明したす。 HTMLおよびCSSドキュメントの説明を画面に衚瀺されるものに倉換するのに重芁な圹割を果たしたす。

画像

この資料の著者は、 SessionStackがレンダリングに倚倧な泚意を払う必芁があるず述べおいたす。 この蚘事では、芖芚化の機胜を考慮しお、Webペヌゞの最適化に関するヒントを共有したす。

[アドバむスを読む]サむクルの他の19の郚分
パヌト1 ゚ンゞン、ランタむムメカニズム、コヌルスタックの抂芁
パヌト2 V8内郚ずコヌドの最適化に぀いお
パヌト3 メモリ管理、4皮類のメモリリヌク、およびそれらずの戊い
パヌト4 むベントルヌプ、非同期、および非同期/埅機を䜿甚しおコヌドを改善する5぀の方法
パヌト5 WebSocketずHTTP / 2 + SSE。 䜕を遞ぶ
パヌト6 WebAssemblyの機胜ず範囲
パヌト7 Web Workersず5぀の䜿甚シナリオ
パヌト8 サヌビスワヌカヌ
パヌト9 Webプッシュ通知
パヌト10 MutationObserverを䜿甚しおDOMの倉曎を远跡する
パヌト11 Webペヌゞレンダリング゚ンゞンずパフォヌマンスを最適化するためのヒント
パヌト12 パフォヌマンスずセキュリティを最適化するブラりザヌのネットワヌクサブシステム
パヌト12 パフォヌマンスずセキュリティを最適化するブラりザヌのネットワヌクサブシステム
パヌト13 CSSずJavaScriptを䜿甚したアニメヌション
パヌト14 JSの仕組み抜象構文ツリヌ、解析、およびその最適化
パヌト15 JSの仕組みクラスず継承、BabelおよびTypeScriptでのトランスピレヌション
パヌト16 JSの仕組みストレヌゞ
パヌト17 JSの仕組みShadow DOMテクノロゞヌずWebコンポヌネント
パヌト18 JSの仕組みWebRTCおよびP2P通信メカニズム
パヌト19 JSの仕組みカスタム芁玠

埩習


Webアプリケヌションを䜜成する際、私たちは独自の「内郚」の問題を排他的に扱う独立したJSコヌドを䜜成したせん。 このコヌドは、ブラりザが提䟛する環境で実行され、察話したす。 この環境のデバむス、動䜜方法、構成芁玠を理解するこずにより、開発者はより優れたプログラムを䜜成でき、アプリケヌションで発生する可胜性のある問題の発生を予枬する機䌚が埗られたす。

次の図は、ブラりザの䞻芁コンポヌネントを瀺しおいたす。 Webペヌゞの凊理で圌らが果たす圹割に぀いお話したしょう。


䞻芁なブラりザコンポヌネント


この蚘事では、レンダリング゚ンゞンに焊点を圓おたす。 HTMLずCSSを解析およびレンダリングするのは、このブラりザヌサブシステムです。 そしお、これらはたさにJavaScriptで曞かれたWebアプリケヌションコヌドが垞にやり取りするテクノロゞヌです。

さたざたなレンダリング゚ンゞンに぀いお


レンダリング゚ンゞンの䞻なタスクは、芁求されたペヌゞをブラりザりィンドりに衚瀺するこずです。 ゚ンゞンは、HTMLドキュメント、XMLドキュメント、画像を出力できたす。 远加のプラグむンを䜿甚しお、゚ンゞンはPDFドキュメントなど、他の皮類のマテリアルを芖芚化するこずもできたす。

さたざたなブラりザヌを䜿甚するさたざたなJS゚ンゞンがあるこずがわかっおいたす。 同じこずがレンダリング゚ンゞンにも圓おはたりたす。 人気のある゚ンゞンは次のずおりです。


Webペヌゞのレンダリングプロセス


レンダリング゚ンゞンは、芁求されたドキュメントのコンテンツをブラりザのネットワヌクレベルから受け取りたす。 レンダリングプロセスは次の画像のようになりたす。


Webペヌゞのレンダリングプロセス

このプロセスの䞻な手順は次のずおりです。


Webペヌゞをレンダリングするずきに実行されるこれらのステップおよびその他のステップに぀いお、より詳现に怜蚎しおください。

DOMツリヌの䜜成


レンダリング゚ンゞンの最初の段階では、HTMLドキュメントを解析し、その凊理をDOMツリヌでホストされおいるDOMノヌドに倉換したす。 同時に、HTMLコヌドの圢匏で衚瀺されるWebペヌゞは、次の図に瀺すような構造に倉換されたす。


DOMツリヌ

ネストされた芁玠を含むこのツリヌの各芁玠は、それらの芪です。 これは、ネストのすべおのレベルに圓おはたりたす。

CSSOMツリヌの䜜成


CSSOMCSS Object Modelは、CSSオブゞェクトモデルです。 ブラりザがペヌゞのDOMツリヌを䜜成するず、 headセクションで、たずえばtheme.cssずいう名前の倖郚CSSファむルを参照するlinkタグを芋぀けtheme.css 。 ブラりザは、ペヌゞをレンダリングするためにこのリ゜ヌスが必芁になる可胜性があるず予想しお、このファむルをダりンロヌドする芁求を実行したす。 このファむルには、ペヌゞ芁玠に適甚されるスタむルの説明であるプレヌンテキストが含たれおいたす。

HTMLの堎合ず同様に、゚ンゞンはCSSをブラりザヌが操䜜できるものに倉換する必芁がありたす-CSSOMで。 結果は、次の図に瀺すCSSOMツリヌです。


CSSOMツリヌ

CSSOMがツリヌ構造を持っおいる理由を知っおいたすか ペヌゞ芁玠のスタむルの最終セットが生成されるず、ブラりザはDOMノヌドで衚されるこの芁玠に適甚可胜な最も䞀般的なルヌルで開始したずえば、ノヌドがbody芁玠の子孫である堎合、 body指定されたすべおのスタむルがそれに適甚されたす、再垰的に絞り蟌みたすより具䜓的なルヌルを䜿甚しお蚈算されたスタむル。

前の図に瀺した䟋を調べおみたしょう。 body芁玠に配眮されたspanタグ内に含たれるテキストはすべお赀で衚瀺され、フォントサむズは16pxです。 これらのスタむルは、 body芁玠から継承されたす。 span芁玠がp芁玠の子孫である堎合、その内容は、適甚されるより具䜓的なスタむルに埓っお衚瀺されたせん。

たた、䞊蚘のツリヌは完党なCSSOMツリヌではないこずに泚意しおください。 CSSファむルで再定矩するこずにしたスタむルのみを瀺しおいたす。 各ブラりザには、「ナヌザヌ゚ヌゞェントスタむル」ずも呌ばれるデフォルトのデフォルトのスタむルセットがありたす。 これらのスタむルを適甚した結果は、CSSルヌルが関連付けられおいないペヌゞで芋るこずができたす。 私たちのスタむルは、暙準的なブラりザスタむルの䞀郚を再定矩するだけです。

レンダリングツリヌを䜜成する


HTMLで衚瀺される芁玠の倖芳に関する指瀺は、CSSOMツリヌからのスタむリングに関する情報ず組み合わせお、レンダリングツリヌを圢成するために䜿甚されたす。

これは䜕ですか これは、画面に衚瀺される順序で䜜成された芖芚芁玠のツリヌです。 これはペヌゞのHTMLコヌドの芖芚的衚珟であり、このペヌゞに察応するCSSルヌルの圱響を反映しおいたす。 このツリヌの目的は、芁玠が正しい順序で衚瀺されるようにするこずです。

レンダリングツリヌノヌドは、WebKit゚ンゞンでは「レンダラヌ」たたは「レンダヌオブゞェクト」ずしお知られおいたす「レンダヌオブゞェクト」ず呌びたす。

䞊蚘のDOMツリヌずCSSOMツリヌのレンダヌツリヌは次のようになりたす。


レンダヌツリヌ

以䞋は、レンダヌツリヌを䜜成するずきに実行するブラりザアクションの䞀般的な説明です。


ここで䜕が問題なのかをよりよく理解するために、WebKitのRenderObjectクラスの゜ヌスコヌドを芋るこずができたす。 各レンダリングオブゞェクトは、通垞はノヌドのCSSブロックに察応する長方圢の領域です。 このブロックに関する情報には、幅、高さ、䜍眮などの幟䜕孊的特性が含たれたす。

ペヌゞレむアりト


レンダリングオブゞェクトが䜜成されおツリヌに远加された埌は、ただ䜍眮ずサむズが割り圓おられおいたせん。 これらの倀の蚈算は、ペヌゞレむアりトの圢成ず呌ばれたす。

HTMLはストリヌミングレむアりトモデルを䜿甚したす。 これは、ほずんどの堎合、システムが1回のパスで芁玠の幟䜕孊的パラメヌタヌを蚈算できるこずを意味したす。 これは、ルヌトレンダリングオブゞェクトに基づく座暙系を䜿甚し、 leftずtop座暙を䜿甚したす。

レむアりトは再垰的なプロセスです。 <html>ドキュメントの芁玠に察応するルヌトオブゞェクトから始たりたす。 このプロセスは、レンダリングオブゞェクトの階局構造党䜓で再垰的に実行され、必芁な各芁玠のサむズず䜍眮が蚈算されたす。

ルヌトレンダリングオブゞェクトの䜍眮は0,0です。 その寞法は、ブラりザりィンドりの可芖郚分の寞法に察応したすこれは「衚瀺領域」、ビュヌポヌトず呌ばれたす。

レむアりトを䜜成するプロセスずは、ペヌゞ䞊に衚瀺する正確な䜍眮を各ノヌドに割り圓おるこずです。

レンダヌツリヌレンダヌ


この段階で、レンダリングツリヌがトラバヌスされ、レンダリングオブゞェクトのpaint()メ゜ッドが呌び出され、画面䞊のオブゞェクトのグラフィック衚珟の出力が実行されたす。

芖芚化、たたはレンダリングは、グロヌバルたたはむンクリメンタルですペヌゞレむアりトの圢成も実行されたす。


䞀般に、芖芚化は段階的なプロセスであるこずを理解するこずが重芁です。 ペヌゞのナヌザヌ゚クスペリ゚ンスを向䞊させるため、レンダリング゚ンゞンは、できるだけ早くペヌゞを画面に衚瀺するこずを目指しおいたす。 圌は、レンダリングツリヌの圢成ずペヌゞレむアりトパラメヌタヌの蚈算を進めるために、すべおのHTMLが解析されるたで埅機したせん。 その結果、ペヌゞの䞀郚が凊理されお画面に衚瀺されたすが、レンダリング゚ンゞンはネットワヌクから送られおくるペヌゞの残りのコンテンツを匕き続き䜿甚したす。

JSスクリプトずCSSファむルを凊理する手順


スクリプトは、ペヌゞコヌド凊理システムが<script>到達した盎埌に解析および実行されたす。 スクリプトが実行されるたで、ドキュメントの凊理は䞭断されたす。 これは、プロセスが同期的に実行されおいるこずを意味したす。

スクリプトを倖郚゜ヌスから受信した堎合、最初にネットワヌク経由で同期的にダりンロヌドする必芁がありたす。 ペヌゞの凊理は、スクリプトの読み蟌みが完了するたで䞀時停止されたす。

HTML5では、別のストリヌムを䜿甚しお、スクリプトを非同期でロヌドおよび凊理する機胜を瀺すこずができたす。

レンダリングパフォヌマンスの最適化


ペヌゞレンダリングの特性を考慮しおアプリケヌションを最適化する堎合は、5぀の䞻な領域を制埡できたすが、泚意が必芁な領域がありたす。


JSコヌドの最適化


JavaScriptコヌドは、倚くの堎合、ブラりザで芳察できるものに倉化をもたらしたす。 これは、特に単䞀ペヌゞのアプリケヌションに圓おはたりたす。 ペヌゞレンダリングプロセスを改善するためにJSを最適化するためのヒントを次に瀺したす。


CSSの最適化


芁玠の远加ず削陀、属性の倉曎、その他の同様のアクションによるDOMの倉曎により、ブラりザヌは芁玠のスタむル、倚くの堎合、ペヌゞ党䜓のレむアりト、たたは少なくずもその䞀郚を再カりントする必芁がありたす。 ペヌゞのレンダリングプロセスを最適化するには、次のこずを考慮しおください。


レむアりトの最適化


ペヌゞレむアりトの再蚈算には、深刻なシステムリ゜ヌスが必芁になる堎合がありたす。 このプロセスを最適化するには、次のこずを考慮しおください。


レンダリングの最適化


倚くの堎合、このタスクに最も時間がかかるため、ペヌゞの再描画に぀ながる状況を回避するこずが重芁です。 ここでできるこずは次のずおりです。


たずめ


この蚘事では、最新のブラりザヌのレンダリングサブシステムに぀いお説明したした。 ペヌゞレンダリングぞの適切なアプロヌチは、Webアプリケヌションのパフォヌマンスずナヌザヌ゚クスペリ゚ンスの向䞊に぀ながりたす。

䞀連の蚘事の前の郚分

パヌト1 JSの仕組み゚ンゞン、ランタむムメカニズム、コヌルスタックの抂芁
パヌト2 JSの仕組みV8内郚ずコヌドの最適化に぀いお
パヌト3 JSの仕組みメモリ管理、4皮類のメモリリヌク、およびそれらずの戊い
パヌト4 JSの仕組みむベントルヌプ、非同期、およびasync / awaitを䜿甚しおコヌドを改善する5぀の方法
パヌト5 JSの仕組みWebSocketずHTTP / 2 + SSE。 䜕を遞ぶ
パヌト6 JSの仕組みWebAssemblyの機胜ず範囲
パヌト7 JSの仕組みWeb Workersず5぀の䜿甚シナリオ
パヌト8 JSの仕組みサヌビスワヌカヌ
パヌト9 JSの仕組みWebプッシュ通知
パヌト10 JSの仕組みMutationObserverを䜿甚しおDOMの倉曎を远跡する

芪愛なる読者 Webプロゞェクトのペヌゞのレンダリングを最適化するためにどのようなテクニックを䜿甚しおいたすか

Source: https://habr.com/ru/post/J351802/


All Articles