浏览器是如何进行加载、解析、渲染的?
1.当用户访问页面时,DNS服务器(域名解析系统)会通过域名查找对应的IP地址,找到后,会向对应IP地址的网络服务器发送一个请求
2.网络服务器解析请求,并把请求发给数据库服务器
3.数据库服务器会将请求数据返回给网络服务器,网络服务器解析数据,并生产HTML文件,放入http response中,返回给浏览器
4.浏览器解析html response。
1-4 需要先了解http协议
访问服务器可能遇到的问题:
http response 404:网络服务器无法获取数据库服务器返回的资源文件
http response 500:由于并发原因暂时无法处理用户的http请求 (请求的这个页面正好是一个有异常发生的页面,或者不存在的页面)
5.浏览器解析html response后,需要下载html文件,以及html文件包含的外部引用文件,以及包含的图片或者多媒体文件
加载
加载顺序:当浏览器获得html文件后,自上而下加载,并在加载过程中解析渲染
加载是为获取资源文件的过程;不同浏览器,不同版本之间实现的效果不同(需工具timeliness测试)
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="test.css" type="text/css" />
<script src="test.js" type="text/javascript"></script>
</head>
<body>
<p>阻塞</p>
<img src="test.jpg" />
</body>
</html>
加载过程中遇到外部css文件,浏览器另外发出一个请求,来获取css文件。
遇到图片资源,浏览器也会另外发出一个请求,来获取图片资源。这是异步请求,并不会影响html文档进行加载,但是当文档加载过程中遇到js文件,html文档会挂起渲染(加载解析渲染同步)的线程,不仅要等待文档中js文件加载完毕,还要等待解析执行完毕,才可以恢复html文档的渲染线程。
原因:JS有可能会修改DOM,最为经典的document.write,这意味着,在JS执行完成前,后续所有资源的下载可能是没有必要的,这是js阻塞后续资源下载的根本原因。
办法:可以将外部引用的js文件放在前。