一、首屏慢通常慢在哪里
首屏加载不是一个单点问题,而是网络、服务端、资源体积和浏览器渲染共同作用。用户打开页面后,浏览器要拿 HTML、下载 CSS 和 JS、解析执行、请求接口、渲染主要内容。任何一步拖慢都会影响 LCP 和可交互时间。
| 环节 | 常见问题 | 优化方向 |
|---|---|---|
| TTFB | 服务端慢、未缓存 | CDN、接口缓存 |
| JS下载 | 包体积大 | 拆包、Tree Shaking |
| 图片 | 体积大、无尺寸 | WebP、懒加载 |
| 渲染 | 主线程长任务 | 分片、虚拟列表 |
优化前先测量。Lighthouse 可以快速定位,真实用户监控能判断影响面。不要只看本地高速网络下的表现,移动网络和低端设备更接近真实瓶颈。
二、减少首屏关键资源
首屏只加载当前视口必要资源,低频模块延后。路由级懒加载是最直接的手段,管理后台、报表、编辑器、图表库都不应该进入首页首包。
import{createRouter,createWebHistory}from'vue-router'exportconstrouter=createRouter({history:createWebHistory(),routes:[{path:'/',component:()=>import('./pages/Home.vue')},{path:'/report',component:()=>import('./pages/Report.vue')},{path:'/editor',component:()=>import('./pages/Editor.vue')},],})依赖也要审计。日期库、图表库、富文本编辑器和图标库是常见大户。能按需引入就不要全量引入,能用浏览器原生能力就不要额外拉库。构建后用可视化工具看包组成,比凭感觉优化可靠。
三、图片与字体要提前治理
图片是首屏最大的资源来源之一。首屏主图应压缩成合适尺寸,使用 WebP 或 AVIF,并通过preload提前加载。非首屏图片使用懒加载,所有图片都要设置宽高,避免布局偏移。
<linkrel="preload"as="image"href="/hero.webp"><imgsrc="/hero.webp"width="1200"height="630"alt="产品截图"><imgsrc="/below.webp"loading="lazy"width="600"height="400"alt="详情图">字体同样会影响首屏。中文字体文件很大,能使用系统字体时优先使用系统字体。必须加载品牌字体时,应裁剪字形、设置font-display: swap,避免文字长时间不可见。
四、缓存和服务端协同
前端静态资源应使用内容哈希文件名,并设置长期缓存;HTML 保持较短缓存,确保能拿到最新入口。接口层要减少首屏串行请求,必要数据可以服务端聚合,避免浏览器瀑布式等待。
location /assets/ { expires 365d; add_header Cache-Control "public, immutable"; } location /index.html { add_header Cache-Control "no-cache"; }实践顺序建议是:先建立性能基线,再处理首包 JS、首屏图片、缓存策略和接口瀑布。每次优化后看 LCP、INP、资源大小和错误率。首屏提速不是一次性压缩文件,而是让资源加载顺序符合用户真正需要看到和操作的顺序。
团队还应设置性能预算,并让 CI 在包体积明显增长时提醒。预算不必一开始很严格,可以先按核心页面设定首屏脚本大小、关键图片大小和接口数量上限。需求评审时也要讨论性能成本,例如新增富文本编辑器是否只在编辑页加载,新增图表是否可以懒加载。当前端性能变成日常约束,而不是上线前补救,首屏体验才会稳定。
📌 本文是《前端工程实战》系列,持续更新,关注不迷路。
👉 下一篇:《Vue3组合式 API:状态、请求和组件拆分怎么放》,讲性能之外如何治理组件状态与请求边界。
💬 你在实际项目里遇到过首屏资源不大却迟迟无法完成渲染的问题吗?评论区聊聊。
(觉得有用点个赞+收藏,方便回头查阅)
🔧 相关可运行源码/资料已整理成资源包,可在我主页的资源里自取。