Zod 4 vs Valibot vs ArkType: hangisini seçmeli?
Zod 4 vs Valibot vs ArkType: hangisini seçmeli?
Bir TypeScript projesinde form verisi doğrulamak, API response'unu parse etmek ya da environment variable'ları kontrol etmek gerektiğinde ilk refleks genellikle Zod'u kurmak. Zod uzun süre bu alanın fiili standardıydı. Ama 2025'in ikinci yarısında tablo değişti: Zod v4 ciddi bir performans atılımı yaptı, Valibot tree-shaking odaklı mimarisiyle küçük bundle'lar vaat ediyor, ArkType ise TypeScript'in kendi tip sistemini runtime'a taşıyan farklı bir yaklaşım sunuyor. Üçünü gerçek sayılarla karşılaştırmak, "hangisini seçmeliyim" sorusuna dürüst bir cevap vermeye yardımcı olabilir.
Bundle boyutu
İstemci taraflı bir uygulamada her kilobayt önemli. Sunucu tarafında ise genellikle umursamayız, ama monorepo'larda paylaşılan validation şemaları hem istemciye hem sunucuya gidiyorsa boyut yine konuşulması gereken bir konu.
Zod v4, v3'e göre bundle boyutunu önemli ölçüde düşürdü. Zod'un resmi duyurusundaki rakamlara göre v4'ün minified+gzipped boyutu yaklaşık 13.4 kB (v3'teki ~14.8 kB'dan düşüş). Ama Zod hâlâ tek bir monolitik modül. z.string() kullandığında tüm kütüphane gelir.
Valibot burada keskin bir fark yaratıyor. Modüler fonksiyon mimarisi sayesinde sadece kullanılan parçalar bundle'a giriyor. Basit bir string + email + minLength şeması için Valibot'un bundle'a eklediği kod ~1-2 kB civarında. Karmaşık şemalarda bile 4-5 kB'ı nadiren geçiyor.
ArkType'ın yaklaşımı farklı. Kütüphanenin kendisi ~30 kB (minified+gzipped) civarında, çünkü içinde TypeScript'e benzer bir tip parser'ı barındırıyor. Bu boyut ilk bakışta büyük görünür ama ArkType bunu "bir kere öde" modeli olarak sunuyor: şema sayısı artsa da boyut sabit kalıyor.
Bu rakamları bir tabloya koymak yerine şöyle düşünmek daha doğru: eğer istemci bundle'ında yalnızca iki üç basit şema varsa, Valibot açık ara en hafif seçenek. Sunucu tarafı bir API'de onlarca şema tanımlıyorsan, ArkType'ın sabit maliyeti oransal olarak düşer. Zod v4 ise ikisinin arasında, çoğu proje için makul bir boyutta.
Performans
Runtime validation'da performans genellikle darboğaz değildir; bir form submit'inde 0.1 ms ile 0.01 ms arasındaki fark kullanıcıya yansımaz. Ama yüksek hacimli API'lerde, WebSocket mesaj doğrulamalarında ya da büyük JSON payload'larında fark hissedilir.
ArkType'ın kendi benchmark'larına göre (arktype.io/docs/intro/setup, Mayıs 2025 güncellemesi) ArkType, Zod v4'ten ortalama 3-4x daha hızlı. ArkType bunu, şema tanımı sırasında optimized validator fonksiyonları derleyerek başarıyor. Zod v4 ise v3'e göre parse hızını 7x'e kadar artırdığını belgeliyor (Zod v4 duyuru blog yazısı, Nisan 2025).
Valibot performansta ArkType kadar agresif değil. Valibot'un odağı küçük bundle boyutu, performansta Zod v3 ile benzer seviyede ya da biraz üstünde. Zod v4'ün performans iyileştirmeleriyle Valibot'un ham parse hızı Zod v4'ün gerisinde kalıyor.
Kısa versiyon: saf parse hızı öncelikliyse ArkType > Zod v4 > Valibot sıralaması geçerli.
Tip çıkarımı ve DX
Üçü de şemadan TypeScript tipi çıkarabilir. Fark, bunu nasıl yaptıklarında.
Zod v4
Zod'un API'si zaten TypeScript ekosisteminin ortak dili haline geldi. z.infer<typeof schema> kalıbı tanıdık:
import { z } from "zod/v4";
const UserSchema = z.object({
name: z.string().min(1),
email: z.string().email(),
age: z.number().int().min(18),
});
type User = z.infer<typeof UserSchema>;
// { name: string; email: string; age: number }Zod v4'ün getirdiği yeniliklerden biri z.interface() ile recursive tipleri daha kolay tanımlayabilmek. Hata mesajları da v4'te yeniden yapılandırıldı; artık z.prettifyError() ile okunabilir hata çıktısı almak mümkün.
Valibot
Valibot fonksiyonel bir API kullanıyor. Şema tanımı, pipe ile birbirine bağlanan bağımsız fonksiyonlardan oluşuyor:
import * as v from "valibot";
const UserSchema = v.object({
name: v.pipe(v.string(), v.minLength(1)),
email: v.pipe(v.string(), v.email()),
age: v.pipe(v.number(), v.integer(), v.minValue(18)),
});
type User = v.InferOutput<typeof UserSchema>;Bu stil biraz daha verbose ama tree-shaking'i mümkün kılan şey tam olarak bu modüler yapı. v.pipe() kalıbı ilk başta yabancı gelebilir, birkaç şema yazdıktan sonra alışılıyor.
ArkType
ArkType tamamen farklı bir yol izliyor. TypeScript sözdizimini string literal olarak alıp runtime'da parse ediyor:
import { type } from "arktype";
const User = type({
name: "string > 0",
email: "string.email",
"age?": "number.integer >= 18",
});
type User = typeof User.infer;Burada "string > 0" ifadesi TypeScript'in tip sistemi içinde doğrulanıyor. Yanlış bir şey yazarsan, editörde kırmızı çizgi görürsün. Bu, DX açısından etkileyici bir deneyim. Ama bir maliyeti var: ArkType'ın tip düzeyindeki hesaplamaları IDE'yi yavaşlatabilir. Büyük projelerde (100+ şema) TypeScript language server'ın yanıt süresi artabiliyor.
Ekosistem entegrasyonu
Zod'un en güçlü yanı ekosistem desteği. React Hook Form @hookform/resolvers ile Zod'u birinci sınıf destekliyor. tRPC varsayılan olarak Zod şemalarını kabul ediyor. Drizzle ORM Zod şemaları üretebiliyor. Next.js Server Actions örneklerinin çoğu Zod ile yazılmış. TanStack Start da Zod'u varsayılan validation aracı olarak gösteriyor.
Valibot bu entegrasyonlarda hızla yol alıyor. React Hook Form resolver'ı mevcut, tRPC v11 de Valibot'u destekliyor (Standard Schema arayüzü üzerinden). Ama Zod kadar geniş bir "her yerde varsayılan" konumunda değil.
ArkType ise Standard Schema spec'ini destekliyor, bu sayede Standard Schema uyumlu her araçla çalışabiliyor. Ancak doğrudan ArkType'a özel entegrasyon sunan araç sayısı henüz az.
Standard Schema'dan bahsetmişken: bu spec, farklı validation kütüphanelerinin ortak bir arayüz sunmasını sağlıyor. Zod v4, Valibot ve ArkType üçü de Standard Schema'yı destekliyor. Bu, teoride kütüphane değiştirmeyi kolaylaştırıyor. Pratikte şema tanım sözdizimi tamamen farklı olduğu için geçiş hâlâ iş demek, ama araç entegrasyonu Standard Schema sayesinde daha kolay.
Hata mesajları ve özelleştirme
Zod v4, hata mesajlarını ciddi şekilde iyileştirdi. z.prettifyError() fonksiyonu düz metin çıktı veriyor, z.flattenError() ise form alanlarına göre gruplanmış hatalar döndürüyor:
import { z } from "zod/v4";
const result = UserSchema.safeParse({ name: "", email: "x", age: 15 });
if (!result.success) {
const flat = z.flattenError(result.error);
console.log(flat.fieldErrors);
// { name: ["String must contain at least 1 character(s)"],
// email: ["Invalid email"],
// age: ["Number must be greater than or equal to 18"] }
}Valibot da benzer bir hata yapısı sunuyor. flatten fonksiyonuyla alan bazlı hata erişimi mümkün:
import * as v from "valibot";
const result = v.safeParse(UserSchema, { name: "", email: "x", age: 15 });
if (result.issues) {
const flat = v.flatten(result.issues);
console.log(flat.nested);
}ArkType ise hata durumunda ArkErrors nesnesi döndürüyor. Bu nesne doğrudan toString() ile okunabilir bir mesaj veriyor, ama form alanlarıyla eşleştirmek biraz daha fazla kod gerektiriyor.
Gerçek dünya senaryoları
Hangi kütüphane hangi durumda daha mantıklı, bunu soyut tartışmak yerine somut senaryolar üzerinden düşünmek daha faydalı.
Bir Next.js uygulaması yapılıyorsa, Server Actions kullanılıyorsa, tRPC veya React Hook Form ile entegre edilecekse: Zod v4. Ekosistem desteği tartışmasız en geniş olan seçenek bu. Zod v4'ün getirdikleri hakkında ayrıntılı bilgi mevcut.
Bir widget, embed script ya da istemci ağırlıklı küçük bir kütüphane yazılıyorsa, her byte önemliyse: Valibot. Tree-shaking avantajı bu tip projelerde gerçekten hissedilir.
Yüksek hacimli bir API sunucusu, WebSocket gateway ya da parse-yoğun bir servis söz konusuysa, performans gerçekten darboğazsa: ArkType. Parse hızındaki fark bu senaryolarda somut kazanç sağlıyor.
Geçiş maliyeti
Zod v3'ten v4'e geçiş nispeten düşük maliyetli. Zod, zod/v4 import yolunu ayrı tutarak mevcut zod importlarının çalışmaya devam etmesini sağlıyor. Kademeli geçiş mümkün.
Zod'dan Valibot'a geçiş ise her şema dosyasının yeniden yazılması demek. Sözdizimi temelden farklı. Küçük projelerde bir öğleden sonraya sığar, büyük projelerde ciddi efor gerektirir.
Zod'dan ArkType'a geçiş en maliyetli olanı. String-based tip sözdizimini öğrenmek, hata yönetimini yeniden yapılandırmak, IDE performansını test etmek lazım.
Ne zaman hangisi?
Üç kütüphane de production-ready, üçü de Standard Schema destekliyor, üçü de TypeScript tip çıkarımı yapıyor. Aralarındaki fark, öncelik sıralamasından kaynaklanıyor.
Zod v4, ekosistem uyumunu ve tanınırlığı ön plana koyan projelerde doğru tercih. Takıma yeni katılan birinin Zod API'sini bilme olasılığı yüksek. Valibot, bundle bütçesinin kısıtlı olduğu istemci projelerinde gerçek bir avantaj sağlıyor. ArkType, TypeScript tip sistemine olan hakimiyeti yüksek ekiplerde, performans gerektiren sunucu tarafı senaryolarda parıldıyor.
Benim kişisel tercihim çoğu projede hâlâ Zod v4 yönünde, çünkü bir validation kütüphanesinden en çok beklediğim şey "her yerde çalışması" ve "ekipte kimsenin takılmadan yazabilmesi". Ama bir sonraki istemci ağırlıklı projemde Valibot'u deneyeceğim; 2 kB ile 13 kB arasındaki farkı görmezden gelmek giderek zorlaşıyor.