Published on

使用 ISR(增量静态生成)提升页面性能,同时结合缓存优化 API 响应时间

Authors
  • avatar
    Name
    Shelton Ma
    Twitter

1. ISR 的原理

ISR 是 Next.js 的增量静态生成机制,允许你在构建时生成静态页面,并在后续请求时按需更新.

ISR 核心特点

  • 静态性能:首次生成静态页面,性能媲美纯静态站点
  • 增量更新:数据更新后可自动触发静态页面重建
  • 无需重新部署:数据变更后无需手动触发 CI/CD

ISR示例

// pages/chat-history/[id].tsx
import { GetStaticProps, GetStaticPaths } from 'next';
import { fetchChatHistory } from '@/lib/api';

export async function getStaticProps({ params }: { params: { id: string } }) {
  const chatHistory = await fetchChatHistory(params.id);

  return {
    props: { chatHistory },
    revalidate: 60 // 每 60 秒自动重新生成
  };
}

export const getStaticPaths: GetStaticPaths = async () => {
  const chatIds = await fetchChatIDs(); // 示例:获取所有历史对话ID
  return {
    paths: chatIds.map((id) => ({ params: { id } })),
    fallback: 'blocking' // 未静态化的路径按需生成
  };
};

export default function ChatHistoryPage({ chatHistory }: { chatHistory: any }) {
  return (
    <div>
      {chatHistory.map((msg: string, index: number) => (
        <p key={index}>{msg}</p>
      ))}
    </div>
  );
}

2. 缓存优化 API 响应

由于 ISR 仅适用于页面级渲染,对于 API 请求,推荐引入以下缓存策略:

  • Redis → 适用于频繁变动的小型数据 (如 Token 计数、用户状态)
  • CDN 缓存 → 适用于全球访问场景,提高静态资源访问速度
  • HTTP Cache-Control → 适用于快速实现短期缓存
  • Vercel Edge Cache → 结合 ISR 自动缓存,提升动态内容加载速度

3. ISR + 缓存的组合方案 (推荐)

功能/场景推荐方案理由
对话历史(静态数据)ISR(60秒)+Redis缓存频繁访问但变更不频繁,ISR可增量更新
热门推荐内容ISR(300秒)+CDN缓存热门推荐内容较稳定,CDN提高访问速度
AI生成结果(实时数据)Redis+HTTP Cache-Control数据变更较快,使用缓存提高命中率
用户Token/SessionRedis+短期TTL(如5分钟)动态数据,确保实时性
多语言内容ISR(多路径生成)+EdgeCache每种语言生成独立静态页,边缘缓存提速