开发环境
- 策略:简化版本控制,便于快速发现静态文件更改,无需复杂的缓存策略。可直接禁用缓存或使用简单的文件名版本。
- 实现方式:
- Next.js 配置:在
next.config.js
中设置 assetPrefix
为一个随机字符串或者开发版本号,例如:
module.exports = {
assetPrefix: `?v=${new Date().getTime()}`
}
- 代码示例:在页面中引入静态文件时,手动添加版本参数。假设在
pages/index.js
中引入一个 CSS 文件 styles.css
,可以这样写:
import Link from 'next/link';
import Head from 'next/head';
export default function Home() {
return (
<div>
<Head>
<link rel="stylesheet" href="/styles.css?v={new Date().getTime()}" />
</Head>
<h1>Home Page</h1>
</div>
);
}
生产环境
- 策略:利用内容哈希(content hash)来版本化静态文件,实现浏览器长期缓存。当文件内容改变时,文件名中的哈希值也会改变,强制浏览器重新下载新文件。
- 实现方式:
- Next.js 默认支持:Next.js 会自动为静态文件生成基于内容哈希的文件名。例如,
styles.css
会被编译成类似 styles.[contenthash].css
的形式。在 HTML 中引入该文件时,Next.js 会自动替换为正确的带哈希文件名。
- CDN 配置:结合 CDN 使用时,配置 CDN 对静态文件进行长期缓存。例如,在 AWS S3 与 CloudFront 配置中,设置 CloudFront 的缓存策略,对静态文件设置较长的缓存时间(如一年)。同时,确保当文件内容变化时,新的文件会以新的哈希值上传到 S3,CloudFront 会因为文件名变化而更新缓存。
测试环境
- 策略:介于开发与生产之间,可采用类似生产环境的内容哈希版本控制,但缓存时间可适当缩短,便于测试更新。
- 实现方式:
- Next.js 配置:与生产环境类似,依赖 Next.js 自动生成的内容哈希文件名。在 CDN 配置上,设置较短的缓存时间,比如几天。例如在阿里云 OSS 与 CDN 配置中,在 CDN 控制台设置静态文件缓存时间为 3 天。这样既可以在一定程度上利用缓存提高性能,又能在测试新功能时较快看到静态文件更新效果。