You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:27:02