Appearance
解析和渲染
URL 解析
特殊字符编码
请求地址如果出现非 Unicode 编码内容,现代浏览器会默认进行编码。 (IE编码成 gb2312 格式,火狐编码成 utf-8 格式,可以使用 encodeURI 或 encodeURIComponent 进行统一的编码处理)
基于 encodeURI 编码,整个URL中的特殊字符都会自动编码。
https://www.baidu.com:443/index.html?from=微信=>https://www.baidu.com:443/index.html?from=%E5%BE%AE%E4%BF%A1基于 encodeURIComponent 编码,相对于 encodeURI 来说,不会给整个URI编码,而是 给URL部分信息编码。
https://www.baidu.com:443/index.html?from=127.0.0.0.1:8080=>http%3A%2F%2Fbaidu.com%3A443%2Findex.html%3Ffrom%3D127.0.0.0.1%3A8080jsvar set1 = ";,/?:@&=+$"; // 保留字符 var set2 = "-_.!~*'()"; // 不转义字符 var set3 = "#"; // 数字标志 var set4 = "ABC abc 123"; // 字母数字字符和空格 console.log(encodeURI(set1)); // ;,/?:@&=+$ console.log(encodeURI(set2)); // -_.!~*'() console.log(encodeURI(set3)); // # console.log(encodeURI(set4)); // ABC%20abc%20123 (空格被编码为 %20) console.log(encodeURIComponent(set1)); // %3B%2C%2F%3F%3A%40%26%3D%2B%24 console.log(encodeURIComponent(set2)); // -_.!~*'() console.log(encodeURIComponent(set3)); // %23 console.log(encodeURIComponent(set4)); // ABC%20abc%20123 (空格被编码为 %20)escape / unescape 编码,已废弃,一般只用于客户端页面之间自己的处理,例如页面跳转传参的 中文信息进行编码,客户端的 cookie 信息是中文用这种方式编码
缓存检查
Service Worker
Memory Cache 内存缓存
主要是页面中已经抓取到的资源,如 css、js、图片等,虽然读取高效,但时效短,关闭页面后,也 就释放了。
Disk Cache 硬盘缓存
读取速度比内存缓存慢,但胜在容量和时效性上。
Push Cache 推送缓存
当上面三种缓存都没命中时,才被使用,只在会话中存在,并且缓存时间也很短,Chrome 中只有五分钟左右。
DNS 域名解析:将域名地址解析为 ip 地址
IP 寻址,排队等待,最多只能发送 6 个 HTTP 请求。
代理 TCP复用
和服务器建立TCP连接,如果是 HTTPS,会进行 SSL 协商。
发送HTTP(S)请求(请求行 请求头 空行 请求体)
响应 HTTP(S)请求(响应行 响应头 空行 响应体)
如果是重定向状态码,进行重定向操作。jd.com => https://www.jd.com
如果是协商缓存,本地进行缓存查找。
浏览器渲染服务器返回的内容
浏览器无法直接使用 HTML,需要将 HTML => Tokens => DOM 树。
浏览器无法解析纯文本的 CSS 样式,对 CSS 进行解析,解析成 styleSheets,即 CSSOM 树 (document.styleSheets)
计算出 DOM 树中每个节点的具体样式(Attachment)
CSSOM 树和 DOM 树组成渲染(布局)树,将 DOM 树中的可见节点,添加到渲染树中,并计算 节点渲染到页面的坐标位置(Layout)。
DOM树和渲染树的区别:
DOM 树与 HTML 标签一一对应,包括 head 内不会渲染输出的节点,如 link、meta、 script 和 display:none 隐藏的元素。
渲染树不包括 head 内不会渲染输出的节点和隐藏元素(opacity、visible 会出现在渲染树中)
通过渲染树,进行分层,根据定位属性、透明属性、transfrom 属性、clip 属性等 生成图层树
将不同图层进行绘制,转交给合成线程处理,最终产生页面,并显示在浏览器上 (Painting、Display)
和服务器断开TCP连接 HTTP 1.1 默认长连接
CSS 不会阻塞 HTML 解析,渲染 DOM 必须等 CSS 解析完。如果 link 放到 body 最后, 会导致二次渲染。
html
<body>
<div></div>
<link rel="stylesheet" href="./index.css">
</body>JS 会阻塞 HTML 解析,阻塞渲染。需要暂停 DOM 去执行 JS,JS 可能操作样式,因此执行前还 需要等待样式加载完。 所以 JS 要放到页面底部。
html
<body>
<div>Hello</div>
<script>
for () {
}
</script>
<div>World</div>
</body>解析 HTML 前会先执行预解析,会预加载 JS 和 CSS 等文件(并行加载)