一、统计维度分析
页面渲染过程:
按钮点击渲染过程:
由上面的渲染过程可以将统计时间维度分为:
首次渲染:浏览器发起请求、资源下载到渲染页面的时间(按钮和子页面不存在下载资源)
ajax 请求:与后台交互的时间
页面加载:页面从打开到用户可交互的时间总和
通过js代理埋点的方式,使用 google analytics,对所有页面进行全局埋点;
二、GA 结果分析
通过对 GA 数据的详细分析,得到访问量最高的页面以及按钮:
- 统计分析_页面访问统计_页面
- 统计分析_页面访问统计_按钮 (下图展示事件数> 1000 的结果)
首次渲染:首次访问该页面,页面内资源需要从服务器远端下载到本地浏览器,资源下载完成,同时初始化渲染 dom 所消耗的时间
ajax 请求:页面初步渲染完成之后,开始请求后台数据,从请求开始到数据返回的时间
页面加载:进入页面 - 加载资源 - 渲染 dom - ajax 请求 - 二次渲染 ,即页面从进入到彻底加载完成,可响应用户输入的总时间
三、当前系统架构
首次渲染
现状
- 节目管理和节目录制管理为一级界面,会存在首次渲染的耗时,每个页面的资源均为全量引入(13 个 css 文件、32 个 js 文件),加载到渲染平均耗时为 3.5s 左右
分析
- 页面加载冗余资源文件过多
- 国内访问 aws 服务器延时高,访问速度慢
优化方向
- 优化资源文件,初始加载只引入必须的 js 和 css 文件
- 使用 CDN 优化资源文件的下载
- 使用永久缓存方案代替 304 协商缓存
ajax 请求
现状
- 节目管理和子节目页面,ajax 请求耗时过长,平均耗时为 5s 左右
分析
- 页面加载数据之前,需要发起 20 次左右的不同数据库字典的请求
- ajax 存在串行请求的情况
优化方向
- 增加并行度,对必须串行的后端进行整合优化
- 优化后端服务本身的性能
页面加载
现状
- 页面加载时间均耗时过长,其中节目录制管理平均耗时10s左右、节目管理8s左右、子节目管理27s左右
分析
目前系统采用了jquery + bootstrap + vue(仅使用了国际化方案),该架构对页面的渲染方式是直接操作dom元素
每次操作dom元素,浏览器都会从构建DOM树开始从头到尾执行一遍流程。比如当你在一次操作时,需要更新10个DOM节点,理想状态是一次性构建完DOM树,再执行后续操作。但浏览器没这么智能,收到第一个更新DOM请求后,并不知道后续还有9次更新操作,因此会马上执行流程,最终执行10次流程。显然例如计算DOM节点的坐标值等都是白白浪费性能,可能这次计算完,紧接着的下一个DOM更新请求,这个节点的坐标值就变了,前面的一次计算是无用功。即使计算机硬件一直在更新迭代,操作DOM的代价仍旧是昂贵的,频繁操作还是会出现页面卡顿,影响用户的体验。
优化方向
- 采用新的MVVM架构方案,通过虚拟DOM,减少对真正DOM的操作频次;
四、改进目标
根据网站优化的 2-5-8 原则:去除网络延时的影响的前提下,简单页面渲染时间低于 2 秒;复杂数据页面渲染时间低于 5s;不能超过 8s;
- 初始渲染,资源文件 (css、js) 加载由 45 个减少到 6~8 个,其余资源文件根据页面按需动态加载;
- dom 渲染由百次减少到十次以下;
支持组件化复用、估计整体开发效率提高 30%(随着组件化的积累,最后页面 UI 变成组件的拼装,前端开发只关注业务后,效率最高提升 50%);
五、架构改进方案
六、分步实施方案
新的架构升级方案,能够和旧架构并行存在,支持单个页面升级;
https://www.processon.com/diagraming/5d410d3de4b0b3e4dcd92a13