Salutare tuturor. Am nevoie de o perspectivă realistă de la cei care s-au lovit de problema asta în producție, că m-am blocat într-o dilemă de arhitectură.
La proiectul curent (un API pe Hono deployat pe Cloudflare Workers, cam 8k useri activi zilnic) avem în jur de 52 de scheme de validare scrise cu Zod. Nimic extrem de complex, clasicele DTO-uri de request, validation middleware-uri și ceva payload-uri din cozi SQ/KV. Totul funcționează ceas, dar am început să mă lovesc de o problemă de performanță pe care nu o mai pot ignora.
Zod este excelent ca DX, dar pe serverless, unde fiecare milisecundă de cold start contează, bundle size-ul lui a început să devină deranjant. Zod nu este tree-shakable. Importi o singură chestie, tragi după tine toată librăria de vreo 60-70 KB (minified). La 50+ scheme împărțite pe mai multe endpoint-uri, chestia asta se adună și se simte direct în timpul de boot al workerilor.
Am făcut un test rapid pe un endpoint izolat cu Valibot. Am rescris trei scheme medii și bundle size-ul pe acel endpoint a scăzut cu aproape 75% pe partea de validare. Valibot fiind modular, importi strict safeParse, string și email. Sună minunat pe hârtie, dar mă sperie procesul de migrare pentru restul de 50 de scheme.
Am observat deja primul trade-off major: lizibilitatea codului. În Zod scrii totul fluid, înlănțuit:
z.object({ email: z.string().email() })
În Valibot, sintaxa devine destul de ciudată și funcțională, plină de paranteze imbricate:
v.object({ email: v.pipe(v.string(), v.email()) })
Pentru trei scheme a fost ok, dar la 50+ mi-e teamă că codul va deveni greu de citit și de întreținut pentru colegii mai juniori din echipă. În plus, am observat că Valibot folosește concepte separate pentru input și output (v.InferInput și v.InferOutput), ceea ce adaugă un strat extra de complexitate la tipărirea TypeScript, spre deosebire de simplul z.infer cu care eram toți obișnuiți.
A doua mare temere este ecosistemul. Noi generăm automat documentația OpenAPI din schemele de Zod folosind @asteasolutions/zod-to-openapi. Există alternative și pentru Valibot, dar par destul de tinere și mi-e groază să nu mă trezesc cu bug-uri ciudate în producție sau cu tipuri generate greșit pe care trebuie să le repar manual.
A trecut cineva prin migrarea asta de la Zod la Valibot pe un proiect de dimensiune medie spre mare? A meritat efortul pentru acele zeci de milisecunde economisite la cold start, sau mai bine optimizez în altă parte (baze de date, caching) și las Zod în pace pentru că DX-ul e prea bun ca să renunț la el?
Cum a fost experiența voastră cu Valibot pe termen lung în producție?