首先,我对这个问题所涉及的整个请求-响应过程不感兴趣。
我想知道一旦浏览器接收到来自服务器的HTML响应后,内部发生了什么。我问这个问题的目的是为了理解客户端脚本的内部细节。如果您能用抽象的概念解释一个网页浏览器包括哪些组成部分,比如CSS引擎、JavaScript引擎等,那将会很有益处。目标是精确地可视化我正在进行的Web开发。
不幸的是,我没有找到任何解决此问题的网络资源。如果存在解释这些概念的资源(书籍等),请原谅我。如果这个问题太过详尽,您可以指向资源(书籍等)。
首先,我对这个问题所涉及的整个请求-响应过程不感兴趣。
我想知道一旦浏览器接收到来自服务器的HTML响应后,内部发生了什么。我问这个问题的目的是为了理解客户端脚本的内部细节。如果您能用抽象的概念解释一个网页浏览器包括哪些组成部分,比如CSS引擎、JavaScript引擎等,那将会很有益处。目标是精确地可视化我正在进行的Web开发。
不幸的是,我没有找到任何解决此问题的网络资源。如果存在解释这些概念的资源(书籍等),请原谅我。如果这个问题太过详尽,您可以指向资源(书籍等)。
请按照以下步骤操作,您将清楚了解请求的生命周期以及响应是如何呈现的。
在您喜欢的浏览器中输入URL地址。
浏览器解析URL以查找协议、主机、端口和路径。
它形成一个HTTP请求(这很可能是所使用的协议)。
为了到达主机,它首先需要将可读的主机名转换为IP地址,它通过对主机进行DNS查找来完成这个过程。
然后需要从用户计算机到该IP地址打开一个套接字,指定端口(通常是80端口)。
当连接打开时,HTTP请求被发送到主机。主机将请求转发给服务器软件(通常是Apache),该软件配置为侦听指定的端口。
服务器检查请求(通常只有路径),并启动处理请求所需的服务器插件(与您使用的服务器语言相对应,PHP、Java、.NET、Python等)。
插件可以访问完整的请求,并开始准备HTTP响应。
为构建响应,可能会访问数据库。根据请求路径(或数据)中的参数进行数据库搜索。
从数据库中获取的数据与插件决定添加的其他信息结合成为一长串文本(可能是HTML)。
插件将该数据与一些元数据(以HTTP头的形式)组合起来,将HTTP响应发送回浏览器。
浏览器接收响应并解析响应中的HTML(其中95%的概率是损坏的)。
DOM树是基于损坏的HTML构建的。
对于在HTML源中发现的每个新资源(通常是图像、样式表和JavaScript文件),都会向服务器发出新的请求。
返回步骤3,并为每个资源重复此过程。
样式表被解析,每个样式表中的渲染信息都会附加到DOM树中相应的节点上。
JavaScript被解析和执行,DOM节点会移动并相应更新样式信息。
浏览器根据DOM树和每个节点的样式信息在屏幕上呈现页面。
你在屏幕上看到了页面。
你因为整个过程太慢而感到烦恼。
<script>
标签的原因是它们可能会更改DOM,从而影响渲染结果。IE6经常会提前开始绘制,因此现代网站中会出现“跳跃”的情况。请注意,整个DOM都是从您访问的页面中读取的。Tommy所说的“DOM构建”已经在任何脚本运行之前完全构建好了。他的意思更多的是“DOM执行/解释”。另外,最好将CSS文件放在脚本之前,否则宽度/高度将不正确。 - Alexis Wilke