性能治理之页面LongTask优化

前言

在现代 Web 应用中,页面性能直接影响用户体验和业务发展。我们近期对列表页进行了一次全面的性能优化,旨在提升用户访问效率,提升用户满意度。

接下来,将为大家详细分享这次优化的过程、方法和成果。

一、优化目标与用户分析

我们将优化目标聚焦于核心列表页,通过BLM健康平台(内部访问统计平台)筛选出高流量且秒开率低的页面作为重点优化对象。同时,利用日志进行深度剖析,明确优化的用户范围。

  • 初次进入用户:占比18.41%,秒开率接近于0;
  • 二次进入用户:占比81.87%,秒开率27.85%。

基于这一数据,我们确定二次进入用户中的未秒开用户是本次优化的主要目标群体,占比约为58.85%,这一决策基于两个关键考量:

  • 初次进入用户受网络环境和首次加载影响较大,优化空间有限;

  • 二次进入用户占比高且已有部分秒开,优化潜力更大。

二、性能优化尝试

qiankun 架构下某核心列表加载流程简图

在 qiankun 架构下,列表的加载流程具有一定的复杂性。我们针对这一流程,分阶段展开,具体内容如下:

第一阶段:静态资源优化(DLC)

首先从静态资源入手,对相关文件和模块进行调整,具体优化内容及前后指标对比如下:

关键收获:非关键资源的延迟加载或移除可以显著降低TBT(Total Blocking Time 总阻塞时间)。

第二阶段:DLC到FCP

本次优化暂不考虑

第三阶段:主应用FCP到LCP优化

针对主应用的关键渲染路径,重点优化了:

javascript 复制代码
// 修改前:筛选项全部渲染
renderAllFilters() {
  // 渲染所有筛选项(包括隐藏内容)
}

// 修改后:按需渲染
renderVisibleFiltersOnly() {
  // 只渲染可见的筛选项
}

优化效果对比:

第四阶段:长任务分解

核心优化方案

基于以上分析,我们总结出以下优化建议(按收益排序):

  1. 筛选项懒加载:TTI最多减少642ms;
  2. 大数据枚举虚拟化:司机标签TTI减少594ms,城市组件减少179ms;
  3. 接口调用顺序调整:TTI减少355ms;
  4. 表格组件优化:TTI减少430ms;
  5. 缓存逻辑优化:TTI减少170ms;
  6. CSS合包处理:TTI减少60ms;

优化效果验证

通过A/B测试和监控平台数据对比:

  • 优化前(02.12-02.18):秒开率17.15%;
  • 优化后(02.28-03.04):秒开率31.92%;
  • 提升幅度:14.77个百分点;

三、分析方法沉淀

目标设定阶段

  1. 通过BLM健康平台确定需优化页面
  • 高流量页面优先
  • 秒开率低页面优先
  1. 通过性能埋点日志确定可优化范围

    使用 Node 脚本将一段时间日志进行分类分析:是否初次进入 / 是否存存在缓存。

    确定可优化用户范围,若用户范围过小或无法达成,可放弃优化,转向其他页面。

问题定位方法

我们主要使用以下工具进行性能分析:

关键指标解释:

  • FCP(First Contentful Paint):首次内容渲染
  • LCP(Largest Contentful Paint):最大内容渲染
  • TBT(Total Blocking Time):总阻塞时间(FCP到TTI之间超过50ms的任务部分总和)
  • TTI(Time to Interactive):可交互时间

  • Lighthouse初步诊断:获取整体性能评分和优化建议。
  • 任务分析:通过 Performance insights 的 Main 线程火焰图定位长任务 & 检查接口并行性和响应时间。
  • Performance深度分析
  1. 使用 Performance 工具打开待优化页面,根据任务分析中找到的阻塞点函数进行搜索定位。在有 map 文件的环境或本地环境中,通过调用栈信息,找到阻塞或长任务对应的代码块。
    • LCP 后的任务阻塞一般是由接口返回数据渲染导致,这时可以结合 Network 火焰图找对应关系,明确是那个 API;

    • Network 中资源条目的时间包括请求前等待时间以及请求后解析时间,可根据解析时间判断哪个接口数据导致了阻塞;

    • 可在函数执行前添加console.profile(),在函数执行后添加console.profileEnd()语句,定向分析该函数对性能的影响(此方法对异步任务的支持有限)。

javascript 复制代码
// 示例:标记关键函数执行
console.profile('filterRender');
renderFilters();
console.profileEnd('filterRender');
  1. 主要通过以上三步确定阻塞点并进行分析。若想深入分析阻塞点的具体原因,可在本地环境中使用 Performance 进行分析(可获取具体函数调用栈),或使用 Profiles(在 Memory 标签下)进行分析,以确定哪些函数导致了内存占用的波动等问题。

方案验证(whistle)

安装好 whistle 客户端并配置规则,将需要更改的文件代理到本地进行修改;

本文所得数据均以此方式进行测试

确定修改方案的ROI

根据分析以上分析列出可优化点,并对所有优化方案进行评估计算 ROI,优先选择收益高且优化成本低的优化方案进行优化。

结果验证阶段

  • 对优化方案进行优化开发和测试;
  • 上线后通过健康平台和性能日志进行数据指标验证是否达到预期。

四、经验总结与未来建议

基于本次优化经验,我们提炼出以下通用建议:

1.按需加载原则

  • 非首屏内容延迟加载;
  • 大数据枚举使用虚拟滚动;

2.关键渲染路径优化:

  • 关键接口尽早调用(created生命周期);
  • 避免渲染阻塞接口请求;

3.长任务分解:

  • 将超过50ms的任务拆分为小任务;
  • 使用 Web Worker 处理复杂计算;

4.缓存策略:

  • 合理使用内存和 IndexedDB 缓存
  • 避免缓存更新阻塞主线程

5.监控体系:

  • 建立完整的性能监控体系

  • 定期分析用户行为日志

结语

本次优化实践表明,系统化的性能优化需要:

  1. 精准的用户行为分析确定优化方向;
  2. 科学的工具链进行问题定位;
  3. 严谨的ROI评估确定优化优先级;
  4. 完善的监控体系验证优化效果。

通过这四步方法论,不仅提升了特定页面的性能,更建立了一套可复用的前端性能优化体系,为后续其他页面的优化提供了宝贵经验。性能优化是一个持续的过程,我们将不断探索和实践,为用户带来更流畅、高效的使用体验。希望本次分享能为大家在页面性能优化方面提供有益的参考和借鉴。

附:

Lighthouse

Lighthouse 是 Google 开发的一款工具,用于分析网络应用和网页,收集现代性能指标并提供对开发人员最佳实践的意见。为 Lighthouse 提供一个需要审查的网址,它将针对此页面运行一连串的测试,然后生成一个有关页面性能的报告。

页面的性能 Performance 评分,包括:

  • 首次内容绘制(FCP First Contentful Paint);
  • 最大内容渲染时间(LCP largest contentful Paint)衡量感知加载速度;
  • 总阻塞时间 (TBT Total Blocking Time)TBT 衡量的是页面被阻止响应用户输入(例如点击鼠标、点按屏幕或按键盘)的总时长。总和的计算方法是将 First Contentful Paint 和 Time to Interactive 期间所有长任务的阻塞部分相加。任何执行时间超过 50 毫秒的任务都是耗时较长的任务。50 毫秒后的时间是阻塞部分。例如,如果 Lighthouse 检测到一个时长为 70 毫秒的任务,则阻塞部分将为 20 毫秒。
  • 累积布局偏移(CLS Cumulative Layout Shift)衡量视觉稳定性;
  • 速度指标(Speed Index)

Performance

Performance 是 Chrome 提供给我们的开发者工具,用于记录和分析我们的应用在运行时的所有活动。它呈现的数据具有实时性、多维度的特点,可以帮助我们很好地定位性能问题。 使用 Performance 工具时,为了规避其它 Chrome 插件对页面的性能影响,我们最好在无痕模式下打开页面。

  • 控制面板 | 开始记录,停止记录和配置记录期间捕获的信息。
  • 概览面板 | 对页面表现(行为)的一个概述。
    • FPS | 绿色的柱越高, FPS 值也越高,红色则说明可能出现了卡顿。
    • CPU | 表明了哪些事件在消耗 CPU 资源。
    • NET | 蓝色 代表 HTML 文件,黄色 代表 Script 文件,紫色 代表 Stylesheets 文件, 绿色 代表 Media 文件,灰色 代表其他资源。
  • 火焰图面板 | 可视化 CPU 堆栈(stack)信息记录。
    • 从不同的角度分析框选区域 。例如:Network,Frames, Interactions, Main 等。

Performance insights

Performance insights 是 Chrome Chrome DevTools中的自带工具(Chrome102 版本发布),目前还是在Chrome DevTool中启动即可,如下图所示:我们可以模拟cpu,选择4x slowdown,就开始模拟4倍低速 CPU,同理还可以模拟网络应对不同网络的测试需求。 Performance insights 工具最方便的部分是"insights"面板,它位于面板的最右侧。它以垂直时间线的形式按照事件发生的顺序显示事件,如渲染阻塞请求、长任务、布局变化等。点击这些具体事件将导航到"详细信息"选项卡,它给出了关于它的潜在原因和受它影响的元素等的详细信息,在Details中看到影响性能问题的各种因素。想要进一步进行优化,点击该事件就可以查看关于问题的详细描述和具体的优化方案。另外在页面的顶端(绿色框)我们可以方便的看到当前页面DCL,FCP,LCP和TTI这些参数指标

性能监控日志

性能监控日志以 JSON 格式记录了丰富的页面性能数据。我们可以将埋点日志下载到本地,通过 Node 脚本对其进行计算和分析,从而获取所需的数据,如 IndexedDB 缓存平均等待时间、资源加载及解析时间、接口响应后到 TTI 计算结束时间等,也可以通过此方式计算优化某个点的收益等。

相关推荐
崔庆才丨静觅3 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60614 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了4 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅4 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅4 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅5 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment5 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅5 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊5 小时前
jwt介绍
前端
爱敲代码的小鱼5 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax