* 实际过程模拟
- 用户输入网址(一般前后端分离的项目NG定位的都是
index.html
),浏览器向服务器发出请求,服务器返回html
文件; - 浏览器开始载入
html
代码,读取到<head>
标签内有一个<link>
标签引用外部CSS
文件; - 发出下载
CSS
文档的请求,服务器响应; - 继续载入
html
中<body>
部分的代码,用已有的CSS
进行DOM结构构建; - 假设页面引用了一张
<img>
,向服务器发出下载请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码; - 服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此执行重排。
- 文件尾部,引入了一个
<script>
标签,执行其中的立即执行的脚本; - JS脚本执行了
style.display=”none”
,假设为隐藏某个<div>`,隐藏该内容。 - 直到遇到
</html>
,表示执行完了此次的页面加载渲染过程 - 此时,假设用户点击页面的“换肤”按钮,JS让浏览器换了一下
<link>
标签的CSS
路径,也就是执行了脚本中那部分交互逻辑; - 浏览器检查各个元素,重新渲染页面。
* 流程分析
- 浏览器下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的。
- 在渲染到页面的某一部分时,其上面的所有部分都已经下载完成(并不是说所有相关联的元素都已经下载完)。
- 如果遇到语义解释性的标签嵌入文件(JS脚本,CSS样式),那么此时IE的下载过程会启用单独连接进行下载。
- 并且在下载后进行解析,解析过程中,停止页面所有往下元素的下载。(阻塞下载)
- 样式表在下载完成后,将和以前下载的所有样式表一起进行解析,解析完成后,将对此前所有元素(含以前已经渲染的)重新进行渲染。.
- JS、CSS中如有重定义,后定义函数将覆盖前定义函数。
* JS的加载
- 不能并行下载和解析(阻塞下载)
- 当引用了JS的时候,浏览器发送1个js request就会一直等待该request的返回。因为浏览器需要1个稳定的DOM树结构,而JS中很有可能有代码直接改变了DOM树结构,比如使用 document.write 或 appendChild,甚至是直接使用的location.href进行跳转,浏览器为了防止出现JS修改DOM树,需要重新构建DOM树的情况,所以 就会阻塞其他的下载和呈现。