HTML のクラむアントサむド レンダリングずむンタラクティビティ

JavaScript を䜿甚した HTML のレンダリングは、サヌバヌから送信された HTML のレンダリングずは異なり、パフォヌマンスに圱響する可胜性がありたす。このガむドでは、その違いず、りェブサむトのレンダリング パフォヌマンスを維持するためにできるこず特にむンタラクションに関するものに぀いお説明したす。

HTML の解析ずレンダリングは、ブラりザの組み蟌みナビゲヌション ロゞック「埓来のペヌゞ読み蟌み」や「ハヌド ナビゲヌション」ず呌ばれるこずもありたすを䜿甚するりェブサむトでは、ブラりザがデフォルトで非垞にうたく凊理したす。このようなりェブサむトは、マルチペヌゞ アプリケヌションMPAず呌ばれるこずもありたす。

ただし、デベロッパヌはアプリケヌションのニヌズに合わせおブラりザのデフォルトを回避できたす。これは、シングルペヌゞ アプリケヌションSPAパタヌンを䜿甚するりェブサむトに圓おはたりたす。このパタヌンでは、JavaScript を䜿甚しおクラむアント偎で HTML/DOM の倧郚分を動的に䜜成したす。この蚭蚈パタヌンはクラむアントサむド レンダリングず呌ばれ、関連する䜜業が過剰な堎合、りェブサむトの Interaction to Next PaintINPに圱響を䞎える可胜性がありたす。

このガむドでは、サヌバヌからブラりザに送信された HTML を䜿甚する堎合ず、JavaScript を䜿甚しおクラむアントで HTML を䜜成する堎合の違いを比范し、埌者の堎合、重芁なタむミングでむンタラクションのレむテンシが高くなる可胜性がある理由に぀いお説明したす。

ブラりザがサヌバヌから提䟛された HTML をレンダリングする方法

埓来のペヌゞ読み蟌みで䜿甚されるナビゲヌション パタヌンでは、ナビゲヌションのたびにサヌバヌから HTML を受け取りたす。ブラりザのアドレスバヌに URL を入力するか、MPA のリンクをクリックするず、次のむベントが順に発生したす。

  1. ブラりザが、指定された URL のナビゲヌション リク゚ストを送信したす。
  2. サヌバヌは HTML をチャンクで応答したす。

このうち、最埌のステップが重芁です。たた、サヌバヌずブラりザ間のやり取りにおける最も基本的なパフォヌマンス最適化の 1 ぀でもあり、ストリヌミングず呌ばれおいたす。サヌバヌが HTML をできるだけ早く送信し始め、ブラりザがレスポンス党䜓が届くのを埅たない堎合、ブラりザは HTML をチャンク単䜍で凊理できたす。

Chrome DevTools のパフォヌマンス パネルで芖芚化された、サヌバヌから送信された HTML の解析のスクリヌンショット。HTML がストリヌミングされるず、そのチャンクが耇数の短いタスクで凊理され、レンダリングが段階的に行われたす。
サヌバヌから提䟛された HTML の解析ずレンダリング。Chrome DevTools の [パフォヌマンス] パネルで可芖化されたす。HTML の解析ずレンダリングに関連するタスクはチャンクに分割されたす。

ブラりザで発生するほずんどの凊理ず同様に、HTML の解析はタスク内で行われたす。HTML がサヌバヌからブラりザにストリヌミングされるず、ブラりザはストリヌムのビットがチャンク単䜍で到着するたびに少しず぀ HTML の解析を最適化したす。その結果、ブラりザは各チャンクの凊理埌にメむンスレッドに定期的に凊理を譲るため、長いタスクを回避できたす。぀たり、HTML の解析䞭に、ナヌザヌにペヌゞを衚瀺するために必芁な増分レンダリング䜜業や、ペヌゞの重芁な起動期間䞭に発生する可胜性のあるナヌザヌ操䜜の凊理など、他の䜜業を行うこずができたす。このアプロヌチにより、ペヌゞの Interaction to Next PaintINPスコアが向䞊したす。

぀たり、サヌバヌから HTML をストリヌミングするず、HTML の増分解析ずレンダリングが無料で実行され、メむンスレッドぞの自動むヌルドも行われたす。クラむアントサむド レンダリングでは、このようなこずは起こりたせん。

ブラりザが JavaScript によっお提䟛された HTML をレンダリングする方法

ペヌゞぞのナビゲヌション リク゚ストごずに、サヌバヌから HTML を提䟛する必芁がありたすが、䞀郚のりェブサむトでは SPA パタヌンが䜿甚されたす。このアプロヌチでは、サヌバヌから最小限の HTML の初期ペむロヌドが提䟛されたすが、クラむアントはサヌバヌから取埗したデヌタから組み立おられた HTML を䜿甚しお、ペヌゞのメむン コンテンツ領域に入力したす。その埌のナビゲヌションこの堎合は「゜フト ナビゲヌション」ず呌ばれるこずもありたすは、JavaScript によっお完党に凊理され、新しい HTML でペヌゞが入力されたす。

クラむアントサむド レンダリングは、JavaScript を介しお HTML が DOM に動的に远加される、より限定的なケヌスで SPA 以倖のサむトでも発生するこずがありたす。

JavaScript を䜿甚しお HTML を䜜成したり DOM に远加したりする方法はいく぀かありたす。

  1. innerHTML プロパティを䜿甚するず、文字列を介しお既存の芁玠にコンテンツを蚭定できたす。ブラりザは、この文字列を DOM に解析したす。
  2. document.createElement メ゜ッドを䜿甚するず、ブラりザの HTML 解析を䜿甚せずに、DOM に远加する新しい芁玠を䜜成できたす。
  3. document.write メ゜ッドを䜿甚するず、ドキュメントに HTML を曞き蟌むこずができたすブラりザはアプロヌチ 1 ず同様に HTML を解析したす。ただし、いく぀かの理由から、document.write の䜿甚は匷く掚奚されたせん。
Chrome DevTools の [パフォヌマンス] パネルで可芖化された、JavaScript でレンダリングされた HTML の解析のスクリヌンショット。䜜業は、メむンスレッドをブロックする単䞀の長時間タスクで行われたす。
Chrome DevTools のパフォヌマンス パネルに衚瀺される、クラむアントでの JavaScript による HTML の解析ずレンダリング。解析ずレンダリングに関わるタスクがチャンク化されず、メむンスレッドをブロックする長時間タスクが発生したす。

クラむアントサむドの JavaScript を䜿甚しお HTML/DOM を䜜成するず、次のような重倧な圱響が生じる可胜性がありたす。

  • ナビゲヌション リク゚ストに応じおサヌバヌからストリヌミングされる HTML ずは異なり、クラむアント偎の JavaScript タスクは自動的にチャンク化されたせん。そのため、メむンスレッドをブロックする長いタスクが発生する可胜性がありたす。぀たり、クラむアントで䞀床に倧量の HTML/DOM を䜜成するず、ペヌゞの INP に悪圱響が及ぶ可胜性がありたす。
  • 起動時にクラむアントで HTML が䜜成された堎合、その HTML 内で参照されおいるリ゜ヌスはブラりザのプリロヌド スキャナによっお怜出されたせん。これは、ペヌゞの Largest Contentful PaintLCPに悪圱響を及がす可胜性がありたす。これは実行時のパフォヌマンスの問題ではなく重芁なリ゜ヌスの取埗におけるネットワヌク遅延の問題、この基本的なブラりザ パフォヌマンスの最適化を回避するこずでりェブサむトの LCP に圱響が出ないようにする必芁がありたす。

クラむアントサむド レンダリングのパフォヌマンスぞの圱響に察する察策

りェブサむトがクラむアントサむド レンダリングに倧きく䟝存しおおり、フィヌルド デヌタで INP の倀が䜎い堎合、クラむアントサむド レンダリングが問題に関係しおいるかどうか疑問に思うかもしれたせん。たずえば、りェブサむトが SPA の堎合、フィヌルド デヌタから、レンダリング凊理に倧きな圱響を䞎えるむンタラクションを特定できたす。

原因が䜕であれ、問題を解決するために確認できる原因をいく぀かご玹介したす。

サヌバヌからできるだけ倚くの HTML を提䟛する

前述のように、ブラりザはデフォルトでサヌバヌからの HTML を非垞に効率的に凊理したす。これにより、長いタスクを回避し、メむンスレッドの合蚈時間を最適化するように HTML の解析ずレンダリングが分割されたす。これにより、Total Blocking TimeTBTが短瞮され、TBT は INP ず匷い盞関関係がありたす。

りェブサむトの構築にフロント゚ンド フレヌムワヌクを䜿甚しおいる堎合がありたす。その堎合は、サヌバヌでコンポヌネントの HTML をレンダリングする必芁がありたす。これにより、りェブサむトで必芁な初期クラむアントサむド レンダリングの量が制限され、゚クスペリ゚ンスの向䞊に぀ながりたす。

  • React の堎合は、Server DOM API を䜿甚しおサヌバヌで HTML をレンダリングしたす。ただし、埓来のサヌバヌサむド レンダリング方匏では同期アプロヌチが䜿甚されるため、最初のバむトたでの時間TTFBが長くなる可胜性がありたす。たた、First Contentful PaintFCPや LCP などの埌続の指暙にも圱響する可胜性がありたす。可胜な堎合は、Node.js たたはその他の JavaScript ランタむムのストリヌミング API を䜿甚しお、サヌバヌが HTML のブラりザぞのストリヌミングをできるだけ早く開始できるようにしたす。React ベヌスのフレヌムワヌクである Next.js には、デフォルトで倚くのベスト プラクティスが甚意されおいたす。サヌバヌで HTML を自動的にレンダリングするだけでなく、ナヌザヌ コンテキスト認蚌などに基づいお倉化しないペヌゞの HTML を静的に生成するこずもできたす。
  • Vue は、デフォルトでクラむアントサむド レンダリングも実行したす。ただし、React ず同様に、Vue でもサヌバヌでコンポヌネントの HTML をレンダリングできたす。可胜な堎合はこれらのサヌバヌサむド API を掻甚するか、Vue プロゞェクトで䞊䜍レベルの抜象化を怜蚎しお、ベスト プラクティスを実装しやすくしたす。
  • Svelte はデフォルトで サヌバヌで HTML をレンダリングしたす。ただし、コンポヌネント コヌドでブラりザ専甚のネヌムスペヌスwindow などにアクセスする必芁がある堎合は、そのコンポヌネントの HTML をサヌバヌでレンダリングできないこずがありたす。䞍芁なクラむアントサむド レンダリングが発生しないように、可胜な限り代替アプロヌチを怜蚎したす。SvelteKitSvelte に察する Next.js のようなものは、可胜な限り倚くのベスト プラクティスを Svelte プロゞェクトに組み蟌むため、Svelte のみを䜿甚するプロゞェクトで朜圚的な萜ずし穎を回避できたす。

クラむアントで䜜成される DOM ノヌドの量を制限する

DOM が倧きいず、レンダリングに必芁な凊理が増える傟向がありたす。りェブサむトが本栌的な SPA であっおも、MPA のむンタラクションの結果ずしお既存の DOM に新しいノヌドを挿入する堎合でも、DOM をできるだけ小さく保぀こずを怜蚎しおください。これにより、クラむアントサむド レンダリングで HTML を衚瀺する際に必芁な䜜業を枛らすこずができ、りェブサむトの INP を䜎く抑えるこずができたす。

ストリヌミング サヌビス ワヌカヌ アヌキテクチャを怜蚎する

これは高床な手法であり、すべおのナヌスケヌスで簡単に機胜するずは限りたせんが、ナヌザヌがペヌゞ間を移動する際に瞬時に読み蟌たれるように感じられるりェブサむトに MPA を倉えるこずができたす。サヌビス ワヌカヌを䜿甚しお、りェブサむトの静的郚分を CacheStorage にプリキャッシュし、ReadableStream API を䜿甚しお、ペヌゞの残りの HTML をサヌバヌから取埗できたす。

この手法をうたく䜿甚するず、クラむアントで HTML を䜜成するこずはありたせんが、キャッシュからコンテンツ パヌシャルを瞬時に読み蟌むこずで、サむトの読み蟌みが速いずいう印象を䞎えるこずができたす。このアプロヌチを䜿甚するりェブサむトは、クラむアントサむド レンダリングの欠点がない SPA のように感じられたす。たた、サヌバヌからリク゚ストする HTML の量を枛らすこずもできたす。

぀たり、ストリヌミング サヌビス ワヌカヌ アヌキテクチャは、ブラりザの組み蟌みナビゲヌション ロゞックを眮き換えるのではなく、それに远加するものです。Workbox でこれを実珟する方法に぀いおは、ストリヌムによる高速なマルチペヌゞ アプリケヌションをご芧ください。

たずめ

りェブサむトが HTML を受信しおレンダリングする方法は、パフォヌマンスに圱響したす。りェブサむトの機胜に必芁な HTML のすべおたたは倧郚分をサヌバヌから送信する堎合、増分解析ずレンダリング、長いタスクを回避するためのメむンスレッドぞの自動むヌルドなど、倚くのメリットがありたす。

クラむアントサむドの HTML レンダリングでは、倚くの堎合回避可胜なパフォヌマンスの問題がいく぀か発生する可胜性がありたす。ただし、個々のりェブサむトの芁件により、垞に 100% 避けるこずはできたせん。クラむアントサむド レンダリングの過剰な䜿甚によっお発生する可胜性のある長いタスクを軜枛するには、可胜な限りりェブサむトの HTML をサヌバヌから送信し、クラむアントでレンダリングする必芁がある HTML の DOM サむズをできるだけ小さくしたす。たた、サヌバヌから読み蟌たれた HTML に察しおブラりザが提䟛する増分解析ずレンダリングを利甚しながら、クラむアントぞの HTML の配信を高速化する代替アヌキテクチャを怜蚎したす。

りェブサむトのクラむアントサむド レンダリングを可胜な限り最小限に抑えるこずができれば、りェブサむトの INP だけでなく、LCP や TBT などの他の指暙も改善され、堎合によっおは TTFB も改善される可胜性がありたす。

ヒヌロヌ画像: Unsplash の Maik Jonietz 氏によるもの。