Vercel部署NextJS时含index.ts的/api目录下路由缺失如何解决
问题成因
- Vercel 针对 Next.js Pages Router 的打包优化缺陷:在 Next.js 12.x ~ 13.2.x 版本对应的官方构建器中,部署时会对同目录下的API路由做lambda合并优化,当某个API目录下存在
index.ts/index.js文件时,优化逻辑会错误将整个目录识别为单一路由入口,直接打包为对应index路由的单个lambda,同目录下的其他独立路由文件会被当作冗余资源过滤,不会注册为独立的路由入口。本地开发时走按需编译逻辑,不会触发该优化,因此仅部署后可复现。 - 边缘路由规则匹配冲突:Vercel 边缘节点的路由规则会优先匹配目录级的
index路由,误将同目录下的其他路径识别为index路由的子路径,不会为其生成独立的路由映射,导致请求无法命中对应逻辑。
可行规避方案
- 方案1:调整目录结构,避免在包含其他路由文件的目录下放置
index路由文件
把需要作为目录根路由的index.ts重命名为和目录同名的文件,上移到父级目录。比如把/api/companies/index.ts改为/api/companies.ts,原目录下保留another-endpoint.ts,调整后结构如下:
该方案改动最小,适配所有Next.js版本,无额外配置成本。/api/companies.ts // 对应路由 /api/companies /api/companies/another-endpoint.ts // 对应路由 /api/companies/another-endpoint - 方案2:升级到Next.js 13.4+的App Router版本
Next.js 13.4稳定版之后的App Router采用Route Handler处理API逻辑,路由规则完全重构,Vercel针对新的App Router构建逻辑已经修复了该问题,如果可以接受迁移到App Router,直接把API逻辑迁移到app/api目录下的Route Handler即可,原目录结构不需要调整。 - 方案3:修改next.config.js强制关闭打包优化
如果暂时不能调整目录结构也不能升级版本,可以在配置文件中添加配置强制扫描所有API文件,跳过lambda合并优化逻辑:
该方案仅针对特定版本有效,可能会增加构建时长。// next.config.js module.exports = { experimental: { workerThreads: false, cpus: 1 } } - 方案4:使用catch-all路由统一处理同目录请求
如果需要保留原目录结构,可以删除index.ts,新增[...slug].tscatch-all路由,在单个文件内处理该目录下的所有路径请求,手动区分不同路径的处理逻辑。
内容的提问来源于stack exchange,提问作者Angus Ryer
相关产品推荐
相关产品推荐

