Event 页面性能排查记录
日期:2026-05-19<br>浏览器:Microsoft Edge headless<br>口径:Lighthouse mobile / DevTools throttling,另用 Edge 生成 390x844 mobile 和 1440x1000 desktop 首屏截图。<br>原始数据:lighthouse-edge/*.json<br>截图:screenshots/*.png
页面列表
| 编号 | URL | 对应路由 |
|---|---|---|
| 01 | https://www.lbank.com/event-new/pointmall/10001248-pointsevent | /:locale/event/pointmall/[slug] |
| 02 | https://www.lbank.com/event-new/10001416-luckydraw-tradingbonus-allusers | /:locale/event/[slug] |
| 03 | https://www.lbkpro.net/event-new/pointmall/10001248-pointsevent | /:locale/event/pointmall/[slug] |
| 04 | https://www.lbank.com/event/elitechampionship/116-pizzatrading | /:locale/event/elitechampionship/[code] |
| 05 | https://www.lbk.pub/event-new/pointmall/10001248-pointsevent | /:locale/event/pointmall/[slug] |
Edge Lighthouse 结果
| 页面 | Score | FCP | LCP | Speed Index | TBT | TTI | 请求数 | 传输体积 | 第三方请求 |
|---|---|---|---|---|---|---|---|---|---|
| 01 pointmall lbank | 0.62 | 1.2s | 16.1s | 6.6s | 310ms | 23.5s | 185 | 5.6MB | 66 |
| 02 lucky lbank | 0.63 | 4.0s | 5.6s | 6.8s | 150ms | 25.8s | 198 | 1.9MB | 67 |
| 03 pointmall lbkpro | 0.61 | 1.3s | 16.2s | 6.7s | 320ms | 23.6s | 184 | 5.6MB | 65 |
| 04 elite lbank | 0.62 | 3.8s | 11.0s | 5.4s | 150ms | 14.6s | 176 | 2.0MB | 57 |
| 05 pointmall lbkpub | 0.62 | 1.1s | 16.0s | 6.8s | 310ms | 23.6s | 184 | 5.6MB | 65 |
主要结论
HTML/SSR 不是这轮数据里的主瓶颈。Edge Lighthouse 中根文档耗时约 130-450ms;curl 直连时 5 个 URL 的 TTFB 约 0.46-0.67s。低两秒开率主要来自浏览器端首屏资源、第三方脚本和主线程执行。
01/03/05 Pointmall
这三个域名表现基本一致,LCP 约 16s,传输体积约 5.6MB。最大的阻塞资源来自 pointmall 默认 banner 动画:
| 资源 | 体积 | Edge 耗时 | 说明 |
|---|---|---|---|
0c94d950-...pag | 1.67MB | 9.7s | 移动端 PAG 动画源 |
libpag.wasm | 828-885KB | 5.4-5.7s | PAG runtime |
desktop poster c797...png | 839-840KB | 16.0-16.4s | 首屏背景图 |
mobile poster ace1...png | 641KB | 14.9s | 首屏背景图 |
对应代码:
growthx/event/src/app/[locale]/event/pointmall/constants/bannerVideo.ts默认给所有 pointmall 活动配置webmList、pagList、desktop poster 和 mobile poster。growthx/event/src/app/[locale]/event/pointmall/components/ActivityPage/index.tsx对PointsMallBanner注入getPointMallBannerVideo(activityCode),所以该活动必走视频模式。growthx/shared/src/components/event/EventComWithStore/components/Banner/variants/pointMall/index.tsx在视频模式下同时渲染 desktop 和 mobile poster<img>,且原始 URL 没有 OSS 尺寸裁剪参数。growthx/shared/src/components/VideoAnimation/index.tsx默认delayLoad=true且delayLoadTime=3000,延后 3s 后才挂载动画。packages/bix/src/Animation/TopBannerVideo/index.tsx移动端选择PagAnimation。packages/bix/src/Animation/PagAnimation/index.tsx动态插入libpag.min.js,再 fetch.pag并初始化 canvas。
截图观察:
screenshots/01-pointmall-lbank-mobile.png:移动端首屏同时包含大 banner、倒计时、CTA 和奖品卡。视觉内容完整,但依赖大 poster/PAG 资源。screenshots/01-pointmall-lbank-desktop.png:桌面首屏大面积是 pointmall banner 背景,首屏主视觉天然会被大图和动画资源主导。
建议优先级:
- 移动端首屏先展示静态 webp poster,PAG 延后到 idle、首屏稳定后或用户交互后加载。
- 对 pointmall poster 加 OSS
resize+format,webp,并用<picture>或 CSS media 分端加载,避免 desktop/mobile 双图同时进入首屏竞争。 - 针对
10001248-pointsevent在POINT_MALL_BANNER_VIDEO_MAP做单活动降级,先验证关闭 PAG 后的两秒开率改善。
02 Lucky Draw
LCP 5.6s,比 pointmall 好,但请求数最高:198 个。主要瓶颈是请求并发和全局脚本执行。
Top resources:
gtag/js157KB,约 1.7s。- banner 背景
b40880...png?x-oss-process=image/format,webp152KB,约 4.1s。 - 抽奖转盘图
bg-raffle-wheel@x2.png121KB,约 8.2s。 data-trace.latest.min.js91KB,约 4.7s。- Next chunks 多个 50-90KB,部分耗时 5-7s。
对应代码:
growthx/event/src/app/[locale]/event/[slug]/page.tsx使用force-dynamic。growthx/event/src/app/[locale]/event/[slug]/components/ActivityPage/index.tsx页面首屏初始化极验 SDK。growthx/event/src/app/[locale]/layout.tsx默认启用PageLayout的 Header/Footer。
截图观察:
screenshots/02-lucky-lbank-mobile.png:首屏主要是转盘和活动背景,转盘资源是 LCP 候选之一。
建议优先级:
- 抽奖组件首屏图片加尺寸裁剪和 preload/fetch priority。
- 极验初始化改为报名、抽奖或任务点击前触发,不在页面打开时立即初始化。
- 评估非首屏远程组件和第三方脚本延后策略。
04 Elite Championship
LCP 11.0s,请求/体积低于 pointmall,但首屏 banner 图耗时明显。
Top resources:
- banner 图
c37050bc-...jpg?x-oss-process=image/format,webp318KB,约 7.2s。 gtag/js157KB,约 7.1s。data-trace.latest.min.js91KB,约 3.1s。- 多个 Next chunks 和字体资源参与首屏竞争。
对应代码:
growthx/event/src/app/[locale]/event/elitechampionship/[code]/page.tsx使用force-dynamic。growthx/event/src/app/[locale]/event/elitechampionship/components/Banner/index.tsx有视频资源时走VideoAnimation,无视频时直接用 background image。growthx/event/src/app/[locale]/layout.tsx默认启用 Header/Footer 和基础全局脚本。
截图观察:
screenshots/04-elite-lbank-mobile.png:首屏是 pizza banner + CTA + 奖池图。画面没有明显布局异常,但 banner 图片是主要首屏候选。
建议优先级:
- banner 图按移动端尺寸裁剪,不直接让 318KB 图成为移动端首屏关键资源。
- 如果后台
headVedioList有视频,移动端优先静态图,视频延后。 - 检查
generateMetadata和页面主数据是否可以共享或缓存,降低动态渲染波动。
共性问题
- 三类路由都声明了
revalidate = 45,同时又声明dynamic = 'force-dynamic'。这会让 ISR 收益基本失效。当前 TTFB 不是主因,但高峰期会放大服务端压力。 PageLayout全局加载 Header/Footer、远程模块、monitor、data-trace、GA、LiveChat 等能力。活动页首屏并不一定需要这些全部立即参与关键路径。useGeetestInitEffect当前在活动页打开后初始化 SDK,即使用户未交互也会引入极验脚本和主线程成本。- 首屏大图和动画资源没有统一的移动端尺寸策略。Pointmall 尤其明显,PAG + WASM + 两张 poster 把 LCP 拉长到 16s 左右。
复核补充(2026-05-19)
使用 Edge 实际打开了三个代表页面:
https://www.lbank.com/event-new/pointmall/10001248-pointseventhttps://www.lbank.com/event-new/10001416-luckydraw-tradingbonus-allusershttps://www.lbank.com/event/elitechampionship/116-pizzatrading
另外两个 Pointmall 镜像域名(lbkpro.net、lbk.pub)未在 Edge UI 中逐个重复打开,但已通过 Lighthouse JSON 和资源明细对比确认与 lbank.com 表现基本一致。
本次代码复核把范围扩大到整个 growthx,重点检查了 VideoAnimation / TopBannerVideo / PagAnimation、useGeetestInitEffect、PageLayout、force-dynamic + revalidate 和 banner 图片预加载策略。新的补充判断:
- Pointmall 的问题优先级最高。
DEFAULT_POINTMALL_VIDEO默认给所有 Pointmall 活动注入webmList、pagList、desktop poster 和 mobile poster;POINT_MALL_BANNER_VIDEO_MAP当前为空,10001248-pointsevent没有活动级降级。 - Pointmall 视频模式下同时渲染 desktop/mobile 两个 poster
<img>,仅依赖 CSSdisplay切换。浏览器仍可能提前发现两张图并加入首屏竞争。 VideoAnimation默认 3s 后加载动画,但 Pointmall 移动端仍会在首屏稳定窗口拉取libpag.min.js、libpag.wasm和.pag。固定 3s 延迟不等于退出关键路径。- 标准活动页的 banner 已有
PreloadImage+ media 区分;Pointmall 视频模式没有复用这一套首屏图片预加载和端侧资源发现策略。 useGeetestInitEffect的 hook 内部无论是否登录都会先执行geetest.init({ autoReport: false })。因此传入{ isLogin }只能控制是否上报 token,不能避免 SDK 初始化成本。- 同类极验打开即初始化不仅在 event 标准活动页和 pointmall 页存在,也出现在
growthx/spotx的 Token Splash 首页和详情页。 force-dynamic + revalidate组合不只在 event 三类路由存在,growthx/spotx/token-splash、growthx/spotx/token-splash/[code]、growthx/bonus/bonus/center也有同类写法。它不是当前 5 个页面 LCP 的首要瓶颈,但属于 growthx 范围内的缓存策略债务。PageLayout header={true} footer={true}是 event、spotx、bonus、seo 的统一布局入口。这个能力不要在活动页内私自绕开;如果要延后 Header/Footer 或全局脚本,需要和@lbank/bix/ PageLayout 维护方一起设计开关。
秒开率核心影响因素
“秒开率”重点看用户进入页面后 2s 内能否看到稳定、可理解、可交互的首屏。结合 Edge 实测、Lighthouse 和代码路径,当前核心影响因素按优先级如下。
1. Pointmall 首屏主视觉资源过重
影响页面:01、03、05。
这是当前最直接拖低两秒开率的问题。Pointmall 首屏几乎完全由大 banner 占据,首屏能否快速稳定取决于 banner 静态图和动画资源。
关键数据:
- LCP 约 16.0-16.2s,远高于另外两个页面。
- 首屏传输体积约 5.5MB。
.pag约 1.67MB,结束时间约 33s。libpag.wasm约 828-885KB,结束时间约 23s。- desktop poster 约 839-840KB,下载约 16s。
- mobile poster 约 641KB,下载约 15s。
关键代码:
growthx/event/src/app/[locale]/event/pointmall/constants/bannerVideo.tsgrowthx/event/src/app/[locale]/event/pointmall/components/ActivityPage/index.tsxgrowthx/shared/src/components/event/EventComWithStore/components/Banner/variants/pointMall/index.tsxgrowthx/shared/src/components/VideoAnimation/index.tsxpackages/bix/src/Animation/TopBannerVideo/index.tsxpackages/bix/src/Animation/PagAnimation/index.tsx
判断:Pointmall 的两秒开率不是靠调 TTFB 能解决。必须先让 2s 内只加载一张正确尺寸的静态首屏图,把 PAG / WASM / 视频降为非关键路径。
2. 首屏同时发现 desktop/mobile 双图
影响页面:主要是 01、03、05。
Pointmall 视频模式下 desktop poster 和 mobile poster 是两个并列 <img>,通过 CSS 控制显示隐藏。即使最终只显示一张,浏览器仍可能提前发现两个图片资源并参与下载竞争。
关键数据:
- desktop poster 和 mobile poster 合计约 1.48MB。
- mobile Lighthouse 下仍出现 desktop poster 下载,且 desktop poster duration 约 16s。
判断:这会直接挤占移动端首屏网络带宽,降低 2s 内展示稳定 banner 的概率。应该改成 media-aware 的单资源发现策略。
3. PAG 固定 3s 延迟仍落在首屏关键窗口
影响页面:01、03、05,以及 growthx 里所有首屏使用 VideoAnimation / TopBannerVideo 的页面。
VideoAnimation 默认 delayLoad=true、delayLoadTime=3000。这能避免动画立即抢 FCP,但 3s 对“秒开率”仍太早:首屏图刚开始稳定时,又开始拉 libpag.min.js、libpag.wasm 和 .pag,继续抢网络和主线程。
关键数据:
- Pointmall 的
libpag.min.jsbootup CPU 约 0.52-0.62s。 .pag和 wasm 均在首屏后继续下载到 20-33s。
判断:对两秒开率而言,PAG 应该是 idle/交互后的增强效果,不应固定 3s 自动启动。移动端优先静态图是更稳的策略。
4. 页面打开即初始化 Geetest
影响页面:01、02、03、05;代码同类问题也存在于 growthx/spotx。
useGeetestInitEffect 内部不管是否登录都会先 geetest.init({ autoReport: false }),这会插入 https://static.geetest.com/g5/gd.js 并触发后续 Geetest 资源。传入 { isLogin } 只能控制是否执行 reportGeeTokenToRisk,不能避免 SDK 初始化。
关键数据:
static.geetest.com/g5/gd.js出现在 bootup 明细中,CPU 约 0.22s。geeGuard...js约 63KB,Pointmall/Lucky Draw 中结束时间可到 18-25s。- Geetest 还有
riskct.geetest.com的 preload/report 请求。
判断:风控 SDK 对报名、抽奖、任务点击有意义,但不应该在页面打开时进入秒开关键路径。应改为动作前懒初始化,并在未登录时跳过初始化。
5. 全局 Layout 脚本和远程组件参与首屏竞争
影响页面:所有 growthx 应用,包括 event、spotx、bonus、seo。
PageLayout 统一注入 Header/Footer、RemoteEsmUmdProvider、monitor、data-trace、GA、LiveChat、字体 preload 等基础能力。Footer 已经包了 PageLoadWrapper,LiveChat 也延后 2s,但 Header、远程模块、monitor、data-trace、GA 仍会参与首屏资源调度和主线程执行。
关键数据:
monitor.iife.js在 bootup 中 CPU:Pointmall 约 3.5-4.2s,Lucky Draw 约 2.7s,Elite 约 2.5s。data-trace.latest.min.js约 91KB。gtag/js约 157KB,多个页面下载耗时 7-8s。- Header 相关远程模块如
SearchPanel、AccountMenu在 10-18s 区间仍有下载。
判断:全局能力不是唯一瓶颈,但会降低弱网/低端机下的秒开稳定性。不能在业务页私自删 Layout,应该给 PageLayout 增加可配置的延迟策略或活动页轻量模式。
6. Lucky Draw 的转盘图和动态 chunk
影响页面:02。
Lucky Draw 的 LCP 约 5.6s,已经明显好于 Pointmall,但 2s 内仍不稳。首屏视觉依赖转盘和背景,抽奖交互组件较重,Next chunks 也在 10s 左右继续下载。
关键数据:
bg-raffle-wheel@x2.png约 121KB,下载约 8.2s。- banner 背景约 152KB。
- mainthread script evaluation 约 4.0s。
- bootup top chunk
87ff398b...jsCPU 约 3.45s。
判断:Lucky Draw 的优先级是首屏图尺寸/优先级、抽奖交互延后和 Geetest 延后,不是 SSR。
7. Elite banner 图加载慢
影响页面:04。
Elite 的传输体积低于 Pointmall,但首屏 banner 是关键 LCP 候选。Edge 打开时能看到黑底文案先出现,随后大图补齐。
关键数据:
- banner 图约 318KB,下载约 7.2s,LCP 约 11.0s。
- mainthread work 约 5.4s,低于 Pointmall/Lucky Draw。
判断:Elite 主要处理移动端首屏图裁剪、预加载和 fetch priority。它不是最大头,但优化确定性高。
TODO
记录口径:
- “为什么改”说明当前代码或资源路径如何拖慢秒开率。
- “预期提升”说明优化后应改善的指标或用户感知。
P0:Pointmall 首屏资源减载
| 状态 | 任务 | 为什么要改 | 预期提升 | |
|---|---|---|---|---|
| [ ] | 改 PointMallBanner 的静态回退路径:当 videoSource 没有 webmList/mp4List/pagList 时,BaseBanner 使用 videoSource.poster/h5Poster,而不是只回退到后台 bannerPic/bannerPicH5Black。 | 当前如果只给 POINT_MALL_BANNER_VIDEO_MAP 配静态 poster,组件不会自然走到这两张图;必须先打通静态降级链路。 | 为单活动关闭视频/PAG 提供低风险开关,支持先验证 Pointmall LCP 和两秒开率收益。 | |
| [ ] | 针对 10001248-pointsevent 在 POINT_MALL_BANNER_VIDEO_MAP 做活动级降级实验:先关闭 pagList / webmList,只保留静态 poster,复测 LCP 和两秒开率。 | 该页面 LCP 约 16s,首屏资源约 5.5MB;PAG 1.67MB、WASM 约 0.8MB、poster 约 1.48MB 是当前最大瓶颈。 | 让首屏从“图 + 动画运行时”变成“单张静态图”,预期明显降低 LCP、首屏资源体积和弱网白屏/黑屏时长。 | |
| [ ] | 将 Pointmall 视频模式的 desktop/mobile poster 从两个并列 <img> 改为单一资源发现策略,例如 <picture><source media=...> 或复用 PreloadImage 的 media 策略。 | 当前 CSS 隐藏不等于网络不发现;mobile Lighthouse 下仍下载 desktop poster,双图合计约 1.48MB。 | 移动端只下载移动端首屏图,减少带宽竞争,提高 2s 内首屏图稳定展示概率。 | |
| [ ] | 给 Pointmall poster URL 增加统一 OSS 尺寸裁剪和 format,webp。移动端按实际首屏展示尺寸裁剪,不直接使用 641KB 原图。 | 当前 poster URL 没有尺寸裁剪;移动端加载超出展示所需的原始大图。 | 降低 LCP 图片传输体积,提升弱网和低端机的首屏展示速度。 | |
| [ ] | 将 Pointmall PAG 加载从固定 delayLoadTime=3000 改为 idle、首屏稳定后或用户交互后加载;若业务允许,移动端默认静态图,PAG 作为增强效果。 | 3s 延迟仍落在秒开关键窗口附近,会继续拉 libpag.min.js、libpag.wasm 和 .pag,并带来主线程执行成本。 | 把动画资源移出首屏关键路径,减少首屏后 3-5s 的网络和 CPU 抖动,提升首屏稳定感。 | |
| [ ] | 为 VideoAnimation 增加可配置的移动端静态封面模式,例如 staticOnMobile / `loadStrategy="idle | interaction"`。 | VideoAnimation 被 event、spotx、bonus 和 shared 抽奖组件复用;如果只在 Pointmall 写特例,后续同类页面还会重复踩坑。 | 形成 growthx 公共性能能力,统一控制移动端视频/PAG 是否进入首屏关键路径。 |
P1:Lucky Draw / 标准活动页
| 状态 | 任务 | 为什么要改 | 预期提升 |
|---|---|---|---|
| [ ] | 抽奖组件首屏转盘图和 banner 背景图补充尺寸裁剪、fetchPriority="high" 和明确宽高,优先处理 bg-raffle-wheel@x2.png。 | Lucky Draw 首屏核心视觉依赖转盘图;bg-raffle-wheel@x2.png 约 121KB,下载约 8.2s,是 LCP/首屏稳定候选资源。 | 提前、按需加载首屏关键图,降低 LCP 和首屏视觉补齐时间。 |
| [ ] | 将标准活动页 useGeetestInitEffect 从页面打开即初始化改为动作前初始化:报名、抽奖、任务点击等真实风控触发点前再 init/report。 | 当前页面打开就拉 Geetest SDK、geeGuard 和风控请求,即使用户未点击报名/抽奖,也占用首屏网络和 CPU。 | 减少首屏第三方脚本竞争,提升 FCP/LCP 周边稳定性,并降低未交互用户的无效资源消耗。 |
| [ ] | 检查并调整 useGeetestInitEffect hook 语义:如果 isLogin=false,跳过 geetest.init。 | 现有 hook 里 { isLogin } 只控制是否上报 token,不控制 SDK 初始化;未登录用户也会加载 Geetest。 | 未登录访问活动页时减少第三方 SDK 请求和 bootup CPU,提升秒开率样本中的低成本访问体验。 |
P1:Elite Championship
| 状态 | 任务 | 为什么要改 | 预期提升 |
|---|---|---|---|
| [ ] | Elite banner 背景图按移动端首屏尺寸裁剪,并确认 preload 的 URL 与实际 background-image URL 完全一致。 | Elite LCP 约 11s,banner 图约 318KB、下载约 7.2s;如果 preload URL 和实际 URL 不一致,预加载收益会被抵消。 | 降低 banner 图下载时间,提升首屏从黑底文案到完整视觉的补齐速度。 |
| [ ] | 若 headVedioList 存在视频资源,移动端优先静态 poster,视频/PAG 延后加载。 | Elite 当前无视频时主要是图片瓶颈;但代码支持视频资源,一旦后台配置视频,移动端可能复现 Pointmall 的视频/PAG 问题。 | 防止后续活动配置视频后拖慢秒开率,保持移动端首屏稳定。 |
P2:GrowthX 共性治理
| 状态 | 任务 | 为什么要改 | 预期提升 |
|---|---|---|---|
| [ ] | 梳理所有 growthx 中 force-dynamic + revalidate 的路由,确认哪些确实依赖 request-time 数据,哪些可以恢复 ISR 或改为更细粒度动态数据请求。 | force-dynamic 会让 revalidate 基本失效;当前 TTFB 不是主瓶颈,但高峰期服务端压力会放大首包波动。 | 降低服务端波动和高峰期首包风险,为秒开率提供更稳定的 HTML 基线。 |
| [ ] | 和 PageLayout 维护方确认是否支持按业务页延后非首屏能力:Footer、LiveChat、GA、data-trace、远程模块等。 | PageLayout 当前统一注入 monitor、data-trace、GA、Header 远程模块等;这些能力会参与首屏网络和主线程竞争,但不能在业务页私自删除。 | 在不破坏全站基础能力的前提下,为活动页提供轻量首屏模式,减少全局脚本对秒开率的影响。 |
| [ ] | 将首屏图片规范沉淀到 growthx 公共组件:端侧 media preload、OSS resize/webp、避免 CSS 隐藏双资源、明确 LCP 候选图优先级。 | 当前标准活动页、Pointmall、Elite 的首屏图处理策略不一致,容易出现双图下载、未裁剪、preload URL 不一致等问题。 | 统一首屏图片性能能力,减少后续活动页重复问题,提升多页面秒开率一致性。 |
| [ ] | 对 growthx/spotx Token Splash 的 VideoAnimation 和 useGeetestInitEffect 做同类性能审计。 | 全局搜索发现 Token Splash 首页和详情页也有首屏视频动画与打开即初始化 Geetest 的代码路径。 | 避免 event 优化完成后,同组其他活动页继续拖累 growthx 整体性能口径。 |
产物索引
Edge Lighthouse JSON:
lighthouse-edge/01-pointmall-lbank.jsonlighthouse-edge/02-lucky-lbank.jsonlighthouse-edge/03-pointmall-lbkpro.jsonlighthouse-edge/04-elite-lbank.jsonlighthouse-edge/05-pointmall-lbkpub.json
Edge screenshots:
screenshots/01-pointmall-lbank-mobile.pngscreenshots/01-pointmall-lbank-desktop.pngscreenshots/02-lucky-lbank-mobile.pngscreenshots/02-lucky-lbank-desktop.pngscreenshots/03-pointmall-lbkpro-mobile.pngscreenshots/03-pointmall-lbkpro-desktop.pngscreenshots/04-elite-lbank-mobile.pngscreenshots/04-elite-lbank-desktop.pngscreenshots/05-pointmall-lbkpub-mobile.pngscreenshots/05-pointmall-lbkpub-desktop.png