业务做性能优化,社区资料可参考性有限。记录一下业务摸索过程,算是回馈社区。

内容不会过于详细,毕竟业务形态不一、性能指标侧重点不同,重要的是思路,而不是如何落地;再者社区关于如何落地的资料很多,不需要重复。

指标(KPI)

表示性能的指标(KPI)社区很多,挑几个符合业务形态的就行;不管多少,但是一定要有,不然怎么评估优化效果,有效果也好跟老板吹牛逼。

本文主要围绕着以下两个指标来优化(架构组确定的指标,这里不讨论合理性):

  • 首屏主要内容渲染时间
  • 根组件(componentDidMount)执行时间

这两个指标不理解也没关系,可以简单理解为:页面白屏时间短、外联 js/css/img 加载快、用户可操作等待时间短。

页面白屏时间短

先上 SSR。还觉得首屏慢慢的话,要分析瓶颈在哪:

  • 首屏依赖的接口是不是慢、是不是数量多
  • 内联 js/css 是不是多、能不能缩减

再上 流式渲染,继续分析瓶颈:

  • 首屏、次屏内容划分是否合理
  • 首屏接口是不是足够快、数据量是不是足够小
  • 慢接口有没有移到次屏时再请求
  • 首屏的 html 有没有多余的,用户看不到的 html 是不是可以到 csr 渲染

接着上 loadable,持续分析瓶颈:

  • 首屏组件 loadable 优化
  • csr 才用到的组件,dynamic import 进来
  • csr 才用到的样式,从 inline css 拆出来

到这里,总结起来是:首屏 html 体积要小、接口要快。

接着从 网络角度 分析:

  • http2
  • DNS Prefetch
  • Preconnect
  • Prefetch
  • Prerender

还有 容器 角度:

  • webview 预热
  • webview 复用

静态资源加载快

  • js/css 是不是真的体积小
  • js/css 有没有能拆出去的,主页面少一些其他页面的公共代码
  • webpack 的 minChunks 是否合理
  • webpack 公共 chunk 是否合理
  • polyfill/autoprefixer 配置,结合用户真实情况下,是否合理
  • babel 的 loose 配置是否可以开启
  • terser 的配置是否有优化空间
  • 能不能根据 user agent 有多份打包配置,不同 ua 返回不同代码
  • 客户端可否提前下发资源包,包含页面所需的 js/css/img
  • 图片尺寸是否合理
  • 图片格式可否开启 webp

用户可操作等待时间短

  • 分析 performance 结果,看看前面都有哪些函数卡住页面 hydration
  • lazy hydration

容灾/降级

ssr 虽好,但是要考虑异常,csr 兜底不能丢。

引用