性能优化相关知识
Dom渲染步骤
- 解析HTML生成DOM树
- 解析CSS生成CSSOM树
- 根据DOM树和CSSOM树构建render树
- 布局绘制render树
渲染引擎为了尽可能快地将结果显示,它会在从网络层获取文档内容的同时把已经接收到的局部展示出来
CSS和DOM解析互不影响,但是CSS会阻塞页面的渲染,原因是浏览器为了用户的体验会尽可能减少渲染次数
js如果需要操作dom的样式,那么就需要等待CSS下载,所以如果js不需要操作样式,将script标签置于link之上可能会更好
js会阻塞dom的解析,在确定脚本没必要阻塞dom的情况下,加上defer或者async属性
不过现在的浏览器会先寻找link、script、img标签,会先行下载
懒加载方案实现
- 脚本类型模块(type=“module”)在默认情况下会被延迟。
- 可以使用import()函数动态加载模块
- CSS文件应尽可能压缩简化,不必要的CSS拆分为其他文件
- 通过link标签的media媒体查询标签实现阻塞渲染优化,浏览器默认每个指定样式表都是阻塞渲染的,特定场景使用的样式将会被下载但不会阻塞,这样样式表文件会变得更小,从而减少渲染阻塞时间
- 使用<link rel=“preload”>、font-display属性或者font loading API(动态加载字体资源时的事件和接口)
- 使用
loading="lazy"属性实现iframe和img的懒加载,值得注意的是这些资源会在迫切需要加载的资源加载后才懒加载 - 交叉观察者API(Intersection Observers)
CSS性能优化
- 将动画化的节点从主线程移到GPU上,导致合成的属性包括(3D transform,animating transform opacity position:fixed will-change filter),元素video、canvas、iframe也会合成。
- 媒体查询(详见懒加载方案)
- will-change属性,通过实际更改前执行耗时的工作以提升性能
- @font-face中的font-display可以依靠这种无样式文本闪现使文本可见替代白屏提高性能
- contain属性用于指示dom中尽可能独立的部分,允许浏览器针对有限区域重新计算布局
异步渲染
vue更新dom是异步执行的。侦听到数据变化时,vue会开启一个异步更新队列,缓冲在同一事件循环中发生的所有数据变更。这有利于去除重复数据和避免不必要的计算和Dom操作
服务端渲染(待深究)
服务端直接生成html片段返回前端,方式分为两种:
- 服务器通过模板引擎直接渲染整个页面
- 服务器生成html代码块,前端通过ajax获取后js动态添加
优势:
- 有助于SEO
- 加速首屏渲染
劣势:
- 服务器压力大