网站性能分数怎么提升?

127 阅读4分钟

一、技术手段

可以简单分为

(一)浏览器应用层 (图片懒加载、debounce请求等)

(二)网络层 (缓存、压缩、http并发等)

(三)服务端(怎么工程化打包、ssr等)

二、评估性能的手段

主要关注点在Peformance的LCP(Largest Contentful Paint ) 和 TTI(Time to Interactive)。

首次可交互时间: domInteractive - fetchStart

白屏时间: responseEnd - fetchStart

(一)合成模拟评估

google的dev tool 有lighthouse。使用无头浏览器模拟加载。

(二)真实数据收集评估

通过自建或者第三方监控,可以发现用户具体的访问站点情况。umijs.org/docs/max/an… Umi内置了站点统计的功能,目前支持 Google Analytics百度统计

三、浏览器应用层面

  1. 图片使用懒加载web.dev/browser-lev…
  2. js置于body底部(监控js脚本等除外)
  3. css置于head标签之中
  4. 异步请求,使用debounce\throtle

四、umi框架的实践操作

umi框架内置了许多最佳实践,主要包括webpack打包、ahooks等,我们往往只需要微调就可以配置成功。

(1)webpack打包在umi内置的

打包提速:使用一个叫MFSU方案umijs.org/blog/mfsu-i… webpack5 新特性 Module Federation 的打包提速方案。核心原理是将应用的依赖构建为一个 Module Federation 的 remote 应用,以免去应用热更新时对依赖的编译。适用场景:微前端开发。

一般不需要修改webpack,但是也是提供两种修改的方法:

umijs.org/docs/api/co…

umijs.org/docs/api/pl…

Webpack常规优化手段:

  1. codesplit (SPA项目中,根据路由切割不同的包)umijs.org/docs/api/co…
  2. treeshaking (根据代码的包引用,不额外打包未使用的模块,需要es6支持)webpack.js.org/guides/tree…

demo: 使用rollup 演示www.ruanyifeng.com/blog/2022/0…

  1. Externals(使用cdn的第三方包代替打包)

webpack.js.org/configurati…

  1. 压缩

题外话:vite基于es module的打包方案。

(2)使用Ahooks的debounce、throttle等封装好的hooks

五、其他服务端优化手段

umi没有提供SSR的功能。

简单介绍一下SSR。

服务端渲染的页面交互能力有限,如果要实现复杂交互,还是要通过引入js文件来辅助实现,我们把页面的展示内容和交互写在一起,让代码执行两次,这种方式就叫同构。

另外,ssr有build-time和run-time不同,像gatsby这样的静态网站框架就是在build-time生成的;

egg则是run-time时候生成的。

其他、支持SSR的框架NEXT VS Remix:juejin.cn/post/713041…

六、网络层

(1)静态资源,设置nginx的gzip压缩(css、js 、xml、html 文件)。

(2)图片资源,

  1. 可以使用tinypng网站tinypng.com/ 提前压缩;

  2. 小图片,使用webpack loader直接编译入css文件中

  3. 重复使用的小图片,使用雪碧图。

  4. 有交互的图片,可考虑使用svg。

(3)重要资源使用prefetch预加载、dns-prefetch解析DNS。

(4)nginx设置缓存策略

(5)使用http2代替http1.1。

这个需要公司整个链路的服务器支持,一般需要运维升级。

  • 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。浏览器ES Module依赖于HTTP2的多路复用特性。

  • 新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。

  • header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。

其他相关,开发冷启动、热启动、热更新的加速,优化开发体验。

mp.weixin.qq.com/s?__biz=MjM…