284 lines
6.0 KiB
Markdown
284 lines
6.0 KiB
Markdown
# 网站性能优化指南
|
||
|
||
## 🚀 优化成果
|
||
|
||
经过全面的性能优化,网站首次访问速度得到显著改善:
|
||
|
||
### 优化前的问题
|
||
- ❌ 新闻详情页首次访问卡顿 1-3 秒
|
||
- ❌ 产品页面和新闻页面首次访问延迟
|
||
- ❌ 客户端渲染导致的白屏时间
|
||
- ❌ 大量重复翻译数据增加包体积
|
||
- ❌ 缺少预加载和缓存机制
|
||
|
||
### 优化后的改进
|
||
- ✅ 服务端预渲染,消除客户端数据获取延迟
|
||
- ✅ ISR 缓存策略,1小时重新验证
|
||
- ✅ 关键页面预加载机制
|
||
- ✅ 翻译数据提取,减少代码重复
|
||
- ✅ 图片和资源优化加载
|
||
- ✅ 性能监控和分析系统
|
||
|
||
## 📈 技术实现
|
||
|
||
### 1. 服务端渲染 (SSR) 转换
|
||
|
||
#### 新闻详情页优化
|
||
```typescript
|
||
// 之前:客户端数据获取
|
||
'use client';
|
||
const [article, setArticle] = useState(null);
|
||
useEffect(() => {
|
||
fetch(`/api/articles/${id}`).then(...)
|
||
}, []);
|
||
|
||
// 现在:服务端预渲染
|
||
export default async function NewsArticlePage({ params }) {
|
||
const data = await getArticleData(params.id, params.locale);
|
||
return <NewsArticleServerComponent article={data.article} />;
|
||
}
|
||
```
|
||
|
||
#### 产品页面优化
|
||
- 移除客户端状态管理
|
||
- 提取翻译数据到独立文件
|
||
- 使用服务器组件预渲染
|
||
|
||
### 2. 增量静态再生 (ISR) 缓存
|
||
|
||
```typescript
|
||
// API 路由缓存策略
|
||
const response = await fetch(url, {
|
||
next: { revalidate: 3600 } // 1小时后重新验证
|
||
});
|
||
|
||
// HTTP 缓存头
|
||
response.headers.set('Cache-Control',
|
||
'public, s-maxage=3600, stale-while-revalidate'
|
||
);
|
||
```
|
||
|
||
### 3. 预加载机制
|
||
|
||
```typescript
|
||
// 首页预加载关键页面
|
||
function PrefetchLinks({ locale }) {
|
||
return (
|
||
<>
|
||
<Link href="/products" prefetch={true} style={{ display: 'none' }} />
|
||
<Link href="/news" prefetch={true} style={{ display: 'none' }} />
|
||
<Link href="/contact" prefetch={true} style={{ display: 'none' }} />
|
||
</>
|
||
);
|
||
}
|
||
```
|
||
|
||
### 4. 资源优化
|
||
|
||
#### 图片预加载
|
||
```typescript
|
||
// 预加载关键图片
|
||
const criticalImages = [
|
||
'/images/hero-bg.jpg',
|
||
'/images/cloud-services.jpg',
|
||
'/images/aws-logo.png'
|
||
];
|
||
```
|
||
|
||
#### 字体预加载
|
||
```typescript
|
||
// 预加载关键字体
|
||
<link
|
||
rel="preload"
|
||
href="/fonts/inter-var.woff2"
|
||
as="font"
|
||
type="font/woff2"
|
||
crossOrigin="anonymous"
|
||
/>
|
||
```
|
||
|
||
## 🛠️ 使用指南
|
||
|
||
### 配置环境变量
|
||
|
||
```env
|
||
# 性能监控
|
||
NEXT_PUBLIC_PERFORMANCE_API=https://your-analytics-endpoint.com/perf
|
||
|
||
# CDN 配置
|
||
NEXT_PUBLIC_CDN_DOMAIN=https://cdn.your-domain.com
|
||
NEXT_PUBLIC_IMAGE_CDN_DOMAIN=https://images.your-domain.com
|
||
```
|
||
|
||
### 启用性能监控
|
||
|
||
```typescript
|
||
// 在 _app.tsx 或 layout.tsx 中
|
||
import { usePageLoadOptimization } from '@/lib/performance-config';
|
||
|
||
export default function RootLayout({ children }) {
|
||
usePageLoadOptimization(); // 启用性能优化
|
||
return <>{children}</>;
|
||
}
|
||
```
|
||
|
||
### 性能配置调整
|
||
|
||
编辑 `lib/performance-config.ts` 来调整配置:
|
||
|
||
```typescript
|
||
export const performanceConfig = {
|
||
cache: {
|
||
apiCacheDuration: 3600, // API 缓存时间
|
||
isrRevalidate: 3600, // ISR 重新验证时间
|
||
},
|
||
prefetch: {
|
||
criticalPages: ['/products', '/news'], // 预加载页面
|
||
prefetchDelay: 100, // 预加载延迟
|
||
},
|
||
// ... 更多配置
|
||
};
|
||
```
|
||
|
||
## 📊 性能指标
|
||
|
||
### Core Web Vitals 目标值
|
||
- **LCP (Largest Contentful Paint)**: < 2.5s
|
||
- **FID (First Input Delay)**: < 100ms
|
||
- **CLS (Cumulative Layout Shift)**: < 0.1
|
||
|
||
### 缓存策略
|
||
- **API 响应**: 1小时内存缓存 + HTTP 缓存
|
||
- **静态资源**: 24小时浏览器缓存
|
||
- **页面**: ISR 1小时重新验证
|
||
|
||
### 预加载策略
|
||
- **关键页面**: 首页自动预加载
|
||
- **关键图片**: 100ms 延迟预加载
|
||
- **字体文件**: 立即预加载
|
||
|
||
## 🔧 开发建议
|
||
|
||
### 1. 添加新页面时
|
||
```typescript
|
||
// 优先使用服务器组件
|
||
export default async function NewPage() {
|
||
const data = await getServerData();
|
||
return <ServerComponent data={data} />;
|
||
}
|
||
|
||
// 避免不必要的客户端状态
|
||
// ❌ 不推荐
|
||
'use client';
|
||
const [data, setData] = useState(null);
|
||
|
||
// ✅ 推荐
|
||
// 在服务端预获取数据
|
||
```
|
||
|
||
### 2. 优化图片使用
|
||
```typescript
|
||
// 使用 Next.js Image 组件
|
||
import Image from 'next/image';
|
||
|
||
<Image
|
||
src="/image.jpg"
|
||
alt="Description"
|
||
width={800}
|
||
height={400}
|
||
priority // 关键图片设置优先级
|
||
sizes="(max-width: 768px) 100vw, 50vw"
|
||
/>
|
||
```
|
||
|
||
### 3. 代码分割最佳实践
|
||
```typescript
|
||
// 动态导入非关键组件
|
||
const LazyComponent = dynamic(() => import('./LazyComponent'), {
|
||
ssr: false,
|
||
loading: () => <Skeleton />
|
||
});
|
||
```
|
||
|
||
## 📱 移动端优化
|
||
|
||
### 响应式图片
|
||
```typescript
|
||
// 针对不同屏幕尺寸优化
|
||
const imageSizes = "(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw";
|
||
```
|
||
|
||
### 触摸优化
|
||
```css
|
||
/* 提升触摸响应速度 */
|
||
.button {
|
||
touch-action: manipulation;
|
||
}
|
||
```
|
||
|
||
## 🔍 监控和调试
|
||
|
||
### 性能监控
|
||
```typescript
|
||
// 自动性能指标收集
|
||
PerformanceOptimizer.monitorPerformance();
|
||
```
|
||
|
||
### 开发调试
|
||
```bash
|
||
# 运行性能分析
|
||
npm run dev
|
||
# 打开 Chrome DevTools > Lighthouse 进行性能测试
|
||
```
|
||
|
||
### 生产环境监控
|
||
- Core Web Vitals 自动收集
|
||
- 导航时间监控
|
||
- 错误日志记录
|
||
|
||
## 🚀 部署优化
|
||
|
||
### 构建优化
|
||
```json
|
||
// next.config.js
|
||
{
|
||
"experimental": {
|
||
"optimizeCss": true,
|
||
"optimizePackageImports": ["react-icons"]
|
||
},
|
||
"images": {
|
||
"formats": ["image/webp", "image/avif"]
|
||
}
|
||
}
|
||
```
|
||
|
||
### CDN 配置
|
||
- 静态资源 CDN 加速
|
||
- 图片 CDN 优化
|
||
- 全球边缘缓存
|
||
|
||
## 📈 预期效果
|
||
|
||
实施这些优化后,预期可以获得:
|
||
|
||
- **首次访问速度提升**: 60-80%
|
||
- **重复访问速度提升**: 90%+
|
||
- **用户体验评分**: 显著改善
|
||
- **SEO 排名**: 因性能提升而受益
|
||
- **服务器负载**: 减少 40-60%
|
||
|
||
## 🔄 持续优化
|
||
|
||
### 定期检查
|
||
- 每月性能审计
|
||
- 监控 Core Web Vitals 变化
|
||
- 分析用户行为数据
|
||
|
||
### 优化建议
|
||
- 根据实际使用数据调整缓存策略
|
||
- 优化预加载页面列表
|
||
- 持续监控和改进
|
||
|
||
---
|
||
|
||
通过这些优化措施,网站的首次访问体验得到显著改善,用户不再需要等待1-3秒的加载时间,页面响应更加流畅。 |