页面加载原理的应用
load 事件和 DOMContentLoaded 事件的区别
前置
CSS文件下载 不阻塞DOM树的构建与解析。但是因为浏览器是根据渲染树生成最终页面,而渲染树是由DOM树与CSSOM树合并而成,那么CSS文件的下载与解析将 阻塞 页面的渲染。阻塞式
JS文件(即blocking JS files, 除了具有async或defer属性的 外联 脚本以外的其他形式脚本)因可能存在查询DOM树的语句,那么它一定 阻塞DOM树的解析构建进程。async或defer属性只对外联脚本生效。JS 下载执行的优先级高于
DOM树的解析生成是出于避免DOM树的构建冲突,并且 一次性(可与CSSOM的下载构建优先级高于 JS 脚本执行做对比。) 构建出DOM树的目的。阻塞式
JS脚本执行之前,其中可能包含查询CSSOM的语句,那么阻塞式JS脚本执行一定是在CSSOM下载并完成构建之后。阻塞式脚本文件对于
DOM与CSSOM是不同的优先级,这是浏览器的实现,即可理解为DOM < blocking JS和CSSOM > blocking JS,但DOM与CSSOM二者之间不具有可比性。
那么始终有:
CSS加载不阻塞DOM树的解析构建CSS加载阻塞渲染树的解析构建,即阻塞渲染进程CSS加载阻塞其后的阻塞式 JS 文件的执行。
注:现代浏览器实现了并发预加载外部依赖,即当 DOM 树解析器被阻塞时,浏览器会识别该阻塞脚本的后续外部依赖进行预加载。但是,后续外部依赖的执行顺序依然是按照原始 DOM 树的结构执行。
在 HTTP 1.0/1.1 的情况下,Chrome 浏览器 最大同域并发数 为 6。若将部分依赖部署于其他子域时,可扩大当前页面的并发请求为 N*6。
因为 HTTP 2 协议建立的单个 TCP 通道实现了并行请求(多路复用链接),而不再是原始的串行请求,那么此时最大同域并发数不再是 6(further reading: HTTP 协议)。
Load 事件
load 事件(触发时机:HTML5 whatwg 和 W3C 5.3 草案 )表示当前页面的 全部 依赖资源加载完时成才会触发事件,包括图片、视频等一切依赖。
DOMContentLoaded 事件
DOMContentLoaded(触发时机:HTML5 whatwg 和 W3C 5.3 草案 )表示在 DOM 树建立完成后就会触发,无需等待样式表(MDN和 JS 高程 p390)、图像等外部资源加载完成。
值得注意的是,当 HTML 中包含阻塞式 JS 脚本时,DOMContentLoaded 需要等到 HTML 中阻塞式脚本执行完成后触发,而阻塞式脚本执行的时机 一定 是在 CSSOM 构建完成之后。
当
HTML中不存在阻塞式脚本时,那么DOMContentLoaded在DOM树被解析构建完成时触发,而不用等待其他如CSS等依赖的下载解析完成。当
HTML中存在阻塞式脚本时,那么DOMContentLoaded一定是在 JS 脚本执行之后触发,而 JS 可能包含查询CSSOM的语句,那么阻塞式 JS 脚本必须阻塞至CSSOM构建完成之后执行(与DOM的暂停解析不同,CSSOM的解析构建优先级高于阻塞式 JS 执行)。那么此时,DOMContentLoaded触发的时机一定是在CSSOM完成构建,且阻塞式脚本已经执行完成时(google web fundamentals)。
事件目标的区别
load 事件在 window 和 document 对象上触发。
DOMContentLoaded 事件在 document 对象上触发。
Reference
从输入 url 到得到 HTML 的详细过程
浏览器根据
DNS服务器(本地DNS优先级最高)得到域名的IP地址向该
IP的服务器发送请求(http或https)HTTP/HTTPS协议(My blog)
服务端接受请求,处理之后并返回请求
客户端得到服务端返回的内容