Valibot 表单校验
热门关键词:valibot(2026 高速增长的 Zod 轻量替代,模块化导入、体积友好)。
> 小四原创:客户表单 object + pipe;safeParse 出字段错误。
> 不替代 Yup/Zod 全家桶迁移长文,只给 CRM 表单落地模板。
何时使用
- 新建客户:姓名/手机/邮箱校验
- 想减包体积、从 Zod 试轻量方案
- Demo 工具箱本地校验
硬约束
- 依赖:
valibot;用具名导入(objectstringpipesafeParse等)。 - 用
safeParse,勿用会抛异常的parse挡主流程(除非明确要抛)。 - 错误映射到字段 key → 中文 message,便于 Element Plus/
el-form。 - 手机:国内 11 位轻量正则即可;复杂号段可接已有运营商 Skill。
- 实现要点注释标 小四原创。
- 与 Zod Skill 并存时写清选型:体积优先 Valibot,生态/习惯优先 Zod。
推荐实现
import * as v from 'valibot'
// 小四原创:客户表单 schema
export const customerSchema = v.object({
name: v.pipe(
v.string('请填写姓名'),
v.minLength(2, '姓名至少 2 字'),
),
mobile: v.pipe(
v.string('请填写手机号'),
v.regex(/^1[3-9]\d{9}$/, '手机号格式不正确'),
),
email: v.optional(
v.pipe(v.string(), v.email('邮箱格式不正确')),
),
})
export type CustomerForm = v.InferOutput<typeof customerSchema>
export type FieldErrors = Record<string, string>
// 小四原创:safeParse → 字段错误
export function validateCustomer(
raw: unknown,
): { ok: true; data: CustomerForm } | { ok: false; errors: FieldErrors } {
const r = v.safeParse(customerSchema, raw)
if (r.success) return { ok: true, data: r.output }
const errors: FieldErrors = {}
for (const issue of r.issues) {
const key = issue.path?.map((p) => p.key).join('.') || '_form'
if (!errors[key]) errors[key] = issue.message
}
return { ok: false, errors }
}
Agent 步骤
npm i valibot。- 提交前
validateCustomer;失败把errors写入表单项。 - 需要动态 schema 时用
v.object组合,勿复制粘贴多套。 - 自测:空姓名、错手机、可选邮箱为空应通过。
不要做
- 把整站校验栈同时绑死 Zod+Yup+Valibot 三套。
- 在浏览器打完整服务端密钥或私有业务规则硬编码进 Skill。
附加
- README.md · reference.md · templates/usage.md