Next.js中JSON文件应存于何处可随时调取,Vercel部署public目录失效如何解决
问题原因
Vercel 部署后的 Serverless 运行环境文件系统为只读状态,仅支持读取构建阶段生成的静态文件,运行时调用fs写入public目录的操作会被禁止,这就是本地开发正常、线上失效的核心原因。另外 Vercel 运行时仅允许向/tmp临时目录写入内容,但该目录内容无法通过公网静态访问,且不同 Serverless 实例之间不共享,无法满足你的需求。
可行解决方案
方案1:构建阶段预生成静态JSON(适用于商品数据更新频率低的场景)
如果你的商品数据更新频率不高(日级/周级更新),直接在项目构建阶段拉取全量商品数据生成JSON文件即可:
- 在项目根目录新建
scripts/generate-products-json.js文件,写入你拉取全量商品、写入public目录的逻辑:
const fs = require('fs') // 这里替换为你拉取全量商品的逻辑 const fetchAllProducts = async () => { const res = await fetch('你的全量商品接口地址') return res.json() } const generate = async () => { const products = await fetchAllProducts() fs.writeFileSync("./public/products.json", JSON.stringify(products, null, 2)) } generate()
- 修改
package.json中的build命令,在Next.js构建前先运行该脚本:
{ "scripts": { "build": "node scripts/generate-products-json.js && next build" } }
构建阶段生成的products.json会被当做静态资源打包,部署后可以直接通过REST API访问,也可以在getStaticProps中直接读取使用。
方案2:运行时缓存全量数据(适用于商品数据更新频率高的场景)
如果商品数据需要实时性,不需要存储静态JSON文件,直接在服务端逻辑里加一层缓存即可:
- 安装轻量缓存库比如
lru-cache,在getServerSideProps或者自定义API路由中拉取全量商品数据后缓存,缓存时间可根据你的更新频率设置(比如15分钟/1小时) - 1600条商品数据体积很小,缓存后读取性能远高于读写静态文件,也不需要额外存储资源,还能避免频繁调用上游商品接口导致限流。
方案3:使用边缘存储存储JSON文件
如果必须要运行时更新可公开访问的JSON文件,可以使用Vercel KV等边缘键值存储服务,拉取到全量商品数据后写入KV,同时设置过期时间,需要读取时直接从KV中调取即可。
内容的提问来源于stack exchange,提问作者Asad Javed
相关产品推荐
相关产品推荐

