最近做了一个基于 Next.js 、React 和 PixiJS 的网页小游戏 Color Tiles。
页面看起来不复杂:一个 WebGL 棋盘、几个控制按钮,加上一些玩法介绍。但第一次跑移动端 Lighthouse 时只有四十多分。最初的报告没有保存下来,目前仓库里能复核的中间结果是 59 分:
经过几轮优化后,生产构建的移动端 Lighthouse 达到 97 分,桌面端 100 分:
这次比较有效的改动主要有这些:
pixi.js-legacy,改为从 @pixi/core、@pixi/display、@pixi/sprite 等模块按需引入,并直接使用 WebGL Renderer 。sizes,并通过 Cloudflare Image Resizing 输出适合设备尺寸的版本。img.colortilesgame.net CDN 子域名,静态资源缓存延长到一年,并使用 immutable。同时用 preconnect 提前完成新域名的连接。inlineCss,把 CSS 放进 HTML ,减少首次渲染中的一次阻塞请求。过程中也踩了几个坑。例如,一开始 preload 了完整背景图,以为可以改善 LCP ,结果大图反而提前占用网络。后来只 preload 4.8 KB 的占位图,效果更合理。
另一个体会是,不要只盯着 Lighthouse 总分。中间报告的 FCP 已经不到 1 秒,真正的问题是 11 秒的 LCP 、主线程阻塞和过大的资源量。把非关键工作移出首屏,比继续抠 FCP 更有效。
线上版本:
更完整的过程、代码片段、数据和取舍写在 Medium:
欢迎交流 WebGL 游戏、Next.js 或 Lighthouse 优化方面的经验。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.