Vercel 项目配置新增 vercel.toml 支持

Vercel 新增 vercel.toml 配置格式,支持注释且与 vercel.json 属性一致。
Vercel 宣布项目可以使用 vercel.toml 文件进行配置,作为 vercel.json 之外的另一种选择。TOML 格式支持注释、结构更扁平,对人工阅读和版本维护更友好,且支持与 vercel.json 完全相同的配置属性,迁移成本较低。但每个项目只能在 vercel.toml、vercel.json 和 vercel.ts 三者中选其一,切换时必须删除旧配置文件。官方以 Services 配置为例展示了 TOML 的表结构与数组表写法。文章建议配置复杂且需要向新成员解释意图的团队考虑切换,而依赖类型检查或动态逻辑的项目仍应使用 vercel.ts,迁移时需逐项验证嵌套对象与数组的改写。

Vercel 宣布其项目现在可以使用 vercel.toml 文件进行配置。这一变化为开发者提供了 vercel.json 之外的另一种配置选择,核心亮点在于引入了 TOML 格式的注释能力和更扁平的结构。
为什么 TOML 值得关注
TOML 是一种旨在明确表达语义的配置文件格式,与 JSON 相比,它允许写注释、结构更扁平,对人工阅读和版本维护更友好。Vercel 官方说明,vercel.toml 支持与 vercel.json 完全相同的配置属性,因此迁移成本并不高——开发者可以把现有 JSON 配置按 TOML 语法改写过来,同时获得注释能力。
对于长期被 vercel.json 中无法写注释所困扰的团队来说,这一点有实际价值。配置文件往往承载了部署逻辑、路由规则和团队约定,没有注释意味着上下文只能存在于文档或口口相传中。TOML 的引入让这些信息可以就近写在配置里。
TOML(Tom's Obvious Minimal Language)由 Tom Preston-Werner 于 2013 年提出,目前由社区维护并已发布 1.0.0 稳定规范。它的设计目标是把配置写成“显而易见”的形式:键值对语义明确、日期时间有原生类型、字符串无需转义即可跨行,并且原生支持注释。与 YAML 相比,TOML 不使用缩进表达层级,减少了因空白字符引发的歧义;与 JSON 相比,它允许注释且不要求大量引号与逗号。正因如此,TOML 被 Cargo(Rust)、pyproject.toml(Python 打包)、Hugo 等工具选为默认配置格式。其表(table)、内联表(inline table)与数组表(array of tables)三种结构,足以表达绝大多数部署配置所需的嵌套与重复条目。
项目配置文件只能三选一
Vercel 明确要求,每个项目只能使用一个配置文件:vercel.toml、vercel.json 或 vercel.ts。这意味着 vercel.toml 并不是叠加选项,而是替代选项。已有项目如果决定切换,需要移除其余配置文件,避免行为冲突。
这一约束也说明 Vercel 在配置层正在提供多种格式以适应不同偏好:JSON 胜在通用,TypeScript 胜在类型和逻辑能力,TOML 胜在可读性与注释。三者并存但不共存于同一项目,是这次更新最需要注意的边界。
以 Services 为例看实际写法
官方给出的示例展示了用 vercel.toml 配置 Services 的方式。示例中定义了一个 Next.js 前端服务和一个 FastAPI 后端服务,并配置了重写规则:
"$schema" = "https://openapi.vercel.sh/vercel.json"
示例中的 `$schema` 键指向一个 JSON Schema 地址,这是编辑器实现自动补全与校验的通用约定。Vercel 的 schema 以 vercel.json 为基准发布,因此 TOML 文件沿用了同一地址。需要注意,并非所有编辑器都能把 JSON Schema 直接映射到 TOML 文档上:VS Code 的 TOML 插件(如 Even Better TOML)支持通过 `#:schema` 注释指令关联 schema,而直接写 `"$schema"` 键在部分工具中可能只被当作普通配置项。因此在启用校验前,应先确认所用编辑器是否识别该写法,否则可能出现“配置正确但无提示”的情况。
# NextJS frontend
[services.frontend]
root = "frontend/"
# FastAPI backend
[services.backend]
root = "backend/"
entrypoint = "main:app"
[[rewrites]]
source = "/api/(.*)"
destination = { service = "backend" }
[[rewrites]]
source = "/(.*)"
destination = { service = "frontend" }
这段配置体现了 TOML 的两个特点。第一,注释直接写在服务定义上方,前端与后端的职责一目了然。第二,services.frontend、services.backend 这样的表结构把服务参数收拢在各自命名空间下,而 rewrites 使用数组表([[rewrites]])表达重复条目,整体层级比等价的 JSON 更扁平。
值得留意的是,示例中的 $schema 仍指向 vercel.json 的 schema 地址。这表达了配置属性与 JSON 版本一致的事实,但如果使用支持 schema 校验的编辑器,实际体验可能与预期有差异,需要以官方文档为准。
如何判断是否该切换
如果你的团队已经在 vercel.json 中维护了较多路由、重写或服务配置,并且经常需要向新成员解释这些配置的意图,vercel.toml 的注释能力会直接降低沟通成本。反过来,如果项目依赖 TypeScript 配置中的类型检查或动态逻辑,vercel.ts 仍然是更合适的选择,TOML 无法替代代码层能力。
对于新项目,选择哪一种格式更多取决于团队习惯。TOML 在可读性上的优势明显,但生态工具对 JSON 的支持通常更普遍。Vercel 同时保留三种格式,本质上是把选择权交给项目本身。
迁移时的注意事项
从 vercel.json 迁移到 vercel.toml 时,首先要确保删除旧配置文件,因为同一项目只允许一个配置入口。其次,JSON 中的嵌套对象在 TOML 中需要改写为表或内联表,数组结构需要改写为数组表,务必对照官方文档逐项验证。最后,只要配置属性本身没有被重命名,行为应保持一致,但建议在切换后检查部署日志中的路由与服务解析是否符合预期。
Vercel 在公告中只给出了 Services 这一种示例,其他配置项的 TOML 写法需要查阅文档确认。对于配置项较多的项目,建议先在测试项目中验证再迁移生产环境。
JSON 到 TOML 的改写有几条固定映射规则:JSON 对象在 TOML 中对应表([section])或内联表({ key = value });JSON 数组若元素是同构对象,通常改写为数组表([[items]]),若元素是标量则保留为普通数组;JSON 的 null 在 TOML 中没有对应值,需要省略该键或改用其他表达;布尔值、数字、字符串的写法基本一致,但 TOML 的字符串默认不转义反斜杠,含特殊字符时需使用字面量字符串(单引号)或基本字符串(双引号)加以区分。对于层数较深的配置,建议先用脚本或在线转换工具生成初稿,再人工校对键名与层级,避免数组表与普通表混用导致解析错误。
相关推荐

Qwen 3.8编程击败Opus,你的Mac能跑吗?
Qwen 3.8开源模型在编程测试中击败Opus 4.6,仅18GB大小,但你的Mac需要多少内存?实测显示24GB会崩溃,32GB才是甜点区,本文详解各档Mac配置的实际表现与上手方法。

Claude Code + Agent:打造AI全自动测试闭环
B站课程解读:测试开发如何用 Claude Code 终端型 Agent 打造 AI 全自动测试闭环。对比终端型与设备型 Agent 的权限边界,讲清企业级项目为何选 Claude Code 而非 Open Claude 类工具,并梳理 Node.js 环境准备与 DeepSeek 模型搭配的落地路径。

与AI智能体共事,你需要钢铁般的神经
AI智能体越自主,使用者的心理负担反而越重。本文从Hacker News讨论出发,分析智能体协作中的黑箱焦虑、行为漂移与监控疲劳,并给出沙箱隔离、权限控制、任务粒度管理等降低认知负荷的实用思路。