前端性能优化实战:Core Web Vitals满分攻略
引言
那天领导找我,说咱们网站Lighthouse才60分,让我一周内提到90分。说实话,我当时心里挺慌的。打开Chrome DevTools,看着那红红绿绿的Lighthouse报告,LCP、FID、CLS这些指标看得我一头雾水。优化性能这事儿,对很多前端开发者来说,就是突如其来的额外工作。
老实讲,我也踩过不少坑。第一次优化的时候,我把所有图片都设置了懒加载,结果LCP得分反而降了。后来才发现,首屏大图根本不该懒加载。还有一次,我花了整整两天时间研究Service Worker缓存策略,得分只提升了2分,性价比简直低到尘埃里。
这篇文章不是理论科普,是真正能让你2周内看到效果的实战指南。我会告诉你哪些优化ROI最高、哪些坑不要踩、以及如何按照优先级一步步把Lighthouse得分从60分提到90+。这些都是我实战总结出来的经验,有数据有案例。
第一章:理解Core Web Vitals三大指标
别被这些英文缩写吓到,说白了就是:加载快不快、点击响不响、画面抖不抖。
什么是Core Web Vitals
Google在2020年提出了三大用户体验指标,不仅影响用户体验,还直接影响SEO排名。你的网站就算内容再好,性能差一样排名掉。2024年3月还有个重大更新:INP替代FID成为核心指标。如果你还在优化FID,那就out了。
LCP - 最大内容绘制
LCP衡量的是页面主要内容加载速度,通常是首屏的大图、标题或者视频。标准是这样的:
- 少于2.5秒:优秀(绿色)
- 2.5-4秒:需改进(黄色)
- 超过4秒:差(红色)
我喜欢用餐厅来比喻:LCP就像餐厅上主菜的速度。如果等了10分钟主菜还没上,你肯定不爽,对吧?
有个真实数据:页面加载时间从3秒增加到5秒,跳出率会增加38%。移动端如果加载超过3秒,53%的用户会直接离开。你优化好LCP,转化率能提升7-15%。
INP - 交互到下次绘制
这是2024年3月的新指标,正式替代了FID。INP衡量的是页面响应用户交互的速度,包括点击、键盘输入、触摸的完整响应周期。标准是:
- 少于200ms:优秀(绿色)
- 200-500ms:需改进(黄色)
- 超过500ms:差(红色)
为什么Google要换掉FID?因为FID只测量”首次输入延迟”,而INP覆盖了整个交互过程。就像点餐,FID只看服务员有没有听到你说话,而INP要看从你点餐到菜上桌的全过程。
我第一次看到项目的INP是650ms,点个按钮要等半秒多,难怪用户说卡。后来发现是YouTube自动嵌入的问题,移除后INP降到220ms,用户明显感觉流畅了。
CLS - 累积布局偏移
CLS衡量的是页面视觉稳定性。你有没有遇到过这种情况:正要点击某个按钮,突然页面跳了一下,你点到了广告上?这就是CLS惹的祸。标准是:
- 少于0.1:优秀(绿色)
- 0.1-0.25:需改进(黄色)
- 超过0.25:差(红色)
我第一次看到CLS是0.5时,还以为0.5挺小的,后来才知道这已经是重灾区了。常见的CLS问题有:图片没设宽高、广告突然插入、字体闪烁(FOIT)。
第二章:LCP优化 - ROI最高的性能优化
为什么我把LCP放在第一优先级?因为:
- 影响最直接:用户第一时间能感知到
- 优化空间最大:常见的LCP能从5秒优化到2秒以下
- 技术方案成熟:图片优化、CDN加速都是成熟方案
- ROI最高:投入少、见效快,性价比之王
Core Web Vitals优化完整流程
从LCP、INP到CLS的完整优化方案,2周内将Lighthouse从60分提升到90+
⏱️ 预计耗时: 2W
- 1
步骤1: P0优先级:图片优化(LCP)
图片优化占LCP问题的70%+,ROI最高:
1. 使用现代图片格式:
• AVIF压缩率高41%(比JPEG)
• WebP压缩率高30%(比JPEG)
• 使用<picture>标签或Next.js Image组件自动选择
2. LCP图片必须加priority:
• 首屏大图不要懒加载(loading="eager")
• Next.js使用<Image priority />
• 使用preload关键图片
3. 响应式图片:
• 使用srcset节省60%流量
• 移动端加载小尺寸图片
实战案例:hero图从500KB降到120KB(AVIF格式),LCP从4.2秒降到2.1秒。 - 2
步骤2: P0优先级:第三方脚本延迟(INP)
第三方脚本是INP的主要瓶颈:
1. 延迟加载非关键脚本:
• 使用defer或手动延迟3秒
• 非首屏脚本延迟加载
2. 使用Facade模式:
• 延迟加载重量级组件(如YouTube视频embed)
• 先显示占位符,用户交互时再加载
3. 移除自动嵌入:
• 移除自动嵌入的第三方内容
• 手动控制加载时机
实战案例:移除YouTube自动embed,INP从650ms降到220ms。 - 3
步骤3: P0优先级:图片设置宽高(CLS)
CLS是最容易修复的指标:
1. 所有图片设置宽高:
• 使用width和height属性
• 或使用CSS aspect-ratio预留空间
2. 避免Base64内联:
• 超过10KB的图片不要内联
• 会增加HTML大小,延迟渲染
实战案例:给所有图片加上宽高,CLS从0.35降到0.05。 - 4
步骤4: P1优先级:代码分割和资源优化
代码分割和资源优化:
1. 路由级别代码分割:
• React:React.lazy()
• Vue:defineAsyncComponent()
• 按路由拆分代码
2. 长任务拆分:
• 使用requestIdleCallback
• 避免阻塞主线程
3. CSS优化:
• 关键CSS内联
• 非关键CSS延迟加载
实战案例:管理后台从1.2MB降到首屏200KB,INP从450ms降到180ms。 - 5
步骤5: P1优先级:字体和服务器优化
字体和服务器优化:
1. 字体优化:
• 使用font-display:swap避免FOIT
• preload关键字体
• 使用系统字体或Variable Font
2. 服务器优化:
• 使用CDN加速静态资源
• SSR/SSG优化TTFB
• 数据库查询优化 - 6
步骤6: P2优先级:高级优化
高级优化(ROI中等,难度高):
1. 服务端渲染:
• SSR或SSG优化首屏加载
• 减少客户端渲染时间
2. Web Workers:
• 处理复杂计算
• 避免阻塞主线程
3. 布局优化:
• 避免在现有内容上方插入内容
• 使用fixed定位
• 动画使用transform而非top/left
1. 图片优化(ROI: ⭐⭐⭐⭐⭐)
这是最重要的优化点,占LCP问题的70%以上。我每次做性能优化都从图片开始。
a) 使用现代图片格式
别小看图片格式,从JPEG换成AVIF,一张图能省300KB。
<!-- 方案1:使用<picture>标签,浏览器自动选择最优格式 -->
<picture>
<source srcset="hero.avif" type="image/avif">
<source srcset="hero.webp" type="image/webp">
<img src="hero.jpg" alt="Hero image"> <!-- fallback,老浏览器用 -->
</picture>
// 方案2:Next.js自动优化(推荐)
import Image from 'next/image'
<Image
src="/hero.jpg"
width={1200}
height={600}
priority // 重点:LCP图片必须加priority,不要懒加载!
/>
真实数据给你看:
- AVIF比JPEG压缩率高41%
- WebP比JPEG压缩率高30%
- 实战案例:我优化过一个电商首页,hero图从500KB降到120KB(AVIF格式),LCP从4.2秒降到2.1秒,直接砍半!
b) 图片懒加载(除LCP图片)
这里有个坑我踩过:把LCP图片也懒加载了,结果得分反而降了。
<!-- ❌ 错误示范:LCP图片不要懒加载! -->
<img src="hero.jpg" loading="lazy">
<!-- ✅ 正确做法:首屏大图用eager,其他图片才懒加载 -->
<img src="hero.jpg" loading="eager"> <!-- LCP图片 -->
<img src="product1.jpg" loading="lazy"> <!-- 下方图片才懒加载 -->
<img src="product2.jpg" loading="lazy">
记住:首屏能看到的图片,一张都不要懒加载。懒加载是给首屏外的图片用的。
c) 响应式图片
移动端用户不需要加载桌面大图,srcset能帮你节省60%的流量。
<img
src="hero-800w.jpg"
srcset="hero-400w.jpg 400w,
hero-800w.jpg 800w,
hero-1200w.jpg 1200w"
sizes="(max-width: 600px) 400px,
(max-width: 1000px) 800px,
1200px"
alt="Hero"
/>
真实效果:移动端用户加载400w的图片而不是1200w的,LCP能提升1秒。
d) 图片CDN和预加载
CDN不是奢侈品,是必需品。阿里云OSS一年才几十块钱。
<!-- Preload关键图片,让浏览器优先加载 -->
<link rel="preload" as="image" href="hero.jpg">
<!-- 使用图片CDN(自动格式转换+压缩) -->
<!-- 腾讯云COS、阿里云OSS、Cloudflare Images都支持 -->
<img src="https://cdn.example.com/hero.jpg?x-oss-process=image/format,webp/quality,80">
e) 图片尺寸和压缩
工具推荐:
- TinyPNG:在线压缩,简单粗暴
- ImageOptim:Mac神器,批量压缩
- Squoosh:Google出品,支持AVIF
压缩规则: - 首屏大图质量80%(视觉差别很小)
- 其他图片70%(够用了)
- 尺寸按设计稿的2倍宽度(适配高分辨率屏幕)
f) 避免Base64内联大图
// ❌ 不要内联大图(超过10KB)
// 这样会增加HTML体积,延迟渲染
const heroImage = 'data:image/jpeg;base64,/9j/4AAQSkZJRg...' // 500KB
// ✅ 小图标才用Base64(少于10KB)
// 比如loading图标、简单的SVG图标
const icon = 'data:image/svg+xml;base64,PHN2ZyB3aWR...' // 2KB
2. 服务器响应时间优化(ROI: ⭐⭐⭐⭐)
a) 使用CDN
所有静态资源都上CDN,HTML也可以CDN缓存(结合SSG/ISR)。我见过从200ms TTFB降到50ms的案例,用户体感明显。
b) 服务端渲染(SSR)或静态生成(SSG)
// Next.js - 静态生成(首选,性能最好)
export async function getStaticProps() {
const data = await fetchData()
return {
props: { data },
revalidate: 60 // ISR:60秒后重新生成
}
}
// 或者服务端渲染(数据实时性要求高时用)
export async function getServerSideProps() {
const data = await fetchData()
return { props: { data } }
}
c) 数据库查询优化
- 添加索引(别忘了explain分析)
- 使用Redis缓存热点数据
- 避免N+1查询(用join或者dataloader)
3. 资源加载优化(ROI: ⭐⭐⭐)
a) 关键CSS内联
<!-- 首屏关键CSS内联到<head>,避免阻塞渲染 -->
<style>
.hero {
width: 100%;
height: 600px;
background: #f0f0f0;
}
.nav {
position: fixed;
top: 0;
width: 100%;
}
</style>
<!-- 非关键CSS延迟加载 -->
<link rel="preload" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="styles.css"></noscript>
b) 字体优化
/* 使用font-display避免FOIT(Flash of Invisible Text) */
@font-face {
font-family: 'CustomFont';
src: url('font.woff2') format('woff2');
font-display: swap; /* 立即显示fallback字体,避免白屏 */
}
<!-- Preload关键字体 -->
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>
第三章:INP优化 - 让交互更流畅
第三方脚本是INP的头号杀手!我见过最夸张的:一个页面加载了12个第三方脚本,Google Analytics、Facebook Pixel、客服插件、广告脚本…INP直接800ms+。
1. JavaScript执行优化(ROI: ⭐⭐⭐⭐)
a) 代码分割(Code Splitting)
代码分割听起来高大上,其实就是”按需加载”,用户点哪个页面才加载哪个页面的代码。
// React - 路由级别代码分割
import { lazy, Suspense } from 'react'
const Dashboard = lazy(() => import('./Dashboard'))
const Profile = lazy(() => import('./Profile'))
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<Routes>
<Route path="/dashboard" element={<Dashboard />} />
<Route path="/profile" element={<Profile />} />
</Routes>
</Suspense>
)
}
// Vue 3 - 同样支持异步组件
const Dashboard = defineAsyncComponent(() => import('./Dashboard.vue'))
真实效果:某管理后台从1.2MB降到首屏200KB,INP从450ms降到180ms。用户打开页面快了一倍多。
b) 长任务拆分
主线程被阻塞超过50ms就是长任务,会导致INP飙升。
// ❌ 阻塞主线程的长任务(卡死)
function processLargeData(data) {
for (let i = 0; i < 10000; i++) {
// 复杂计算,一次性处理1万条
heavyCalculation(data[i])
}
}
// ✅ 使用requestIdleCallback拆分成小任务
function processLargeData(data) {
let index = 0
function processChunk() {
const chunkSize = 100 // 每次处理100条
let count = 0
while (index < data.length && count < chunkSize) {
heavyCalculation(data[index])
index++
count++
}
if (index < data.length) {
// 还没处理完,下次空闲时继续
requestIdleCallback(processChunk)
}
}
requestIdleCallback(processChunk)
}
c) 使用Web Workers
把复杂计算移到Worker,不阻塞主线程。
// worker.js
self.onmessage = (e) => {
const result = complexCalculation(e.data) // 复杂计算在Worker里跑
self.postMessage(result)
}
// main.js
const worker = new Worker('worker.js')
worker.postMessage(data)
worker.onmessage = (e) => {
console.log('Result:', e.data)
// 拿到结果,更新UI
}
2. 第三方脚本优化(ROI: ⭐⭐⭐⭐⭐)
第三方脚本就像请客吃饭,人来得越多越乱。每个脚本都想抢资源。
a) 延迟加载非关键脚本
<!-- ❌ 阻塞加载(会卡住页面渲染) -->
<script src="analytics.js"></script>
<!-- ✅ 延迟到页面加载完成 -->
<script defer src="analytics.js"></script>
<!-- ✅ 或者手动延迟3秒(更激进) -->
<script>
window.addEventListener('load', () => {
setTimeout(() => {
const script = document.createElement('script')
script.src = 'analytics.js'
document.body.appendChild(script)
}, 3000) // 用户浏览3秒后再加载分析脚本
})
</script>
b) 使用Facade模式延迟加载重量级组件
YouTube视频embed有1MB+,直接加载会严重拖慢INP。
// YouTube轻量级封面,点击才加载真实视频
function VideoFacade({ videoId }) {
const [showVideo, setShowVideo] = useState(false)
if (!showVideo) {
return (
<div
className="video-facade"
style={{
backgroundImage: `url(https://i.ytimg.com/vi/${videoId}/maxresdefault.jpg)`,
cursor: 'pointer'
}}
onClick={() => setShowVideo(true)}
>
<button className="play-button">▶ 播放视频</button>
</div>
)
}
return <iframe src={`https://www.youtube.com/embed/${videoId}`} />
}
真实效果:某博客页面移除YouTube自动embed,INP从650ms降到220ms。
3. 事件处理优化(ROI: ⭐⭐⭐)
a) 防抖和节流
import { debounce, throttle } from 'lodash'
// 搜索框防抖(用户停止输入300ms后才触发)
const handleSearch = debounce((value) => {
fetchSearchResults(value)
}, 300)
// 滚动事件节流(每100ms最多触发一次)
const handleScroll = throttle(() => {
updateScrollPosition()
}, 100)
b) 使用Passive事件监听
// 提升滚动性能,告诉浏览器不会调用preventDefault
window.addEventListener('scroll', handleScroll, { passive: true })
window.addEventListener('touchmove', handleTouch, { passive: true })
第四章:CLS优化 - 避免画面抖动
CLS就像看书时有人突然把书往上推,你得重新找刚才看的那行,超级烦。好消息是,CLS是最容易修的。
1. 图片和视频设置尺寸(ROI: ⭐⭐⭐⭐⭐)
图片不设宽高是CLS的头号元凶,但也是最容易修的。
<!-- ❌ 没设宽高,加载时会抖动 -->
<img src="photo.jpg" alt="Photo">
<!-- ✅ 设置宽高,浏览器提前预留空间 -->
<img src="photo.jpg" width="800" height="600" alt="Photo">
<!-- ✅ 或使用CSS aspect-ratio(现代浏览器支持) -->
<style>
img {
width: 100%;
aspect-ratio: 16 / 9;
}
</style>
真实案例:某新闻网站给所有图片加上宽高,CLS从0.35降到0.05。就这么简单。
2. 字体加载优化(ROI: ⭐⭐⭐⭐)
a) 使用font-display: swap
@font-face {
font-family: 'CustomFont';
src: url('font.woff2') format('woff2');
font-display: swap; /* 避免FOIT(字体加载时的白屏) */
}
b) Preload关键字体
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>
c) 使用系统字体或Variable Font
/* 系统字体,无需加载,零延迟 */
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
/* Variable Font,一个文件包含所有字重(100-900) */
@font-face {
font-family: 'Inter';
src: url('Inter-Variable.woff2') format('woff2-variations');
font-weight: 100 900;
}
3. 动态内容预留空间(ROI: ⭐⭐⭐⭐)
a) 广告位预留空间
.ad-container {
min-height: 250px; /* 预留广告高度,广告加载前也不会抖 */
background: #f0f0f0; /* 占位背景 */
}
b) 骨架屏(Skeleton Screen)
骨架屏不只是好看,更重要的是稳定布局。
// 加载前显示骨架屏,避免内容突然出现导致布局抖动
function ProductCard({ loading, data }) {
if (loading) {
return (
<div className="skeleton">
<div className="skeleton-image" style={{ width: '100%', height: '200px', background: '#e0e0e0' }} />
<div className="skeleton-title" style={{ width: '80%', height: '20px', background: '#e0e0e0', margin: '10px 0' }} />
<div className="skeleton-price" style={{ width: '40%', height: '20px', background: '#e0e0e0' }} />
</div>
)
}
return (
<div className="product">
<img src={data.image} alt={data.title} />
<h3>{data.title}</h3>
<p>{data.price}</p>
</div>
)
}
4. 避免在现有内容上方插入内容(ROI: ⭐⭐⭐⭐⭐)
// ❌ 在顶部插入banner,导致页面内容下移(CLS爆炸)
<div>
{showBanner && <Banner />}
<Content />
</div>
// ✅ 使用fixed定位,不影响布局
<div>
{showBanner && <Banner style={{ position: 'fixed', top: 0, zIndex: 1000 }} />}
<Content style={{ marginTop: showBanner ? '60px' : '0' }} />
</div>
5. 动画使用transform而非top/left(ROI: ⭐⭐⭐)
我见过有人为了炫技用top做动画,结果CLS爆表。
/* ❌ 触发layout,导致CLS */
.element {
position: relative;
animation: slideIn 0.3s;
}
@keyframes slideIn {
from { top: -100px; } /* 改变top会触发重排 */
to { top: 0; }
}
/* ✅ 使用transform,只触发composite(GPU加速) */
.element {
animation: slideIn 0.3s;
}
@keyframes slideIn {
from { transform: translateY(-100px); }
to { transform: translateY(0); }
}
第五章:综合实战 - 完整优化流程
优先级很重要,别一上来就搞SSR,先把图片优化做好。我第一次优化时,光是给图片加宽高就提升了10分,真的是白捡的分。
优化优先级矩阵
| 优化项 | ROI | 难度 | 优先级 |
|---|---|---|---|
| 图片添加宽高 | 极高 | 极低 | P0 |
| 图片格式转换 | 极高 | 低 | P0 |
| LCP图片优化 | 极高 | 低 | P0 |
| 第三方脚本延迟 | 极高 | 低 | P0 |
| 字体优化 | 高 | 低 | P1 |
| 代码分割 | 高 | 中 | P1 |
| CDN | 高 | 低 | P1 |
| SSR/SSG | 中 | 高 | P2 |
| Web Workers | 低 | 高 | P3 |
检测工具和命令
# 1. Lighthouse(最权威)
# Chrome DevTools > Lighthouse > Generate report
# 记得用隐私模式,不然Chrome扩展会干扰得分
# 2. WebPageTest(真实设备测试)
# https://webpagetest.org
# 可以选择不同地区、不同网络速度
# 3. Chrome DevTools Performance面板
# 录制加载过程,分析瓶颈
# 能看到每个任务的耗时
# 4. npm包分析
npx webpack-bundle-analyzer
# 可视化显示哪个包最大
# 5. 图片分析
npx sharp-cli info image.jpg
# 查看图片尺寸、格式、大小
避坑指南
- ❌ 不要在生产环境测试Lighthouse(使用隐私模式或禁用扩展)
- ❌ 不要只测试一次(至少测试3次取平均值,网络波动很大)
- ❌ 不要只测试桌面端(移动端更重要,75%的流量来自移动端)
- ❌ 不要忽略Network throttling(模拟慢速网络,Fast 3G)
- ❌ LCP图片千万不要懒加载(我踩过这个坑)
结尾总结
性能优化不是一次性工作,是持续的过程。就像健身,需要坚持和自律。但当你看到Lighthouse得分从60到90的那一刻,真的很有成就感。
性能优化不只是技术活,更是对用户体验的尊重。每优化1秒,就能多留住一批用户。移动端用户的耐心只有3秒,而你现在有能力把这3秒缩短到1秒。
共勉:让每个用户都能享受丝滑的浏览体验。
常见问题
Core Web Vitals三大指标的标准是什么?
• 少于2.5秒优秀,2.5-4秒需改进,超过4秒差
INP(交互到下次绘制):
• 少于200ms优秀,200-500ms需改进,超过500ms差
• 2024年3月INP替代FID成为核心指标
CLS(累积布局偏移):
• 少于0.1优秀,0.1-0.25需改进,超过0.25差
关键数据:
• 页面加载时间从3秒增加到5秒,跳出率会增加38%
• 移动端加载超过3秒,53%的用户会直接离开
• 优化好LCP,转化率能提升7-15%
如何优化LCP(最大内容绘制)?
1) 使用现代图片格式(AVIF压缩率高41%,WebP高30%)
• 实战案例hero图从500KB降到120KB,LCP从4.2秒降到2.1秒
2) LCP图片必须加priority不要懒加载,首屏大图用eager
3) 响应式图片srcset节省60%流量
4) 使用CDN和preload关键图片
5) 服务器响应时间优化(CDN、SSR/SSG、数据库查询优化)
优先级:图片优化ROI最高,投入少见效快。
如何优化INP(交互到下次绘制)?
1) 代码分割(路由级别,React lazy、Vue defineAsyncComponent)
• 实战案例从1.2MB降到首屏200KB,INP从450ms降到180ms
2) 第三方脚本延迟加载(defer或手动延迟3秒),使用Facade模式延迟加载重量级组件
3) 移除自动嵌入的第三方内容(如YouTube自动embed,INP从650ms降到220ms)
4) 长任务拆分使用requestIdleCallback
5) 使用Web Workers处理复杂计算
6) 防抖节流和Passive事件监听
如何优化CLS(累积布局偏移)?
1) 图片设置宽高(width和height属性或CSS aspect-ratio)
• 实战案例CLS从0.35降到0.05
2) 字体优化(font-display:swap避免FOIT,preload关键字体,使用系统字体或Variable Font)
3) 动态内容预留空间(广告位min-height,骨架屏稳定布局)
4) 避免在现有内容上方插入内容(使用fixed定位)
5) 动画使用transform而非top/left(只触发composite不触发layout)
性能优化的优先级是什么?
• 图片添加宽高
• 图片格式转换(AVIF/WebP)
• LCP图片优化(priority不懒加载)
• 第三方脚本延迟加载
P1优先级(ROI高):
• 字体优化(font-display:swap)
• 代码分割
• CDN
P2优先级(ROI中,难度高):
• SSR/SSG
P3优先级(ROI低,难度高):
• Web Workers
建议:先做P0,光是给图片加宽高就能提升10分,白捡的分。不要一上来就搞SSR,先把图片优化做好。
LCP图片可以懒加载吗?
LCP图片(首屏大图)必须加priority或loading="eager",不要懒加载。懒加载是给首屏外的图片用的。
错误做法:
<img src="hero.jpg" loading="lazy">会导致LCP得分反而降了
正确做法:
• 首屏大图用eager,其他图片才懒加载
• 记住:首屏能看到的图片,一张都不要懒加载
如何检测和测试Core Web Vitals?
1) Lighthouse(Chrome DevTools,最权威,记得用隐私模式避免扩展干扰)
2) WebPageTest(真实设备测试,可选择不同地区、网络速度)
3) Chrome DevTools Performance面板(录制加载过程分析瓶颈)
4) webpack-bundle-analyzer(可视化显示哪个包最大)
5) sharp-cli info(查看图片尺寸、格式、大小)
避坑:
• 不要在生产环境测试
• 不要只测试一次(至少3次取平均值)
• 不要只测试桌面端(移动端更重要,75%流量来自移动端)
• 不要忽略Network throttling(模拟慢速网络)
10 分钟阅读 · 发布于: 2025年11月24日 · 修改于: 2026年1月22日
相关文章
Next.js 电商实战:购物车与 Stripe 支付完整实现指南
Next.js 电商实战:购物车与 Stripe 支付完整实现指南
Next.js 文件上传完整指南:S3/七牛云预签名URL直传实战
Next.js 文件上传完整指南:S3/七牛云预签名URL直传实战
Next.js 单元测试实战:Jest + React Testing Library 完整配置指南

评论
使用 GitHub 账号登录后即可评论