1. 浏览器对地址栏的地址进行解析。
2. 对解析出的地址进行DNS解析,找到地址对应的ip地址。现在浏览器缓存中查找,没有的话去系统缓存中查找,否则去host文件中查看,都没有的话向DNS服务器发起请求。
3. 通过ip地址找到目标服务器的地址。
4. 进行tcp三次握手,进行tcp连接。
5 tcp连接成功后,客户端发送请求,等待服务器的响应。
6. 服务器作出响应,浏览器接受数据,渲染页面。
浏览器解析到渲染页面的过程
1. 解析html文件,自上而下地解析,先是头部,后是body。
2. 当解析到头部css外链时,同步下载,css不会阻塞html的解析,但是会阻塞渲染,css下载解析才会进行构建render树;如果遇到普通js外链,会阻塞html解析,此时会等到js脚本下载解析执行完才会继续解析html,但是如果脚本设置defer或者async属性后,脚本会异步下载(下载过程不会阻塞html的解析)但是他两也是有区别的,区别在与脚本的执行期,defer在下载完成之后并不会立即执行,而会在所有元素解析完成之后,DOMContentLoaded事件之前触发执行;而async在异步下载完成之后就会立即执行,执行过程会阻塞html的解析,等执行完成之后,html继续解析。
3. 生成DOM树,触发DOMContentLoaded事件,等待css文件下载。
4. css下载完成,同步生成渲染树(DOM树节点+css)。
5. 渲染树构造完成,同步计算渲染树节点的布局位置。
6. 计算完布局位置,同步开始渲染。
7. DOM树构建过程中,如果遇到图片,则跳过渲染下面的内容并且下载图片内容,等待图片下载完成后,返回来渲染图片原来的位置。
8. 最终所有节点和资源都渲染完成,触发onload事件。
onloaded事件和DOMContentLoaded事件
DOMContentLoaded:html完成解析,并且DOM树构建完成后触发。
onloaded: 当一个资源(页面)及其依赖资源(html,css,js图片等资源全部下载解析完成)已完成加载时,将触发load事件。