web新开窗口场景降低加载耗时实战

87 阅读3分钟

本文源自道招网的# web新开窗口场景降低加载耗时实战

背景

在PC端web项目中经常会出现要开新窗口打开某个页面的场景,一般来说这个新窗口(窗口B)很可能跟之前的窗口(窗口A)功能基本一致,只不过之前的窗口A打开的是a页面,新窗口B打开的B页面,其实两个窗口的内容是同一个应用,它们都是可以打开a页面和b页面的,既然是同一个应用的话,新开窗口B是不是就不必全部调用相同的接口了,我们是不是可以优化一下。

我这边的邮件项目就有类似的需求,它一个套着electron壳的web mpa项目,主窗口打开邮件页面,需要像outlook类似,能够将列表中的邮件以独立窗口形式打开,打开的这个新窗口也具备完整的邮件功能,所以它也会重新调用一系列的权限、配置接口,然后开始打开对应的邮件。

操作场景

客服在主窗口编辑邮件时可以点击切换至独立窗口,然后在独立窗口中继续进行内容编辑。

切换至独立窗口继续编辑过程请求链路示意图file

优化过程

现状

客服点击切换后主窗口调用接口保存当前编辑内容为草稿,待接口保存成功后再打开独立窗口调用接口读取该草稿并加载至编辑器中,也就是借助服务端完成窗口切换过程中编辑内容的存取。

独立窗口同时还需要完成处理邮件流程必要的配置信息相关接口调用。

优化思路

客服点击切换后主窗口直接存储编辑内容至本地即可打开独立窗口,独立窗口直接加载本地存储内容至编辑器中,也就是直接通过本地完成窗口切换过程中编辑内容的存取。

主窗口处理邮件需要的配置信息接口数据之前在调用后完成本地存储,独立窗口加载时也直接从本地读取对应内容。

技术实现
  1. 尽量避免在各个业务逻辑中加入切换存取的代码侵入,决定将该切换过程放至ajax调用层
  2. 在主窗口发送ajax时直接对特定接口数据进行本地缓存
  3. 启动独立窗口时发送ajax时判断是直接返回上次的缓存数据,还是http请求数据

优化后接口请求流程示意图file

数据统计

从主窗口编辑切换至独立窗口编辑主要经历以下流程

主窗口保存草稿 启动独立窗口 独立窗口读取配置、读取内容 目前第2点启动独立窗口不可控,仅对本地存储优化的第1和第3个节点进行耗时统计

阶段对比主窗口独立窗口总耗时FCPTTFBLCPFIDCLS
优化前第一次采样194.1741907.02101.2899.6534.9453041.8140.370.000211
优化前第二次采样209.3831989.02198.4892.236.8751832.8750.9650.000111
优化前第三次采样218.1341718.01936.1842.9931.2552639.9090.3550.000211
优化前第四次采样190.6911659.01849.7472.03522.942394.4390.3950.000211
优化前第五次采样208.8311695.01903.8934.2644.261839.60.390.000115
总计1021.2138968.09989.24041.135170.27511748.642.4750.000858
平均值204.21793.61997.8808.22734.0552349.7270.4950.000172
优化后第一次采样2.0732.0734.0531.0333.0551223.780.450.000211
优化后第二次采样2.4694.0696.4846.82532.571463.1940.430.000211
优化后第三次采样2.2806.0808.2568.136.7351294.1040.640.000211
优化后第四次采样2.5750.0752.5534.72536.541099.3040.5150.000211
优化后第五次采样2.7727.0729.7479.2523.651134.7140.480.000211
 总计11.83709.03720.82959.93162.556215.0962.5150.001053
 平均值2.4741.8744.2591.98632.511243.0190.5030.000211
效果对比-201.8-1051.8-1253.6-216.241-1106.708

优化后主窗口保存草稿至独立窗口完整加载草稿的全过程平均耗时从1997.8下降至744.2,减少1253.6,下降62.7%

总结

上述优化属于典型的通过空间换时间,增加了少量的本地存储,却对整体耗优化效果明显。