解决nextjs网站首次打开加载时间长的问题
- 图片优化:
import Image from 'next/image'
// 使用 Next.js 的 Image 组件替换普通 img 标签
export function OptimizedImage({ src, alt, ...props }) {
return (
<Image
src={src}
alt={alt}
loading="lazy"
placeholder="blur"
blurDataURL="data:image/jpeg;base64,/9j/4AAQSkZJRg..."
{...props}
/>
)
}
- 组件懒加载:
// 将非首屏组件改为懒加载
import dynamic from 'next/dynamic'
const DashboardChart = dynamic(() => import('./DashboardChart'), {
loading: () => <p>Loading...</p>,
ssr: false // 如果组件不需要服务端渲染
})
- 路由预加载:
import { useRouter } from 'next/router'
import Link from 'next/link'
export function Navigation() {
const router = useRouter()
return (
<Link
href="/dashboard"
onMouseEnter={() => router.prefetch('/dashboard')}
>
仪表盘
</Link>
)
}
- 优化字体加载:
import { Inter } from 'next/font/google'
const inter = Inter({
subsets: ['latin'],
display: 'swap',
preload: true,
})
- 添加缓存策略:
import { unstable_cache } from 'next/cache';
export const fetchInvoices = unstable_cache(
async () => {
// 数据库查询逻辑
},
['invoices-cache'],
{
revalidate: 3600, // 1小时后重新验证
tags: ['invoices']
}
)
- 优化 API 请求:
// 使用 SWR 进行数据请求和缓存
import useSWR from 'swr'
export function useInvoices() {
const { data, error } = useSWR('/api/invoices', fetcher, {
revalidateOnFocus: false,
revalidateOnReconnect: false
})
return { data, error }
}
- 添加页面元数据优化:
export const metadata = {
metadataBase: new URL('https://your-site.com'),
alternates: {
canonical: '/',
},
openGraph: {
title: '您的网站',
description: '网站描述',
}
}
- 配置构建优化:
/** @type {import('next').NextConfig} */
const nextConfig = {
compress: true,
poweredByHeader: false,
reactStrictMode: true,
compiler: {
removeConsole: process.env.NODE_ENV === 'production',
},
experimental: {
optimizeCss: true,
},
}
module.exports = nextConfig
其他建议:
- 服务端优化:
- 使用 CDN 分发静态资源
- 启用 Gzip/Brotli 压缩
- 配置适当的缓存策略
- 代码分割:
- 合理使用动态导入
- 避免不必要的大型依赖包
- 使用 bundle 分析工具优化包大小
- 性能监控:
export function reportWebVitals(metric) {
if (metric.label === 'web-vital') {
console.log(metric) // 发送到分析服务
}
}
- 预连接关键域名:
<link rel="preconnect" href="https://your-api-domain.com" />
<link rel="dns-prefetch" href="https://your-api-domain.com" />
- 使用 Service Worker:
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open('v1').then((cache) => {
return cache.addAll([
'/',
'/styles/main.css',
'/scripts/main.js',
])
})
)
})
实施这些优化后,建议:
- 使用 Lighthouse 进行性能测试
- 监控实际用户性能指标
- 根据分析数据持续优化
- 考虑使用 Next.js 的 ISR 或增量静态再生成
- 实施渐进式加载策略
这些优化措施可以显著提升网站的首次加载性能。需要根据具体项目情况选择合适的优化方案。