diff options
author | Masahiro FUJIMOTO <mfujimot@gmail.com> | 2021-08-04 10:22:00 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-04 10:22:00 +0900 |
commit | cf9a876f3e270f665cddddb2a6b75f2be64f8895 (patch) | |
tree | 0192cede03ff290a218698e51bf6304024644ead /files/ja/web/performance/how_browsers_work | |
parent | b1fdb94830bee8ed169ec9c6c20e535a7d6524fa (diff) | |
download | translated-content-cf9a876f3e270f665cddddb2a6b75f2be64f8895.tar.gz translated-content-cf9a876f3e270f665cddddb2a6b75f2be64f8895.tar.bz2 translated-content-cf9a876f3e270f665cddddb2a6b75f2be64f8895.zip |
Web/Performance 以下のいくつかの文書を更新 (#1686)
下記の文書を 2021/07/25 時点の英語版に同期更新
- Web/Performance
- Web/Performance/How_browsers_work
また、下記の文書を新規翻訳
- Web/Performance/Fundamentals
Diffstat (limited to 'files/ja/web/performance/how_browsers_work')
-rw-r--r-- | files/ja/web/performance/how_browsers_work/index.html | 82 |
1 files changed, 41 insertions, 41 deletions
diff --git a/files/ja/web/performance/how_browsers_work/index.html b/files/ja/web/performance/how_browsers_work/index.html index f936eb14a7..9483fed99b 100644 --- a/files/ja/web/performance/how_browsers_work/index.html +++ b/files/ja/web/performance/how_browsers_work/index.html @@ -1,5 +1,5 @@ --- -title: ページの生成:ブラウザーはどのように動作するか +title: 'ページの生成: ブラウザーの動作の仕組み' slug: Web/Performance/How_browsers_work tags: - Browsers @@ -15,27 +15,27 @@ tags: - render translation_of: Web/Performance/How_browsers_work --- -<p>ユーザーは、読み込みが速く、スムーズにインタラクションできるコンテンツを、ウェブで体験することを求めています。したがって、<span class="seoSummary">開発者はこれらふたつの目標を達成するために努力しなければいけません。</span></p> +<p>ユーザーは、読み込みが速く、スムーズに操作できるコンテンツを、ウェブで体験することを求めています。したがって、<span class="seoSummary">開発者はこれらふたつの目標を達成するために努力しなければいけません。</span></p> <p><span class="seoSummary">どうやって性能そして体感性能を改善するか理解するためには、ブラウザーがどのように動作するかを理解することが役に立ちます。</span></p> -<h2 id="Overview" name="Overview">概要</h2> +<h2 id="Overview">概要</h2> -<p>速いサイトはより良いユーザー体験をもたらします。ユーザーは読み込みが速く、スムーズにインタラクションできるコンテンツを体験することを求め、期待しています。</p> +<p>速いサイトはより良いユーザー体験をもたらします。ユーザーは読み込みが速く、スムーズに操作できるコンテンツを体験することを求め、期待しています。</p> <p>ウェブの性能における 2 つの主要な課題は、レイテンシーに関する諸問題と、多くの場合ブラウザーはシングルスレッドであるという事実に関する諸問題を理解することです。</p> <p>レイテンシーは、速い読み込みを実現するために克服しなければいけない一番の脅威です。読み込みを速くしようとする開発者のゴールは、リクエストされた情報をできる限り速く送信すること、または少なくともとても速いように見せることです。ネットワークのレイテンシーは、バイト情報をコンピューターまで送信するのにかかる時間のことです。ウェブの性能は、ページの読み込みを出来る限り速くするよう私たちが何をするかにかかっています。</p> -<p>多くの場合、ブラウザーはシングルスレッドだと考えられます。スムーズなインタラクションを実現しようとする開発者のゴールは、滑らかなスクロール、タッチ操作への反応など、期待通りのサイトのインタラクションを実現することです。メインスレッドが全ての処理を時間内に完了し、その上でユーザーのインタラクションを常にハンドリングできるよう保証するために、描画時間が鍵となります。ブラウザーがシングルスレッドであることによる特性を理解し、メインスレッドの責務を最小限に抑え、可能かつ適切な場合に、描画のスムーズさとインタラクションへの即時の反応を実現することで、ウェブの性能が改善されます。</p> +<p>多くの場合、ブラウザーはシングルスレッドだと考えられます。スムーズな操作を実現しようとする開発者のゴールは、滑らかなスクロール、タッチ操作への反応など、期待通りのサイトの操作を実現することです。メインスレッドが全ての処理を時間内に完了し、その上でユーザーの操作を常にハンドリングできるよう保証するために、描画時間が鍵となります。ブラウザーがシングルスレッドであることによる特性を理解し、メインスレッドの責務を最小限に抑え、可能かつ適切な場合に、描画のスムーズさと操作への即時の反応を実現することで、ウェブの性能が改善されます。</p> -<h2 id="Navigation" name="Navigation">ナビゲーション</h2> +<h2 id="Navigation">ナビゲーション</h2> <p><em>ナビゲーション</em>はウェブページを読み込むための最初の一歩です。ユーザーが URL をアドレスバーに入力したり、リンクをクリックしたり、またはフォームを送信したり、ページをリクエストするたびごとにナビゲーションが発生します。</p> <p>ウェブの性能における目標の 1 つは、ナビゲーションが完了するまでの時間を最小限にすることです。理想的な条件下において、一般的にこの時間が長すぎることはありませんが、レイテンシーと帯域幅が遅延を引き起こす邪魔者になる場合があります。</p> -<h3 id="DNS_Lookup" name="DNS_Lookup">DNS ルックアップ</h3> +<h3 id="DNS_Lookup">DNS ルックアップ</h3> <p>ウェブページへのナビゲーションの最初の一歩は、ページのアセットがどこにあるか見つけることです。<code>https://example.com</code> へアクセスする場合、その HTML のページは IP アドレスが <code>93.184.216.34</code> のサーバーに存在します。これまでに一度もそのサイトを訪れたことがなかった場合、DNS ルックアップが必要になります。</p> @@ -43,27 +43,27 @@ translation_of: Web/Performance/How_browsers_work <p>DNS ルックアップは、一般的に、1 回のページ読み込みの中でホスト名ごとに 1 回だけ必要になります。しかし、DNS ルックアップは要求されたページが参照するユニークなホストネームそれぞれに対して実行が必要です。必要なフォントや画像、スクリプト、広告、メトリクスのそれぞれが異なるホスト名を持っている場合は、それぞれに対して DNS ルックアップが必要です。</p> -<p><img alt="Mobile requests go first to the cell tower, then to a central phone company computer before being sent to the internet" src="https://mdn.mozillademos.org/files/16743/latency.jpg" style="height: 281px; width: 792px;"></p> +<p><img alt="携帯電話のリクエストは、まずセルタワーに送られ、次に電話会社の中央コンピューターに送られた後、インターネットに送信される" src="latency.jpg"></p> <p>これはとくにモバイルネットワークにおいて性能上の問題になる可能性があります。ユーザーがモバイルネットワークを利用している場合、DNS ルックアップは、権威 DNS サーバーへ到達するために、電話機から基地局へ送信される必要があります。電話機と基地局、そしてネームサーバー間の距離によって重大な遅延が発生する場合があります。</p> -<h3 id="TCP_Handshake" name="TCP_Handshake">TCP ハンドシェイク</h3> +<h3 id="TCP_Handshake">TCP ハンドシェイク</h3> <p>IP アドレスが判明すると、ブラウザーは {{glossary('TCP handshake','TCP 3 ウェイハンドシェイク')}}を通じてサーバーとのコネクションを設定します。この仕組みは、通信を意図する 2 つの主体が—この場合はブラウザーとウェブサーバーが—、データを送信する前に、多くの場合 {{glossary('HTTPS')}} を用いて、ネットワーク TCP ソケットコネクションのパラメーターを交換できるよう設計されています。</p> <p>TCP の 3 ウェイハンドシェイクは、しばしば、"SYN-SYN-ACK"、より正確には SYN、SYN-ACK、ACK と呼ばれます。これは 2 つのコンピューターの間で TCP のセッションを開始するために、TCP によって 3 つのメッセージが送受信されることを表します。つまり、これはそれぞれのサーバーの間で 3 回以上のメッセージのやりとりが必要であり、そのためのリクエストが生成されなければいけないことを意味しています。</p> -<h3 id="TLS_Negotiation" name="TLS_Negotiation">TLS ネゴシエーション</h3> +<h3 id="TLS_Negotiation">TLS ネゴシエーション</h3> <p>HTTPS によって確立される安全なコネクションでは、もう 1 つのハンドシェイクが必要です。このハンドシェイク、より正確に言うと {{glossary('TLS')}} ネゴシエーションは、通信の暗号化に使用する暗号の種類を決定し、サーバーを認証し、実際のデータ送信が始まる前に安全な通信の準備を整えます。この処理は、コンテンツのリクエストを実際に送信する前に、さらに 3 回のラウンドトリップを必要とします。</p> -<p><img alt="The DNS lookup, the TCP handshake, and 5 steps of the TLS handshake including clienthello, serverhello and certificate, clientkey and finished for both server and client." src="https://mdn.mozillademos.org/files/16746/ssl.jpg" style="height: 412px; width: 729px;"></p> +<p><img alt="DNS ルックアップ、TCP ハンドシェイク、そして TLS ハンドシェイクの 5 つのステップ (clienthello、serverhello、証明書、clientkey、サーバーとクライアントの両方の完了)。" src="ssl.jpg"></p> <p>通信を安全にするためにページ読み込みの時間が追加されますが、ブラウザーとサーバーの間で送信されるデータが第三者に解読されないという安全な通信は、レイテンシーに見合う価値があるものです。</p> <p>8 回のラウンドトリップを経て、ブラウザーはようやくリクエストを送ることができます。</p> -<h2 id="Response" name="Response">レスポンス</h2> +<h2 id="Response">レスポンス</h2> <p>ウェブサーバーへのコネクションが確立されると、ブラウザーはユーザーに代わって最初の <a href="/ja/docs/Web/HTTP/Methods">HTTP <code>GET</code> リクエスト</a>を送信します。ウェブサイトであれば、多くの場合その対象は HTML ファイルです。リクエストを受け取ったサーバーは、適当なレスポンスヘッダーと HTML のコンテンツを返します。</p> @@ -89,21 +89,21 @@ translation_of: Web/Performance/How_browsers_work <p>上記のサンプルコードでは、リクエストされたコンテンツは明らかに 14kB より小さいですが、後述するように、リンクされたリソースは、ブラウザーのパース処理がそのリンクにたどり着くまでリクエストされることはありません。</p> -<h3 id="TCP_Slow_Start_14kb_rule" name="TCP_Slow_Start_14kb_rule">TCP スロースタート / 14kB ルール</h3> +<h3 id="TCP_Slow_Start_14kb_rule">TCP スロースタート / 14kB ルール</h3> <p>最初の応答パケットは 14kB になります。これは、{{glossary('TCP slow start','TCP スロースタート')}}の一部で、ネットワークコネクションの速度を制御するアルゴリズムの影響です。スロースタートは、ネットワークの最大の帯域幅が確定するまで徐々に送信するデータ量が増やします。</p> <p>{{glossary('TCP slow start','TCP スロースタート')}}において、サーバーは最初のパケットを受信した後、次のパケットのサイズを 28kB に倍増させます。さらに後続のパケットについて事前に決めた上限に達するか、ネットワークの輻輳を検知するまでサイズを増やします。</p> -<p><img alt="TCP slow start" src="https://mdn.mozillademos.org/files/16754/congestioncontrol.jpg" style="height: 412px; width: 729px;"></p> +<p><img alt="TCP スロースタート" src="congestioncontrol.jpg"></p> <p>最初のページ読み込みに関する 14kB ルールを聞いたことがあった場合、それは TCP スロースタートが理由です。そしてこれはウェブの性能の最適化が最初の 14kB にフォーカスする理由でもあります。TCP スロースタートは、ネットワークの輻輳を防ぎ、ネットワーク性能に対して適正なデータ転送速度を徐々に探り出します。</p> -<h3 id="Congestion_control" name="Congestion_control">輻輳制御</h3> +<h3 id="Congestion_control">輻輳制御</h3> <p>サーバーが TCP パケットとしてデータを送信する一方で、ユーザー側のクライアントは確認応答、ACK を返してデータが配送されたことを確認します。コネクションには、ハードウェアやネットワークの条件によって許容量上の制限があります。サーバーが大きすぎるパケットを速すぎる速度で送信した場合、破棄されるでしょう。つまり、確認応答がない場合があるということです。サーバーはこれを missing ACK として処理します。輻輳制御アルゴリズムは、パケットを送信して確認応答を受け取るこのフローを使って送信レート (send rate) を決定します。</p> -<h2 id="Parsing" name="Parsing">パース処理</h2> +<h2 id="Parsing">パース処理</h2> <p>データの最初のかたまりを受け取ると、ブラウザーは受信した情報のパース処理を始めることができます。{{glossary('speculative parsing', 'パース処理')}}は、ネットワークから受信したデータを {{glossary('DOM')}} と {{glossary('CSSOM')}} に変換するステップです。DOM と CSSOM は、レンダラーがページを画面へ描画するために利用されます。</p> @@ -111,7 +111,7 @@ translation_of: Web/Performance/How_browsers_work <p>ブラウザーは、リクエストしたページの HTML が最初の 14kB のパケットより大きかった場合でも、手元にあるデータに基づいてパース処理を開始し、サイトを描画しようとします。これは、ウェブの性能を最適化する時にに、ブラウザーがページの描画を始めるために必要なすべてのデータ、あるいは少なくともページのテンプレート (最初の描画に必要となる CSS と HTML) を最初の 14kB に含めることが重要となる理由です。何か 1 つでも画面に描画を行うには、その前に HTML と CSS、JavaScript がパースされなければいけません。</p> -<h3 id="Building_the_DOM_tree" name="Building_the_DOM_tree">DOM ツリーの構築</h3> +<h3 id="Building_the_DOM_tree">DOM ツリーの構築</h3> <p><a href="/ja/docs/Web/Performance/Critical_rendering_path">クリティカルレンダリングパス</a>の 5 つのステップを説明します。</p> @@ -119,11 +119,11 @@ translation_of: Web/Performance/How_browsers_work <p>DOM ツリーはドキュメントのコンテンツを表します。<code><a href="/ja/docs/Web/HTML/Element/html"><html></a></code> 要素は最初のタグであり、ドキュメントツリーのルートノードとなります。ツリーには、異なるタグ同士の関係と階層構造が反映されます。他のタグの中にネストされたタグは子要素となります。DOM ノードの数が増えるほど、DOM ツリーの構築にかかる時間は長くなります。</p> -<p><img alt="The DOM tree for our sample code, showing all the nodes, including text nodes." src="https://mdn.mozillademos.org/files/16759/DOM.gif" style="height: 689px; width: 754px;"></p> +<p><img alt="サンプルコードの DOM ツリーで、テキストノードを含むすべてのノードが表示されています。" src="dom.gif"></p> <p>パーサーが画像のようなノンブロッキングリソースを発見した場合、ブラウザーはそのリソースをリクエストし、そのままパース処理を継続します。CSS ファイルに遭遇した場合もパース処理を継続できます、しかし <code><a href="/ja/docs/Web/JavaScript/Reference/Statements/async_function">async</a></code> または <code>defer</code> 属性がない <code><script></code> タグはレンダリングをブロックし、HTML のパース処理を停止します。ブラウザーのプリロードスキャナーがブロックの時間を減らしますが、それでも過度のスクリプトの使用は重大なボトルネックになり得ます。</p> -<h3 id="Preload_scanner" name="Preload_scanner">プリロードスキャナー</h3> +<h3 id="Preload_scanner">プリロードスキャナー</h3> <p>ブラウザーが DOM ツリーを構築する間はそのプロセスがメインスレッドを占有します。その間に<em>プリロードスキャナー</em>が処理可能なコンテンツをパースし、CSS や JavaScript、ウェブフォントのような優先度の高いリソースのリクエストを行います。プリロードスキャナーのおかげで、リクエストするべき外部リソースへの参照をパーサーが見つけるのを待たなくて良くなります。バックグラウンドでリソースを取得するため、メインの HTML パーサーが該当のアセットにたどり着いた時には、すでにそれらのリソースが転送中あるいはダウンロード済みになっています。プリロードスキャナーによる最適化によりブロッキングを減らすることができます。</p> @@ -137,7 +137,7 @@ translation_of: Web/Performance/How_browsers_work <p>CSS の取得は HTML のパース処理あるいはダウンロードをブロックしません。しかし JavaScript の実行をブロックします。その理由は、しばしば JavaScript が CSS プロパティの要素への影響を問い合わせるために使われるからです。</p> -<h3 id="Building_the_CSSOM" name="Building_the_CSSOM">CSSOM の構築</h3> +<h3 id="Building_the_CSSOM">CSSOM の構築</h3> <p>クリティカルレンダリングパスの 2 つめのステップは CSS を処理して CSSOM ツリーを構築することです。CSS のオブジェクトモデルは DOM によく似ています。DOM と CSSOM はどちらもツリー構造です。この 2 つは独立したデータ構造を持ちます。ブラウザーは、CSS のルールをブラウザーが理解できるスタイルのマップに変換します。ブラウザーは CSS のルールセットを読み取り、CSS セレクターにもとづいて、親、子、兄弟の関係から構成されるノードのツリーを生成します。</p> @@ -147,23 +147,23 @@ translation_of: Web/Performance/How_browsers_work <p>CSSOM の構築はとても高速であるため、現在の開発者ツールはそれ自体をユニークな色で表示しません。その代わりに、開発者ツールの「スタイルの再計算」は、CSS を解析して CSSOM ツリーを構築し、再帰的にスタイルを計算するトータルの時間を表示します。ウェブの性能の最適化の観点から言うと、CSSOM を生成するトータルの時間は一般的に1回の DNS ルックアップにかかる時間よりも少ないため、それほどの苦労はないと言えます。</p> -<h3 id="Other_Processes" name="Other_Processes">その他の処理</h3> +<h3 id="Other_Processes">その他の処理</h3> -<h4 id="JavaScript_Compilation" name="JavaScript_Compilation">JavaScript のコンパイル</h4> +<h4 id="JavaScript_Compilation">JavaScript のコンパイル</h4> <p>CSS がパースされ、CSSOM が生成される間、JavaScript ファイルを含む他のアセットが(プリロードスキャナーによって)ダウンロードされます。JavaScript は、インタープリターに処理され、コンパイル、パース処理を経て実行されます。スクリプトはパース処理によって抽象構文木に変換されます。いくつかのブラウザーエンジンは、{{glossary('Abstract Syntax Tree', '抽象構文木')}}をインタープリターへ引き渡し、メインスレッドで実行されるバイトコードを出力します。これが JavaScript のコンパイル処理に当たります。</p> -<h4 id="Building_the_Accessibility_Tree" name="Building_the_Accessibility_Tree">アクセシビリティツリーの構築</h4> +<h4 id="Building_the_Accessibility_Tree">アクセシビリティツリーの構築</h4> <p>ブラウザーはコンテンツを理解し翻訳する補助機器で使用される<a href="/ja/docs/Learn/Accessibility">アクセシビリティ</a>ツリーも構築します。アクセシビリティオブジェクトモデル (AOM) は補助機器向けの DOM のようなものです。ブラウザーは、DOM が更新されるとアクセシビリティツリーも更新します。アクセシビリティツリーは補助機能それ自体からは変更できません。</p> <p>AOM が構築されるまで、<a href="/ja/docs/Web/Accessibility/ARIA/ARIA_Screen_Reader_Implementors_Guide">スクリーンリーダー</a>でコンテンツにアクセスできません。</p> -<h2 id="Render" name="Render">レンダリング</h2> +<h2 id="Render">レンダリング</h2> -<p>レンダリングのステップは、スタイル、レイアウト、ペイント、そしてコンポジットで構成されます。パースのステップで作成された CSSOM と DOM のツリーはレンダーツリーの形式へと組み合わされ、すべてのビジュアル要素のレイアウトを計算するために使用されてスクリーンに描画されます。いくつかのケースでは、CPU の代わりに GPU を使用してスクリーンの一部を描画し、メインスレッドを解放してパフォーマンスを改善するために、コンテンツ自身をレイヤーに昇格し、コンポジットを行います。</p> +<p>レンダリングのステップは、スタイル、レイアウト、描画、そして合成で構成されます。パースのステップで作成された CSSOM と DOM のツリーはレンダーツリーの形式へと組み合わされ、すべてのビジュアル要素のレイアウトを計算するために使用されてスクリーンに描画されます。いくつかのケースでは、CPU の代わりに GPU を使用してスクリーンの一部を描画し、メインスレッドを解放してパフォーマンスを改善するために、コンテンツ自身をレイヤーに昇格し、合成を行います。</p> -<h3 id="Style" name="Style">スタイル</h3> +<h3 id="Style">スタイル</h3> <p>クリティカルレンダリングパスの 3 番目のステップは DOM と CSSOM をレンダーツリーの形式へと組み合わせることです。計算されたスタイルのツリー、あるいはレンダーツリー、の構築は DOM ツリーのルートからスタートし、目に見える (Visible) ノードをトラバースします。</p> @@ -171,45 +171,45 @@ translation_of: Web/Performance/How_browsers_work <p>それぞれの目に見えるノードには、CSSOM のルールが適用されます。レンダーツリーはすべての目に見えるノードをコンテンツと計算されたスタイルを合わせて保持します。すべての関連するスタイルと DOM 上の目に見えるノードをマッチングし、<a href="/ja/docs/Web/CSS/Cascade">CSS カスケード</a>に基づいて、それぞれのノードに対応する計算されたスタイルを決定します。</p> -<h3 id="Layout" name="Layout">レイアウト</h3> +<h3 id="Layout">レイアウト</h3> -<p>クリティカルレンダリングパスの 4 番目のステップは各ノードの平面状の位置を計算するためにレイアウト処理を実行することです。<em>レイアウト</em>はレンダーツリーに含まれるすべてのノードの幅と高さ、位置を決める処理です。さらにページ上のそれぞれオブジェクトのサイズと位置を決定します。<em>リフロー</em>は、続いて発生するドキュメント全体、あるいはページの一部分のサイズと位置を決める処理です。</p> +<p>クリティカルレンダリングパスの 4 番目のステップは各ノードの平面状の位置を計算するためにレイアウト処理を実行することです。<em>レイアウト</em>はレンダーツリーに含まれるすべてのノードの幅と高さ、位置を決める処理です。さらにページ上のそれぞれオブジェクトのサイズと位置を決定します。<em>再フロー</em>は、続いて発生するドキュメント全体、あるいはページの一部分のサイズと位置を決める処理です。</p> <p>レンダーツリーが構築されるとすぐにレイアウトが始まります。レンダーツリーは計算されたスタイルを踏まえてどのノードが表示されるか (非表示であっても) 特定しますが、寸法や位置は特定しません。各オブジェクトの正確なサイズと位置を決めるために、ブラウザーがレンダーツリーのルートからトラバースを行います。</p> <p>ウェブページ上では、ほとんどすべての要素はボックスです。異なるデバイス、異なるデスクトップの設定は、ビューポートのサイズの数が無制限に存在することを示しています。このフェーズにおいて、ビューポートのサイズを考慮して、ブラウザーはすべての異なるボックスのスクリーン上の寸法を決定します。ビューポートのサイズを基本として、レイアウトは一般的にボディからスタートし、すべてのボディの子孫をそれぞれの要素のボックスモデルプロパティに合わせてレイアウトし、画像のように寸法がわからない代替要素のためのプレースホルダースペースを作成します。</p> -<p>ノードのサイズとポジションが決められる最初のタイミングをレイアウトと呼びます。続いて発生するノードのサイズと位置の再計算をリフロー呼びます。私たちの例では、画像が返される前に最初のレイアウトが発生すると考えられます。画像のサイズを宣言していなかったため、画像のサイズがわかるとすぐにリフローが発生します。</p> +<p>ノードのサイズとポジションが決められる最初のタイミングをレイアウトと呼びます。続いて発生するノードのサイズと位置の再計算を再フロー呼びます。私たちの例では、画像が返される前に最初のレイアウトが発生すると考えられます。画像のサイズを宣言していなかったため、画像のサイズがわかるとすぐに再フローが発生します。</p> -<h3 id="Paint" name="Paint">ペイント</h3> +<h3 id="Paint">描画</h3> -<p>クリティカルレンダリングパスの最後のステップは個別のノードをスクリーンにペイントすることです。最初に発生するペイントを <a href="/ja/docs/Glossary/first_meaningful_paint">first meaningful paint</a> と呼びます。ペイントまたはラスタライゼーションのフェーズにおいて、ブラウザーはレイアウトフェーズで計算されたそれぞれのボックスをスクリーン上の実際のピクセルに変換します。ペイントは、テキスト、色、ボーダー、シャドウ、ボタンや画像のような置換要素を含む、要素のすべての視覚的な部分をスクリーンに描くことを含みます。ブラウザーはこれを超高速で実行する必要があります。</p> +<p>クリティカルレンダリングパスの最後のステップは個別のノードをスクリーンに描画することです。最初に発生する描画を <a href="/ja/docs/Glossary/first_meaningful_paint">first meaningful paint</a> と呼びます。描画またはラスタライズのフェーズにおいて、ブラウザーはレイアウトフェーズで計算されたそれぞれのボックスをスクリーン上の実際のピクセルに変換します。描画は、テキスト、色、境界、シャドウ、ボタンや画像のような置換要素を含む、要素のすべての視覚的な部分をスクリーンに描くことを含みます。ブラウザーはこれを超高速で実行する必要があります。</p> -<p>スムーズなスクロールとアニメーションを実現するために、スタイルの計算やリフロー、ペイントなどメインスレッドを占有するすべての処理は、16.67ms 未満で完了する必要があります。2048 x 1536 の解像度を持つ iPad は 3,145,000 を超えるピクセルを持っています。それら大量のピクセルは高速にペイントされなければいけません。2回目以降のペイントを最初のペイントより高速にするため、スクリーンへの描画は一般的に複数のレイヤーに分解されます。この場合にコンポジットが必要になります。</p> +<p>スムーズなスクロールとアニメーションを実現するために、スタイルの計算や再フロー、描画などメインスレッドを占有するすべての処理は、16.67ms 未満で完了する必要があります。2048 x 1536 の解像度を持つ iPad は 3,145,000 を超えるピクセルを持っています。それら大量のピクセルは高速に描画されなければいけません。2回目以降の描画を最初の描画より高速にするため、スクリーンへの描画は一般的に複数のレイヤーに分解されます。この場合に合成が必要になります。</p> -<p>ペイントはペイントツリー内の要素をレイヤーに分解します。コンテンツを GPU (CPU 上のメインスレッドの代わりになる) 上のレイヤーに昇格させることで、ペイントと再ペイントのパフォーマンスを向上します。<code><a href="/ja/docs/Web/HTML/Element/video"><video></a></code> や<code><a href="/ja/docs/Web/HTML/Element/canvas"><canvas></a></code>など、レイヤーを生成する特定のプロパティと要素があります。<a href="/ja/docs/Web/CSS/opacity"><code>opacity</code></a>、3D <code><a href="/ja/docs/Web/CSS/transform">transform</a></code>、<code><a href="/ja/docs/Web/CSS/will-change">will-change</a></code>、その他いくつかの CSS プロパティを持つ要素も同様です。これらのノードは、その子孫が上記の理由でそれ自身のレイヤーを必要とするのでなければ、子孫と一緒に自身のレイヤー上に描画されます。</p> +<p>描画は描画ツリー内の要素をレイヤーに分解します。コンテンツを GPU (CPU 上のメインスレッドの代わりになる) 上のレイヤーに昇格させることで、描画と再描画のパフォーマンスを向上します。<code><a href="/ja/docs/Web/HTML/Element/video"><video></a></code> や<code><a href="/ja/docs/Web/HTML/Element/canvas"><canvas></a></code>など、レイヤーを生成する特定のプロパティと要素があります。<a href="/ja/docs/Web/CSS/opacity"><code>opacity</code></a>、3D <code><a href="/ja/docs/Web/CSS/transform">transform</a></code>、<code><a href="/ja/docs/Web/CSS/will-change">will-change</a></code>、その他いくつかの CSS プロパティを持つ要素も同様です。これらのノードは、その子孫が上記の理由でそれ自身のレイヤーを必要とするのでなければ、子孫と一緒に自身のレイヤー上に描画されます。</p> <p>レイヤーはパフォーマンスを改善しますが、メモリー管理の面ではコストのかかる処理です。そのため、ウェブのパフォーマンス最適化戦略の中で濫用するべきものではありません。</p> -<h3 id="Compositing" name="Compositing">コンポジット</h3> +<h3 id="Compositing">合成</h3> -<p>ドキュメントのセクションが異なるレイヤーに描画されて重なり合う場合、コンテンツをスクリーン上に正しい順番で描画するためにコンポジットが必要になります。</p> +<p>ドキュメントのセクションが異なるレイヤーに描画されて重なり合う場合、コンテンツをスクリーン上に正しい順番で描画するために合成が必要になります。</p> -<p>ページがアセットの読み込みを続ける間もリフローは発生します (後ほど出てくる図を見てください)。リフローは再ペイントと再コンポジットを引き起こします。画像のサイズを指定していた場合リフローは必要ありません。再ペイントが必要なレイヤーのみが再ペイントされ、必要があればコンポジットが行われます。しかし、私たちのサンプルでは画像のサイズを指定しませんでした。画像がサーバーから取得されたとき、レンダリングプロセスはレイアウトステップまで戻り、そこから再開します。</p> +<p>ページがアセットの読み込みを続ける間も再フローは発生します (後ほど出てくる図を見てください)。再フローは再描画と再合成を引き起こします。画像のサイズを指定していた場合再フローは必要ありません。再描画が必要なレイヤーのみが再描画され、必要があれば合成が行われます。しかし、私たちのサンプルでは画像のサイズを指定しませんでした。画像がサーバーから取得されたとき、レンダリングプロセスはレイアウトステップまで戻り、そこから再開します。</p> -<h2 id="Interactivity" name="Interactivity">インタラクティビティ</h2> +<h2 id="Interactivity">操作可能性</h2> -<p>メインスレッドがページのペイントを完了したら「これで終わり」と思うかもしれません。しかし、必ずしもそうとは言えません。読み込み処理が、遅延された <code><a href="/ja/docs/Web/API/GlobalEventHandlers/onload">onload</a></code> イベントの発火により実行される JavaScript を含む場合、メインスレッドがビジー状態となりスクロールやタッチ、その他のインタラクションができない場合があります。</p> +<p>メインスレッドがページの描画を完了したら「これで終わり」と思うかもしれません。しかし、必ずしもそうとは言えません。読み込み処理が、遅延された <code><a href="/ja/docs/Web/API/GlobalEventHandlers/onload">onload</a></code> イベントの発行により実行される JavaScript を含む場合、メインスレッドがビジー状態となりスクロールやタッチ、その他の操作ができない場合があります。</p> -<p>{{glossary('Time to Interactive')}} (TTI) は、DNS ルックアップと SSL コネクション を始める最初のリクエストからページがインタラクティブになるまでどのくらい時間がかかったかを示す測定値です。インタラクティブであるとは、ページがユーザーのインタラクションに 50ms 以内に応答する {{glossary('First Contentful Paint')}} の後の時点を言います。メインスレッドがパース処理、コンパイル、JavaScript の実行に占有されている場合、ユーザーのインタラクションにタイムリーに (50ms より早く) 応答することができません。</p> +<p>{{glossary('Time to Interactive')}} (TTI) は、DNS ルックアップと SSL コネクション を始める最初のリクエストからページが操作可能になるまでどのくらい時間がかかったかを示す測定値です。操作可能であるとは、ページがユーザーの操作に 50ms 以内に応答する {{glossary('First Contentful Paint')}} の後の時点を言います。メインスレッドがパース処理、コンパイル、JavaScript の実行に占有されている場合、ユーザーの操作にタイムリーに (50ms より早く) 応答することができません。</p> <p>以下の例では、画像の読み込みは高速かもしれませんが、<code>anotherscript.js</code> ファイルが 2MB あり、しかもユーザーのネットワークは低速です。このケースでは、ユーザーはページのコンテンツをすぐに見ることができるかもしれませんが、スクリプトがダウンロードされるまでスクロールを実行できない可能性があります。これは良いユーザー体験とは言えません。この WebPageTest の例からわかるように、メインスレッドを占有することは避けなければいけません。</p> -<p><img alt="The main thread is occupied by the downloading, parsing and execution of a javascript file - over a fast connection" src="https://mdn.mozillademos.org/files/16760/visa_network.png" style="height: 699px; width: 1200px;"></p> +<p><img alt="メインスレッドは javascript ファイルのダウンロード、解析、実行で占められています (高速接続時)。" src="visa_network.png"></p> <p>この例では、DOM コンテンツの読み込みプロセスは 1.5 秒以上かかっており、メインスレッドがすべての時間を完全に占有され、クリックイベントや画面のタップに応答できなくなっています。</p> -<h2 id="See_Also" name="See_Also">関連情報</h2> +<h2 id="See_Also">関連情報</h2> <ul> <li><a href="/ja/docs/Web/Performance">ウェブパフォーマンス</a></li> |