1、Incremental Static Generation (ISG)
Incremental Static Generation (ISG)
是 Next.js 中的一种静态页面生成策略,允许你为页面设置一个自动再生的时间间隔。通过 getStaticProps
函数中的 revalidate
参数,你可以定义页面在多长时间后再次生成。ISG
结合了静态生成和动态内容更新的优点,适合那些内容不需要频繁更新的页面。
工作流程:
1、页面初次生成
:在构建时或首次访问页面时,Next.js 会生成静态页面,并将其缓存。
2、缓存命中
:在 revalidate 时间间隔内,所有的访问都会返回缓存的静态页面。
3、页面再生
:当超过 revalidate 时间间隔时,下次访问会触发页面再生,这个过程是在后台完成的,旧页面会一直服务直到新页面生成完成。
2、On-Demand Revalidation
On-Demand Revalidation
是对 ISG
的补充,允许开发者通过 API
路由手动触发页面的重新生成,而不需要等待 revalidate
时间间隔。这对那些内容需要即时更新的场景特别有用,比如在用户更新博客文章后立即反映在页面上。
工作流程:
1、手动触发
:通过发送 API 请求到指定的路径,触发某个页面的重新生成。
2、立即再生
:在接收到 API 请求后,Next.js 会立即重新生成指定的页面,并用新的内容替换旧的页面。
3、关系和区别
1、关系:
On-Demand Revalidation
是对 ISG
的扩展。ISG
提供了一个自动再生机制,通过设置固定的时间间隔来重新生成页面。而 On-Demand Revalidation
则允许开发者在需要时,通过 API
请求手动触发页面再生。
2、使用场景:
ISG
适合那些内容更新频率较低的页面,可以设定一个合理的时间间隔,让页面自动再生。
On-Demand Revalidation
适合那些需要即时内容更新的页面,比如内容管理系统(CMS),或者在用户提交内容后需要立即更新页面。
4、示例代码
使用 ISG 的页面:
export const getStaticProps: GetStaticProps = async () => {
const data = await fetchData();
return {
props: {
data,
},
revalidate: 60, // 每60秒后再生页面
};
};
On-Demand Revalidation API 路由:
import { NextApiRequest, NextApiResponse } from 'next';
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
const { secret, path } = req.query;
if (secret !== process.env.REVALIDATION_SECRET) {
return res.status(401).json({ message: 'Invalid token' });
}
try {
await res.revalidate(path as string);
return res.json({ revalidated: true });
} catch (err) {
return res.status(500).json({ message: 'Error revalidating' });
}
}
前端触发重新生成:
const revalidatePage = async () => {
await fetch(`/api/revalidate?secret=your_secret_token&path=/blog/2024/07/large-3d-printing`);
};
5、总结
ISG 提供了一个自动化的页面更新机制,适用于那些不需要即时更新的场景。
On-Demand Revalidation 则为需要即时更新内容的场景提供了一种手动触发机制,使得内容可以在更新后立即反映在页面上。
两者结合使用,可以实现灵活而高效的静态内容管理。