前言
性能是用户体验的关键!今天我们来学习如何用AI辅助性能分析和优化。
这一篇,我们会学习:
- 性能指标和测量方法
- AI辅助性能分析
- 常见性能优化技巧
- 性能监控和持续改进
1. 性能指标
1.1 Web Vital指标
| 指标 | 说明 | 优秀值 |
|---|---|---|
| LCP (Largest Contentful Paint) | 最大内容绘制 | ≤2.5s |
| FID (First Input Delay) | 首次输入延迟 | ≤100ms |
| CLS (Cumulative Layout Shift) | 累积布局偏移 | ≤0.1 |
| TTI (Time To Interactive) | 可交互时间 | ≤3.8s |
| TBT (Total Blocking Time) | 总阻塞时间 | ≤200ms |
1.2 测量工具
- 🔦 Lighthouse - 综合性能审计
- 📊 Chrome DevTools - 性能分析面板
- 📱 WebPageTest - 真实环境测试
- 🔄 Lighthouse CI - 持续性能监控
2. 实战:性能分析与优化
2.1 实战1:图片优化
有问题的代码
tsx
// ❌ 未优化的图片
import React from 'react';
function Gallery() {
return (
<div>
{/* 没有尺寸限制,没有懒加载 */}
<img src="big-image.jpg" alt="示例图片" />
<img src="another-big-image.jpg" alt="另一张图片" />
{/* 使用PNG而不是WebP */}
</div>
);
}
AI优化建议
🔍 性能分析报告:
1. 图片太大,没有优化格式
2. 没有懒加载
3. 没有响应式图片
4. 没有占位图
✅ 优化方案:
1. 使用WebP/AVIF格式
2. 启用懒加载
3. 使用响应式图片
4. 添加低质量占位图
优化后的代码
tsx
// ✅ 优化后的图片
import React from 'react';
import Image from 'next/image';
function Gallery() {
return (
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
{/* 使用Next.js Image组件优化 */}
<Image
src="/big-image.webp" // 使用WebP格式
alt="示例图片"
width={800}
height={600}
loading="lazy" // 懒加载
placeholder="blur" // 模糊占位
blurDataURL="data:image/jpeg;base64,/9j/4AAQSkZJRg..."
quality={80}
sizes="(max-width: 768px) 100vw, 50vw"
/>
<Image
src="/another-big-image.webp"
alt="另一张图片"
width={800}
height={600}
loading="lazy"
placeholder="blur"
quality={80}
/>
</div>
);
}
2.2 实战2:React性能优化
有问题的代码
tsx
// ❌ 性能问题代码
import React, { useState } from 'react';
function ExpensiveList({ items }) {
// 每次渲染都重新计算
const filteredItems = items.filter(item => {
console.log('Filtering...'); // 看看会执行多少次
return item.price > 100;
});
// 每次渲染都创建新函数
const handleItemClick = (item) => {
console.log('Clicked:', item);
};
return (
<div>
{filteredItems.map(item => (
<div key={item.id} onClick={() => handleItemClick(item)}>
{/* 昂贵的组件 */}
<ExpensiveComponent item={item} />
</div>
))}
</div>
);
}
function ExpensiveComponent({ item }) {
// 每次父组件渲染,这里都会重新渲染
console.log('ExpensiveComponent rendered');
return <div>{item.name}</div>;
}
AI优化方案
tsx
// ✅ 优化后的代码
import React, { useState, useMemo, useCallback, memo } from 'react';
// 使用memo避免不必要的渲染
const ExpensiveComponent = memo(({ item }) => {
console.log('ExpensiveComponent rendered');
return <div>{item.name}</div>;
});
function ExpensiveList({ items }) {
// 使用useMemo缓存计算结果
const filteredItems = useMemo(() => {
console.log('Filtering...');
return items.filter(item => item.price > 100);
}, [items]); // 只在items变化时重新计算
// 使用useCallback缓存函数
const handleItemClick = useCallback((item) => {
console.log('Clicked:', item);
}, []); // 没有依赖,函数永远不会变
return (
<div>
{filteredItems.map(item => (
<div key={item.id} onClick={() => handleItemClick(item)}>
<ExpensiveComponent item={item} />
</div>
))}
</div>
);
}
2.3 实战3:代码分割优化
优化前
tsx
// ❌ 全部打包在一起
import React from 'react';
import { AdminPanel } from './AdminPanel'; // 很大的组件
import { UserProfile } from './UserProfile';
import { Settings } from './Settings';
function App() {
return (
<div>
<AdminPanel />
<UserProfile />
<Settings />
</div>
);
}
优化后
tsx
// ✅ 懒加载,代码分割
import React, { Suspense, lazy } from 'react';
// 懒加载组件
const AdminPanel = lazy(() => import('./AdminPanel'));
const UserProfile = lazy(() => import('./UserProfile'));
const Settings = lazy(() => import('./Settings'));
function App() {
const [activeTab, setActiveTab] = useState('user');
return (
<div>
<nav>
<button onClick={() => setActiveTab('admin')}>管理员</button>
<button onClick={() => setActiveTab('user')}>用户</button>
<button onClick={() => setActiveTab('settings')}>设置</button>
</nav>
{/* Suspense显示加载状态 */}
<Suspense fallback={<div className="p-8 text-center">加载中...</div>}>
{activeTab === 'admin' && <AdminPanel />}
{activeTab === 'user' && <UserProfile />}
{activeTab === 'settings' && <Settings />}
</Suspense>
</div>
);
}
3. 性能优化清单
3.1 加载性能优化
- ✅ 图片压缩和格式优化
- ✅ 启用Gzip/Brotli压缩
- ✅ 使用CDN加速
- ✅ 代码分割和懒加载
- ✅ 预加载关键资源
3.2 运行时性能优化
- ✅ 避免不必要的渲染
- ✅ 使用Web Worker处理复杂计算
- ✅ 虚拟列表处理大数据
- ✅ 防抖和节流
- ✅ 使用React Compiler自动优化
3.3 缓存策略
typescript
// service-worker.js
self.addEventListener('install', event => {
event.waitUntil(
caches.open('v1').then(cache => {
return cache.addAll([
'/',
'/styles.css',
'/script.js'
]);
})
);
});
4. 今日小结
在这一篇中,我们学习了:
- 性能指标和测量工具
- 图片优化
- React性能优化
- 代码分割和懒加载
- 性能优化清单
5. 下篇预告
最后一篇!我们将学习:AI时代的开发者工作流重构