1. 静态生成 (SSG) 和增量静态生成 (ISR)
Next.js 支持静态站点生成 (SSG),这意味着页面在构建时就生成 HTML 文件,减少了客户端渲染的负担。使用 getStaticProps
可以在构建时预先获取数据,而增量静态生成 (ISR) 则允许你在不重新构建的情况下,按需更新页面。
如何使用:
js
export async function getStaticProps() {
const data = await fetchData();
return {
props: { data },
revalidate: 10, // 每10秒重新生成页面
};
}
- SSG 提高了页面加载速度,尤其适合博客、文档等不需要频繁更新的内容。
- ISR 让你能够保持静态生成的优势,同时能够根据需要更新页面内容。
2. 服务器端渲染 (SSR)
对于需要频繁更新的页面或依赖实时数据的页面,使用服务器端渲染 (SSR) 能够提高首屏加载的速度,并确保用户在页面加载时看到的是最新的数据。
使用 getServerSideProps
可以在每次请求时获取最新的数据:
js
export async function getServerSideProps() {
const data = await fetchData();
return {
props: { data },
};
}
SSR 优点:
- 数据实时性高,适用于内容频繁变化的页面。
- 对 SEO 友好,适合需要良好 SEO 的页面。
3. 图片优化 (Next.js Image Component)
Next.js 提供了内置的 next/image
组件,可以自动优化图片加载,支持延迟加载 (lazy load)、自动选择最佳格式 (如 WebP) 以及响应式图片。
使用示例:
js
import Image from 'next/image';
<Image
src="/path/to/image.jpg"
alt="Optimized image"
width={500}
height={300}
priority
/>
- 延迟加载 使图片在页面滚动到相应位置时才加载,减少初始加载时间。
- 自动优化 会选择更合适的图片格式,减少带宽消耗。
4. 使用 CDN 缓存
通过将静态资源(如图片、CSS、JS 文件)上传到 CDN,可以减少服务器压力,加快用户请求的响应速度。Next.js 可以结合 Vercel 平台自动实现全局 CDN 缓存,当然你也可以将项目部署到其他 CDN 平台上。
缓存配置:
- 静态资源和图片都可以通过 CDN 提供,减少服务器负担。
- 使用
Cache-Control
标头控制静态资源的缓存时间。
5. Tree Shaking 和 Code Splitting
Next.js 支持自动 Tree Shaking 和 Code Splitting。Tree Shaking 可以移除没有使用的代码,而 Code Splitting 则可以按需加载代码,减少初始包的大小。
通过动态导入模块,你可以进一步优化性能:
js
import dynamic from 'next/dynamic';
const DynamicComponent = dynamic(() => import('../components/HeavyComponent'), {
loading: () => <p>Loading...</p>,
});
- Tree Shaking 减少不必要的代码。
- Code Splitting 根据路由或组件动态加载代码,提高首页的加载速度。
6. 压缩和优化 JavaScript 和 CSS
Next.js 默认集成了 Webpack 和 Terser,用来对 JavaScript 和 CSS 进行压缩和优化。如果你需要进一步优化,可以使用 Webpack 插件或定制构建流程。
如何启用:
js
// next.config.js
module.exports = {
webpack(config) {
if (!config.optimization.minimize) {
config.optimization.minimize = true;
}
return config;
},
};
7. 使用 React 18 并启用并发模式
Next.js 支持 React 18,并通过并发模式来优化应用的响应性。在并发模式下,React 可以打断长时间的渲染任务,从而让用户操作保持流畅。
如何启用:
js
// next.config.js
module.exports = {
reactStrictMode: true,
experimental: {
reactRoot: true, // 启用并发模式
},
};
8. 减少第三方依赖和 Polyfill
尽可能减少不必要的第三方依赖和 polyfill,这些都会增加 JavaScript 包的大小。你可以使用工具如 webpack-bundle-analyzer
来分析包的大小,找到可以优化的部分。
如何使用:
bash
pnpm add webpack-bundle-analyzer --dev
并在 next.config.js
中配置:
js
const withBundleAnalyzer = require('@next/bundle-analyzer')({
enabled: process.env.ANALYZE === 'true',
});
module.exports = withBundleAnalyzer({});
9. 启用 HTTP/2 和 Brotli 压缩
HTTP/2 提供了多路复用、头部压缩等功能,可以显著提高加载性能。Brotli 压缩比传统的 Gzip 更高效,能够进一步减少文件体积。
如果你使用 Vercel 部署,这些优化会默认启用。如果自己部署,需要在服务器配置上手动启用这些功能。
10. 开启静态资源的预加载
通过 next/head
标签,你可以在 Next.js 页面中预加载关键的 CSS、JS 文件,这可以确保页面在需要时能尽快加载这些资源。
使用示例:
js
import Head from 'next/head';
<Head>
<link rel="preload" href="/static/style.css" as="style" />
<link rel="preload" href="/static/script.js" as="script" />
</Head>