CRP(Critical rendering path) 关键渲染路径
这是一种性能优化的思想,即:了解在关键节点上会发生的一些事情,然后针对这些步骤进行优化。下面将针对各个关键节点进行对应的优化策略介绍。
关键流程:一次页面请求所发生的事情
图中1-7个点为一次页面请求的关键点,那么性能优化就可以针对这些关键的节点,进行针对性的操作:

1.url解析
这个阶段可以做的事情比较少
2.DNS解析
DNS预解析,DNS解析式需要时间的
<link rel="dns-prefetch" href="url">
3.发送请求
-
使用合适的缓存策略: 不需要缓存的资料:Catche-control:no-store; 频繁变动的资源:catch-control:no-catch,结合协商缓存在进行,Etags 不需要经常变动的代码文件,可以catch-control:max-age=315000,一个固定的时间段,结合文件的指纹处理,一旦文件发生变化就进行下载
-
使用HTTP2.0 实现了多路复用,使得多个请求可以使用同一个tcp链接
4.浏览器解析和渲染
过程:生成DOM树——CSSOM树——RanderTree
DOM树:
- 标签语义化(更加有利于浏览器的词法分析,节约时间)
- 避免多级嵌套,避免在解析的时候进行多次递归
CSSOM树: - 减少选择器层级(从右往左渲染)
div a{
}//先找到所有的a
a{
}//这个更快
-
CSS预编译器(less/sass),使用层级嵌套功能的时候需要慎重
Render树阶段 -
计算设备视口的关键位置和大小(回流/布局/重排)
-
根据页面的几何信息,得到节点的绝对像素(绘制/栅格化)
JS文件的加载:
因为Js引擎线程和浏览器渲染线程是互斥的,并且,如果在JS中进行了改变样式的操作,会同时影响到CSSOM和DOM,在这种情况下,浏览器会先下载和构建CSSOM,然后再执行JavaScript,最后在继续构建DOM(可采取措施)CSS 放在head中 js 放在底部或者async defer
预渲染和预加载
预渲染:下载好页面在后台进行预先的渲染,但是最好是保证用户一定会打开网页,不然就是浪费资源 预加载:就是预先夹杂一些后期会使用的文件资源,图片之类的
<link rel="preload" href="url" />
<linkrel="prerender" href="url" />
渲染过程中的优化(重排 重绘)
懒执行、懒加载:
- 懒执行:就是将一些现在不需要,比较但是耗时的逻辑,预先设置需要用的时候再进行加载(触发时间或者定时)
- 懒加载:先加载自己需要的内容,一般是可视区域的内容,例如:图片懒加载策略,先在src里放置占位符,真实图片资源放入到自定的属性里面,后期进入可视区域之后,将真实资源替换给src
文件优化:
图片优化:
减小图片:减少像素点,以及减少每个像素点能够显示的颜色
优化策略:
1.能不用图片就不用图片,一些小图可以用css代替就代替;
能用webP格式的就用webP格式
2.大图用jpeg
3.小图就用base64\png\svg
4.雪碧图
其他文件:
CSS 放在head中
js 放在底部或者async defer
webworker
服务端开启文件压缩功能
使用CDN加载
静态资源尽量使用 CDN 加载,
由于浏览器对于单个域名有并发请求上限,可以考虑使用多个 CDN 域名。
对于 CDN 加载静态资源需要注意 CDN 域名要与主站不同,否则每次请求都会带上主站的 Cookie
Webpack 优化项目
- 打包的时候使用production,会启用代码压缩
- 开启ES6模块来开启tree shaking可以移除没有使用的代码
- 优化图片,对于小图可以使用 base64 的方式写入文件中
- 按照路由拆分代码,实现按需加载
- 给打包出来的文件名添加哈希,实现浏览器缓存文件