まず第一に、私はこの質問で取り上げられているリクエスト/レスポンスプロセス全体には興味がありません
ブラウザでレンダリングされたページを取得するためにブラウザのアドレスバーにURLを入力することから完了するプロセスは何ですか?
サーバーからhtml応答を受け取ったら、ブラウザー内で何が起こっているのか知りたいのですが。この質問をする目的は、クライアント側のスクリプトの内部の詳細を理解することです。また、Webブラウザの構成要素を抽象的な概念で説明できると便利です。 CSSエンジン、JavaScriptエンジンなどと呼ぶことができます。目的は、私が行っているWeb開発を正確に視覚化することです。
残念ながら、この問題に対処するWebリソースは見つかりませんでした。これらの概念を説明するリソースがそこにある場合はご容赦ください。この質問で答えるのが難しすぎる場合は、リソース(本など)を参照してください。
以下の手順を実行すると、リクエストのライフサイクルとレスポンスのレンダリング方法が明確になります。
お好みのブラウザのアドレスバーにURLを入力します。
ブラウザはURLを解析して、プロトコル、ホスト、ポート、パスを見つけます。
HTTPリクエストを形成します(おそらくプロトコルでした)
ホストに到達するには、まず人間が読めるホストをIP番号に変換する必要があります。これは、ホストでDNSルックアップを実行することによって行われます。
次に、指定したポート(ほとんどの場合、ポート80)で、ユーザーのコンピューターからそのIP番号へのソケットを開く必要があります。
接続が開かれると、HTTP要求がホストに送信されます。ホストは、指定されたポートでリッスンするように構成されたサーバーソフトウェア(ほとんどの場合Apache)に要求を転送します。
サーバーはリクエストを検査し(ほとんどの場合パスのみ)、リクエストの処理に必要なサーバープラグインを起動します(使用するサーバー言語、PHP、Java、.NET、Pythonに対応していますか?)
プラグインは完全なリクエストにアクセスし、HTTP応答の準備を開始します。
応答を作成するために、データベースに(ほとんどの場合)アクセスします。リクエストのパス(またはデータ)のパラメータに基づいて、データベース検索が行われます
データベースからのデータは、プラグインが追加することを決定した他の情報とともに、長いテキスト文字列(おそらくHTML)に結合されます。
プラグインはそのデータをいくつかのメタデータ(HTTPヘッダーの形式)と組み合わせ、HTTP応答をブラウザーに送信します。
ブラウザは応答を受け取り、応答内のHTML(95%の確率で壊れている)を解析します
DOMツリーは壊れたHTMLから構築されます
新しい要求は、HTMLソース(通常、画像、スタイルシート、JavaScriptファイル)で見つかった新しいリソースごとにサーバーに対して行われます。
手順3に戻り、リソースごとに繰り返します。
スタイルシートが解析され、それぞれのレンダリング情報がDOMツリーの対応するノードに添付されます
JavaScriptが解析および実行され、DOMノードが移動され、それに応じてスタイル情報が更新されます
ブラウザはDOMツリーと各ノードのスタイル情報に従って画面にページをレンダリングします
画面にページが表示されます
プロセス全体が遅すぎたといらいらします。
これについては、MozillaのDavid Baronによる優れた講演で詳しく説明されています。これは Faster HTML and CSS:Layout Engine Internals for Web Developers というタイトルのビデオであり、DOMツリーを画面にレンダリングする5つのステップを案内します。
ページのレンダリングプロセスについて詳しく説明します。 OPが質問で尋ねたように、私は要求/応答プロセスに焦点を合わせていないことに注意してください。
サーバーがリソース(HTML、CSS、JS、画像など)をブラウザーに提供すると、以下のプロセスが実行されます。
解析-HTML、CSS、JS
Rendering-DOMツリーの構築→Render Tree→Render Treeのレイアウト→Render Treeのペイント
Webブラウザの内部構造は何ですか?
上記のポイントで説明されているページレンダリングプロセスを理解するには、Webブラウザの構造も理解する必要があります。
ユーザーインターフェース:ユーザーインターフェースには、アドレスバー、戻る/進むボタン、ブックマークメニューなどが含まれます。要求されたページを表示するウィンドウを除く、ブラウザのすべての部分が表示されます。
ブラウザエンジン:ブラウザエンジンは、UIとレンダリングエンジン間のアクションをマーシャリングします。
レンダリングエンジン:レンダリングエンジンは、要求されたコンテンツの表示を担当します。たとえば、要求されたコンテンツがHTMLの場合、レンダリングエンジンはHTMLとCSSを解析し、解析されたコンテンツを画面に表示します。
Networking:ネットワーキングは、プラットフォームに依存しないインターフェースの背後にある異なるプラットフォームの異なる実装を使用して、HTTPリクエストなどのネットワークコールを処理します。
I backend: UIバックエンドは、コンボボックスやウィンドウなどの基本的なウィジェットを描画するために使用されます。このバックエンドは、プラットフォーム固有ではない一般的なインターフェースを公開します。その下では、オペレーティングシステムのユーザーインターフェイスメソッドが使用されます。
JavaScript engine: JavaScriptエンジンは、JavaScriptコードの解析と実行に使用されます。
データストレージ:データストレージは永続化レイヤーです。ブラウザは、Cookieなどのあらゆる種類のデータをローカルに保存する必要がある場合があります。ブラウザは、localStorage、IndexedDB、WebSQL、FileSystemなどのストレージメカニズムもサポートしています。
注:
レンダリングプロセス中、グラフィカルコンピューティングレイヤーは、汎用CPUまたはグラフィカルプロセッサGPUも使用できます。グラフィカルレンダリング計算にGPUを使用すると、グラフィカルソフトウェアレイヤーがタスクを複数の部分に分割するため、レンダリングプロセスに必要な浮動小数点計算にGPUの大規模な並列処理を利用できます。
役立つリンク:
1。 https://github.com/alex/what-happens-when
2。 https://codeburst.io/how-browsers-work-6350a4234634