
vue-vben-admin 表单项目如何执行 Zod 4 与 TanStack Form 迁移【免费下载链接】vue-vben-adminA modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. Its fast!项目地址: https://gitcode.com/GitHub_Trending/vu/vue-vben-admin如果你维护着基于 vue-vben-admin 的表单项目本次要完成的任务是把表单校验 schema 从 Zod 3 升级到 Zod 4并把内部表单引擎从 vee-validate 替换为 TanStack Form。迁移后业务侧的 Vben 表单 API 保持稳定但业务代码中仍可能残留 Zod 3 写法与旧引擎 API需要一次可核对的迁移。当前仓库的依赖已经处于迁移后状态pnpm-workspace.yaml的 catalog 中声明了zod: ^4.4.3、zod-defaults: ^0.2.3和tanstack/vue-form: ^1.33.2全文档范围搜索不到vee-validate依赖因此实际要做的是把存量表单代码迁到这套新依赖上并按验收标准逐层验证。完整依据见 迁移指南。迁移范围与依赖变化类型迁移前迁移后Schemazod^3.25.76zod^4.4.3默认值zod-defaults0.1.3zod-defaults^0.2.3表单引擎vee-validate^4.15.1tanstack/vue-form^1.33.2Zod 适配器vee-validate/zod^4.15.1不再需要TanStack Form 支持 Standard Schema迁移完成后源码、package manifest 和锁文件中都不应再依赖vee-validate或vee-validate/zod。核心表单包 form-ui 的依赖即为迁移后形态依赖tanstack/vue-form、zod、zod-defaults没有 vee 系列。业务侧兼容范围useVbenForm(options)仍返回[Form, formApi]FormApi的值、校验、提交、重置、schema 更新能力保留FormSchema的fieldName、component、componentProps、rules、dependencies、defaultValue、已弃用的valueFormat和数组字段结构不变。formApi.form现在是库无关的FormContextApi不再暴露 veeFormContext或原始 TanStack 实例。前置条件在一个干净的 Git 工作树中执行迁移工具文档明确要求这一点。原因是下一条命令会原地改写文件脏工作树会让git diff无法区分迁移改动与未提交内容。仓库 根 package.json 的engines要求 Node^22.18.0 || ^24.12.0、pnpm11.0.0后续验证脚本都依赖该环境。第一步运行 codemod 工具按项目 tsconfig 执行固定版本的工具把path/to/tsconfig.json替换为你要处理的实际 tsconfig 文件路径npx --yes zod-v3-to-v41.21.3 path/to/tsconfig.json执行前必须知道两个事实该工具会原地修改.ts、.tsx和.vue文件没有 dry-run 模式这也是为什么要求干净工作树。工具只能可靠识别直接从zod导入的调用。通过vben/common-ui或应用 adapter 间接取得z的 schema 需要人工审计尤其是构造器错误参数、字符串格式和动态 refine 参数。执行后立即检查git diff确认工具改了什么、漏了什么再进入人工修复。第二步人工修复工具覆盖不到的代码Zod 4 的写法变化构造器中的required_error和invalid_type_error合并为error按输入动态生成消息时使用error(issue)const count z.number({ error: (issue) issue.input undefined ? Count is required : Count must be a number, });字符串格式优先使用顶层格式 API旧的z.string().email()等形式不应继续新增z.email(Invalid email); z.url(Invalid URL); z.uuid(Invalid UUID);错误列表改用issues不要读取已移除的.errorsconst result schema.safeParse(value); if (!result.success) { console.log(result.error.issues); }默认值方面Zod 4 的 default 在输入为undefined时可以直接返回默认值.default().optional()的结果必须按实际 parse 语义复核而不是通过类型名称猜测。Vben 表单生成初值的优先级是schema 显式defaultValue→ Zod schema 的.default()→zod-defaults生成的对象、intersection 和基础空值 → Vben 组件约定的空字符串、空数组或空状态值。必填标记以 schema 是否接受undefined为准。另外几类需要逐处复核的写法不要读取_def、_zod.def或typeName公共包装器使用.unwrap()TanStack Form 用 Standard Schema 校验时不会自动把 transform/coerce 输出写回表单 state提交 payload 需要转换时使用表单级 codec必须提交 schema transform 后的结果时在 codec 的encode边界显式调用parseAsyncz.record()需要明确 key schema 与 value schemaz.enum()已覆盖原nativeEnum用法object 的 strict、merge、unknown keys 行为与 intersection 合并冲突现在可能直接抛错需通过测试确认ZodEffects、ZodTypeAny、AnyZodObject等 Zod 3 类型不应继续使用表单引擎 API 调整字段校验触发从四个validateOn*布尔项改为一个数组submit 时始终校验// 旧写法已删除 validateOnBlur: true; validateOnChange: true; // 新写法接收 blur、change 数组默认两者都启用 validateOn?: readonly (blur | change)[];force/silent/validated-only这些 vee validation mode 在 TanStack runtime 中没有对应语义已直接删除使用它们的调用点需要改写。回调签名发生了变化业务代码中如有订阅要同步更新handleSubmit(values)→handleSubmit(values, rawValues)首参为格式化值次参为同一次提交对应的只读原始快照旧的单参数函数仍可直接使用handleValuesChange(values, fieldsChanged)→handleValuesChange(rawValues, fieldsChanged, getFormattedValues)第三个参数是惰性格式化函数不调用时不产生深拷贝和转换开销getValues()返回 codec 编码后的TSubmitValuesgetRawValues()返回未执行 codec 或旧格式化管道的独立快照需要同时比较时用getValueSnapshot()它返回{ rawValues, values }规则注册入口从defineRules迁移到rules。新写法setupVbenForm 实现中保留了旧入口的转发setupVbenForm({ rules: { required(value, _params, context) { const isEmpty value undefined || value null || value || (Array.isArray(value) value.length 0); return isEmpty ? ${context.label} is required : true; }, }, });旧的defineRules仍会转发到同一个规则注册表开发环境针对该弃用项只输出一次警告生产环境不输出若rules与defineRules提供同名规则rules优先。字段联动推荐使用dependencies.resolve(context)根据声明的triggerFields一次计算完整动态 patch 并原子更新字段状态可以返回if、show、disabled、required、rules、componentProps、help和renderComponentContent未返回rules时继续使用静态规则显式返回rules: null时关闭静态规则。旧的if/show/disabled/required/rules/componentProps/trigger语法本轮仍完整兼容但均已标记deprecated开发环境首次使用时警告一次两种语法同时存在时以resolve为准。方法名层面新代码使用reset、submit、validateAndSubmit、clearValidation旧的resetForm、submitForm、validateAndSubmitForm、resetValidate仍会委托给新实现开发环境首次使用时给一次性 warning生产环境静默。FormActions类型保留为FormContextApi的弃用别名。第三步按验收标准验证文档给出的测试覆盖层级是Zod 4 helperdefault、optional、nullable、intersection、pipe、transform、coerce 与错误参数runtime值读写、selector、reset、字段错误、validate 和异步校验组件输入绑定、blur/change 触发、错误消息、ARIA、dependencies 和数组增删兼容rules/defineRules结果一致、开发 warning 去重、生产静默、类型别名集成useVbenForm生命周期、提交、handleValuesChange、submit-on-change 和 async race六条验收标准对应仓库根目录可执行的检查脚本# 1. 受影响 package、应用、playground 和 docs 无 TypeScript 错误 pnpm check:type # 2. form-ui 与所有应用构建成功 pnpm build # 3. 单元、组件和集成测试全部通过 pnpm test:unit # 4. 修改文件通过 oxfmt 与 ESLint pnpm lint剩余两条标准不绑定单一命令浏览器 smoke 流程中无pageerror、console.error或未处理 Promise静态搜索中不再出现 vee 依赖、Zod 私有结构_def、_zod.def、typeName或 Zod 3 错误参数required_error、invalid_type_error最后一条静态搜索可以和第一步的git diff复查一起做迁移是否彻底以仓库中搜不到 vee 依赖和 Zod 3 私有写法为判断依据。边界与已知限制codemod 工具无 dry-run 且原地改写文件只能以干净工作树 事后git diff来兜底不要在有未提交改动时执行。间接引入z的 schema经vben/common-ui或应用 adapter不在工具的可靠识别范围内必须人工过一遍构造器错误参数、字符串格式和动态 refine 参数。弃用项defineRules、dependencies旧语法、resetForm等在开发环境只警告一次、生产环境完全静默warning 消失不代表迁移完成以静态搜索和类型检查为准。.default().optional()、intersection 合并冲突等行为的判定标准是实际 parse 语义和测试通过文档明确反对按类型名称或旧版经验猜测。【免费下载链接】vue-vben-adminA modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. Its fast!项目地址: https://gitcode.com/GitHub_Trending/vu/vue-vben-admin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考