Vercel生产环境异常:回滚至可用提交仍无法正常运行
错误详情
- 模块导出路径未定义错误:
Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './cjs/stripe.cjs.node.js' is not defined by "exports" in /.../node_modules/stripe/package.jsonError [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './dist/index.cjs' is not defined by "exports" in /.../node_modules/express-rate-limit/package.json - ES模块环境下require未定义错误:尽管项目使用ES6 import语法且
package.json设置"type": "module"(本地运行正常),仍出现ReferenceError: require is not defined in ES module scope。
已采取的排查步骤
- 回滚至之前生产环境可正常运行的提交,问题依旧。
- 确认Node.js版本:本地为v19.6.1,Vercel使用默认18.x版本,两者近期均无变更。
- 检查
package.json依赖与代码中的导入语句,确认配置正确且版本已锁定。
可能的原因及解决方向
Vercel构建缓存污染
Vercel会缓存过往构建产物和依赖,即便回滚代码,旧缓存里的依赖可能未被清理,导致新安装依赖与缓存版本冲突。可在Vercel项目设置的「Build & Development Settings」中手动清除构建缓存,再重新部署。依赖安装环境差异
本地与Vercel的包管理器(npm/yarn)或版本可能不一致,导致依赖安装产物不同。比如本地用npm,Vercel默认用yarn,反之亦然;或npm版本差异引发lock文件解析偏差。可在项目根目录添加vercel.json指定包管理器:{ "installCommand": "npm install" }同时确保本地与Vercel使用相同的包管理器版本。
间接依赖隐性更新
即便锁定了直接依赖版本,间接依赖(依赖的依赖)可能未被锁定,Vercel安装时拉取了更新后的间接依赖,新版本可能修改了导出结构,引发路径错误。生成完整的package-lock.json(或yarn.lock)并提交到仓库,确保所有依赖版本完全锁定。Vercel环境配置隐性变更
Vercel后台可能调整了构建环境默认配置,比如启用更严格的ES模块检查、修改模块解析规则。可在vercel.json中显式指定Node.js版本及运行时:{ "functions": { "api/**/*.js": { "runtime": "@vercel/node@3.0.10" } } }同时检查
.vercelignore文件是否意外排除了必要的依赖文件。ES模块与CommonJS混合解析差异
虽然项目设置了"type": "module",但部分第三方依赖内部仍使用require,Vercel的模块解析逻辑与本地不同,触发错误。可尝试在package.json中添加"exports"字段明确模块导出路径,或在启动命令中加入--experimental-specifier-resolution=node参数(注意兼容性)。
内容的提问来源于stack exchange,提问作者Ulk_

