[关闭]
@bornkiller 2018-11-01T08:23:46.000000Z 字数 1836 阅读 1544

前端性能优化 -- 网络传输篇 Resource Hints

性能优化


浏览器机制浅析

HTML 描述页面结构,浏览器首先会将文本标记转换成文档对象模型 DOM,增量构建 DOM tree

dom.gif-22.6kB

CSS 描述页面样式,浏览器会将样式内容转化为 CSS 对象模型 CSSOM,全量构建 CSSOM tree

cssom.png-8.6kB

CSSOM tree, DOM tree 合并成渲染树,然后计算可见元素布局,绘制,最终将像素渲染到屏幕上。

render-tree-construction.png-36.4kB

DOM 充当着 JavaScript 和页面交互的接口,脚本能够访问 DOM tree,也能修改 DOM tree,执行过程需要稳定的 DOM tree,所以会阻塞 HTML 增量解析。脚本能够访问 CSSOM,也能修改 CSSOM,执行过程需要稳定的 CSSOM tree,所以脚本执行与 CSS 处理相互阻塞,取决于相互顺序。

script.png-24.6kB

css-block.png-17.4kB

同时注意,CSS 不阻塞 DOM 的构建,但会阻塞渲染。在渲染树准备完毕之前,浏览器不会输出任何内容。

Hints

浏览器识别 HTML 标记中的资源加载标签,例如scriptlinkimage 等,会发出对应资源请求,但部分资源深藏于 CSSJavaScript 当中,如字体,图片,延迟脚本,对输出影响较大,延迟渲染时间。

以字体为例,浏览器构建渲染树,CSS rules 匹配到对应的 DOM 节点上,才能知道需要使用哪些字体资源来渲染文本。字体请求的处理将远远滞后于其他关键资源请求的处理,并且在获取资源之前,可能会阻止浏览器渲染文本,且不同浏览器之间实际行为有所差异:

处理当前页面一定用到的资源,可以使用 <link rel="preload"> 来告诉浏览器尽快地加载。标记如下:

  1. <link rel="preload" href="iconfonts.woff" as="font">

必需属性为 as,可选值包含以下:

preload 资源如果支持缓存,将会储存在 HTTP cache 之中,如果不支持缓存,储存于 Memory cache 当中,过期时间不确定。

提升加载效率之外,preload 方式不会阻塞页面解析与渲染,加载完毕后也能够立即生效,能够配合 critical css 优化。

  1. <style>
  2. <!-- Inline critical css -->
  3. </style>
  4. <link href="/stylesheet/vendor.css" rel="preload" as="style" onload="this.rel='stylesheet'">
  5. <link href="/stylesheet/main.css" rel="preload" as="style" onload="this.rel='stylesheet'">

resource hint,还包括以下指令:

  1. <link rel="prefetch" href="/asset/prefetch-cartoon-1.jpg">

注意事项

预加载机制务必注意以下事项:

联系方式

Email: hjj491229492@hotmail.com

参考文章

qrcode_for_gh_d8efb59259e2_344.jpg-8.7kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注