Zod 4 sürümü yayınlandı
(zod.dev)- Zod 4, 1 yıllık geliştirmenin ardından kararlı sürüm olarak yayınlandı; Zod 3'ün tasarım sınırlarını giderip performans, bundle boyutu ve TypeScript derleme verimliliği alanlarında büyük iyileştirmeler getiriyor
- Mayıs 2021'de çıkan Zod 3, GitHub'da 2.700 yıldız ve haftalık 600 bin indirmeden bugün 37.8k yıldız ve haftalık 31 milyon indirme ölçeğine ulaştı; 24 küçük sürümün ardından temel iyileştirmeler için geriye dönük uyumluluğu bozan değişiklikler gerekli hale geldi
- Benchmark'larda string parsing 14 kat, dizi parsing 7 kat, nesne parsing ise 6.5 kat hızlandı;
tsctype instantiation sayısı da basit bir örnekte 25.000'in üzerindeyken yaklaşık 175'e düştü - Çekirdek bundle boyutu gzip bazında Zod 3'te
12.47kbiken Zod 4'ün normal sürümünde5.36kb'ye indi; tree-shaking yapılabilen fonksiyonel API Zod Mini ise1.88kbseviyesine kadar küçüldü - Yeni özellikler arasında JSON Schema dönüşümü, metadata registry, recursive object type inference, uluslararasılaştırma, hata pretty-printing, template literal type,
z.stringbool(), birleşikerrorparametresi ve geliştirilmişz.discriminatedUnion()yer alıyor
Zod 4 neden yeni bir major sürüm oldu?
- Zod 4, 1 yıllık yoğun geliştirme sürecinin ardından kararlı sürüme ulaştı ve daha hızlı, daha küçük,
tscaçısından daha verimli bir temel üzerinde uzun süredir istenen özellikleri hayata geçiriyor - Zod v3.0, Mayıs 2021'de yayınlandı; o dönemde GitHub yıldız sayısı 2.700, haftalık indirme sayısı ise 600 bindi
- Bugün Zod, GitHub'da 37.8k yıldız ve haftalık 31 milyon indirme seviyesine ulaştı
- Beta sürümünün çıkmasından 6 hafta önce haftalık indirme sayısı 23 milyondu
- 24 küçük sürüm boyunca Zod 3 kod tabanı sınırına ulaştı ve en çok talep edilen özellikler ile iyileştirmeler için geriye dönük uyumluluğu bozan değişiklikler gerekli hale geldi
- Zod 4, en çok oy alan herkese açık ilk 10 issue'nun 9'unu kapattı
Parsing performansı ve TypeScript derleme verimliliği
- Zod 4, depoda doğrudan çalıştırılabilen benchmark'lar sunuyor
- Parsing performansındaki iyileştirmeler:
- String parsing: 14 kat daha hızlı
- Dizi parsing: 7 kat daha hızlı
- Nesne parsing: 6.5 kat daha hızlı
- Nesne parsing benchmark'ı, Moltar validation library benchmark çalıştırılarak ölçüldü
tsc --extendedDiagnosticsbaz alındığında, basit bir dosyanın derlenmesinde type instantiation sayısı büyük ölçüde azaldı"zod/v3"kullanıldığında 25.000'in üzerinde"zod/v4"kullanıldığında yaklaşık 175
- Zod 4,
ZodObjectve diğer schema sınıflarının generic yapısını yeniden tasarlayıp sadeleştirerek instantiation patlamasını önlüyor .extend()ve.omit()zincirlerinin tekrarlandığı bir kalıp, Zod 3'te derleme için4000msgerektiriyordu ve ek.extend()çağrıları"Possibly infinite"hatasına yol açabiliyordu- Aynı kalıp Zod 4'te
400msiçinde derlenerek 10 kat hızlanıyor - Gelecekte
tsgoderleyicisiyle birlikte kullanıldığında, Zod 4'ün editör performansı daha büyük schema'lara ve kod tabanlarına da ölçeklenebilir
Bundle boyutu ve Zod Mini
- Basit bir
z.boolean()doğrulama betiğirollupile bundle'lanarak çekirdek bundle boyutu karşılaştırıldı - gzip bazında çekirdek bundle boyutu:
- Zod 3:
12.47kb - Zod 4 normal sürüm:
5.36kb
- Zod 3:
- Zod 4 normal sürümünün çekirdek bundle'ı, Zod 3'e göre yaklaşık %57 daha küçük ve 2.3 kat daha az yer kaplıyor
- Zod'un yöntem odaklı API'si doğası gereği tree-shaking için zorlayıcı; basit bir
z.boolean()betiği bile.optional()ve.array()gibi kullanılmayan yöntem uygulamalarını da beraberinde getiriyor - Zod Mini,
zodile bire bir eşleşen fonksiyonel ve tree-shaking yapılabilen bir API sunuyor- Zod'un yöntem kullandığı yerlerde Zod Mini genellikle wrapper fonksiyonlar kullanıyor
- Parsing yöntemleri Zod ve Zod Mini'de aynı
- Genel amaçlı
.check()yöntemiyle refinement eklenebiliyor
- Normal Zod, çoğu kullanım senaryosu için önerilmeye devam ediyor; bundle boyutu kısıtları olağan dışı derecede sıkı olan projeler Zod Mini'yi değerlendirebilir
zod/minikullanıldığında gzip bundle boyutu1.88kb- Zod 3'e göre %85, yani 6.6 kat daha küçük
- Karşılaştırma tablosu: Zod 3
12.47kb, Zod 4 normal5.36kb, Zod 4 Mini1.88kb
- Ayrıntılar
zod/minibelgelerinde yer alıyor
Metadata ve JSON Schema
- Zod 4, schema'lara strongly typed metadata eklemek için yeni bir sistem sunuyor
- Metadata, schema'nın içinde değil; schema ile typed metadata'yı ilişkilendiren bir schema registry içinde tutuluyor
z.registry()ile registry oluşturulabiliyor ve schema'nın.register()yöntemiyle kolay kayıt yapılabiliyor- Zod, yaygın JSON Schema uyumlu metadata'yı kabul eden genel registry
z.globalRegistry'yi dışa aktarıyor .meta()yöntemi, schema'yız.globalRegistry'ye kolayca ekliyor- Zod 3 uyumluluğu için
.describe()korunuyor, ancak Zod 4'te önerilen yöntem.meta() - Zod 4,
z.toJSONSchema()aracılığıyla birinci taraf JSON Schema dönüşümü sunuyor z.globalRegistryiçindeki metadata, JSON Schema çıktısına otomatik olarak ekleniyor- Üretilen JSON Schema'nın özelleştirilmesiyle ilgili bilgiler JSON Schema docs içinde bulunuyor
Yeni schema ifadeleri ve type özellikleri
- Zod 4, recursive object type'ları doğru şekilde infer edebiliyor
- Recursive type'lar ve karşılıklı recursive type'lar ifade edilebiliyor
- Zod 3'teki recursive type kalıplarının aksine type cast gerekmiyor
- Ortaya çıkan schema, normal bir
ZodObjectinstance'ı olduğu için tüm yöntemler kullanılabiliyor
Fileinstance doğrulaması için File schema eklendiz.templateLiteral(), TypeScript'in template literal type'larını ifade ediyor- String'e dönüştürülebilen Zod schema type'ları iç regex'lerini saklıyor
- Hedefler arasında string,
z.email()gibi string formatları, sayı, boolean, bigint, enum, literal, undefined/optional, null/nullable ve diğer template literal'lar yer alıyor z.templateLiteraloluşturucusu bunları tek bir super-regex içinde birleştiriyorz.email()gibi string formatları düzgün şekilde zorunlu kılınıyor, ancak custom refinement zorunlu kılınmıyor- Ayrıntılar template literal docs sayfasında bulunuyor
- Sabit genişlikli tam sayı ve kayan noktalı sayı type'larını ifade eden yeni sayı formatları eklendi
- Bunlar, uygun inclusive minimum/maximum kısıtları önceden eklenmiş
ZodNumberinstance'ları döndürüyor
- Bunlar, uygun inclusive minimum/maximum kısıtları önceden eklenmiş
- JavaScript
numberile güvenli şekilde ifade edilebilen aralığı aşan bigint sayı formatları da eklendi- Bunlar da uygun inclusive minimum/maximum kısıtları önceden eklenmiş
ZodBigIntinstance'ları döndürüyor
- Bunlar da uygun inclusive minimum/maximum kısıtları önceden eklenmiş
z.literal()artık isteğe bağlı olarak birden fazla değer alabiliyor
Hatalar, uluslararasılaştırma ve string formatları
- Zod 4, hata mesajlarını birden fazla dile global olarak çevirmek için yeni
localesAPI'sini sunuyor - Desteklenen locale'lerin tam listesi Customizing errors sayfasında yer alıyor ve desteklenen diller arttıkça güncelleniyor
- Zod,
ZodErrornesnesini kullanıcı dostu biçimde string'e dönüştüren üst seviyez.prettifyErrorfonksiyonunu uyguluyor- Şu an biçimi yapılandırılamıyor
- Gelecekte değişebilir
- Hâlihazırda
zod-validation-errorkullanıyorsanız kullanmaya devam edebilirsiniz
- Email dahil tüm string formatları
zmodülünün üst seviye fonksiyonlarına yükseltildi- Daha kısa ve tree-shaking için daha elverişli
z.string().email()gibi yöntem tabanlı karşılıklar kullanılmaya devam edebilir ancak deprecated durumdalar- Bir sonraki major sürümde kaldırılmaları planlanıyor
z.email()API'si custom regular expression desteği sunuyor- Tek bir canonical email regex'i yok; uygulamalar daha katı ya da daha esnek ölçütler seçebilir
- Zod kolaylık sağlamak için birkaç yaygın regex'i dışa aktarıyor
Boolean dönüştürme ve hata özelleştirmesinin sadeleştirilmesi
- Mevcut
z.coerce.boolean(), falsy değerlerifalse, truthy değerleritrueyapan basit bir APIfalse,undefined,null,0,"",NaNgibi değerlerfalseolur- Bu davranış diğer
z.coerceAPI'leriyle uyumlu
- Zod 4, env tarzı daha gelişmiş boolean coercion için
z.stringbool()sunuyor- truthy ve falsy değerler özelleştirilebiliyor
- Ayrıntılar
z.stringbool()docs sayfasında bulunuyor
- Zod 4'teki geriye dönük uyumluluğu bozan değişikliklerin çoğu hata özelleştirme API'siyle ilgili
- Hata özelleştirmesi tek bir
errorparametresinde birleştirildimessage,errorile değiştirildimessageparametresi desteklenmeye devam ediyor ama deprecated durumdainvalid_type_errorverequired_error, fonksiyon sözdizimindekierrorile değiştirildierrorMapde fonksiyon sözdizimindekierrorile değiştirildi
Birleştirilebilirlik, refinement ve transform
z.discriminatedUnion()artık daha önce desteklenmeyen çeşitli schema type'larını destekliyor- Buna union ve pipe da dahil
- Discriminated union, başka bir discriminated union'ın üyesi olabildiği için birleştirilebilir hale geliyor
- Zod 3'te refinement, orijinal schema'yı saran
ZodEffectssınıfında tutuluyordu- Bu yapı,
.refine()ile.min()gibi diğer schema yöntemlerini birlikte kullanmayı zorlaştırıyordu
- Bu yapı,
- Zod 4'te refinement schema'nın içinde saklanıyor; böylece
.refine()ve diğer schema yöntemleri doğal şekilde birlikte kullanılabiliyor - Yeni
.overwrite()yöntemi, inferred type'ı değiştirmeyen transform'ları ifade ediyor.transform()çıktısının type'ı runtime'da introspect edilemez ve transform fonksiyonu herhangi bir şey döndürebilen bir kara kutudur- Bu yüzden JSON Schema'ya güvenli biçimde dönüştürmenin bir yolu yoktur
.overwrite()orijinal sınıfın bir instance'ını döndürür- overwrite fonksiyonu refinement olarak saklanır ve inferred type'ı değiştirmez
- Mevcut
.trim(),.toLowerCase()ve.toUpperCase()artık.overwrite()kullanılarak yeniden uygulanıyor
Kütüphane yazarları için temel
- Zod Mini'nin eklenmesiyle, Zod ve Zod Mini'nin paylaştığı çekirdek işlevleri içeren
zod/v4/corealt paketi oluşturuldu zod/v4/core, Zod'u basit bir kütüphaneden çıkarıp diğer kütüphanelerin içine gömülebilen hızlı bir doğrulama temeline dönüştürüyor- Bir schema kütüphanesi geliştiriyorsanız, Zod ve Zod Mini uygulamalarını referans alıp
zod/v4/coreüzerine inşa edebilirsiniz - Kütüphane yazarları için For library authors rehberi sunuluyor
- Zod üzerine inşa ederken best practice'leri ele alıyor
- Zod 3, Zod 4 ve Mini'yi aynı anda destekleme konusunda sık sorulan soruları yanıtlıyor
1 yorum
Hacker News yorumları
Yazarıyım, istediğinizi sorun. Sürüm politikası konusunda bu yaklaşımın gerekçesini epey ayrıntılı yazdım: https://github.com/colinhacks/zod/issues/4371
Sonuçta npm, Zod’un içinde bulunduğu durumu iyi yönetmek üzere tasarlanmamış. Onlarca-yüzlerce kütüphane Zod’un arayüzlerini/sınıflarını doğrudan içe aktarıp kendi public API’lerinde kullandığı için, Zod her major sürüm artırdığında bu kütüphanelerin de yeni major sürüm çıkarması gerekiyor
Tek başına bakıldığında mantıklı, ama Zod’da herkes için acı verici bir sürüm çığı oluşabilir ve ekosistemin önemli bir kısmı sonsuza dek v3’e kilitlenecek gibi görünüyordu
Bu yüzden Go’dakine benzer şekilde, paketin uyumluluğu bozan yeni bir sürüm çıkarması yerine yeni bir alt yol ekleme yolunu seçtik. TypeScript ekosisteminde bir kütüphane yalnızca
zod@^3.25.0peer dependency’si koyup"zod/v3"ve"zod/v4"üzerinden gerekenleri içe aktararak iki sürümü aynı anda destekleyebilirAncak özel koşullar nedeniyle biraz tuhaf bir sürüm politikası seçilmesini anlasam da, transitif bağımlılıklardaki Zod sürüm çakışmalarını dert etmesi gerekmeyen ekipler açısından
4.0.0paketi de olsaydı iyi olurduDoğru anladıysam import’ları
"zod/v4"olarak değiştirmek gerekiyor; bu çok gürültülü bir değişiklik ve IDE’nin'zod'üzerinden otomatik import yapma sorununu lint kuralıyla yakalamak gerektiği için can sıkıcı olabilir.optional()’ı düzeltme işi en üstteki 9-10 issue’nun çözümüne dahil mi merak ediyorum: https://github.com/colinhacks/zod/issues/635Bu, Zod’da yaşadığım en büyük sıkıntıydı; ama Zod o kadar iyi ki yine de buna katlanıp kullanıyorum
Bunu Zod’un kapsamı dışında mı görüyorsunuz, yoksa henüz uygulamaya zaman mı olmadı merak ediyorum. İlgili tartışma https://github.com/colinhacks/zod/discussions/2134 adresinde
3.25.0olduğu anlamına geliyorsa, bu biraz mantıksız geliyorAylardır Zod alfa sürümünü kullanıyordum ve sadece
package.json’ı düzelterek yükseltmek istiyordum; şimdi tüm git geçmişini kurcalamam gerekecek gibi görünüyorProjeyi büyük minnetle kullanıyorum ama bu geri bildirim özelinde, gereğinden fazla zorlaştırılmış gibi.
3.xile birlikte 4.x de yayımlanamaz mıydı diye düşünüyorum“Migrasyonu basitleştirmek için Zod 4’ü
zod@3.25sürümünün parçası olarak Zod 3 ile birlikte dağıtıp"/v4"alt yolundan içe aktartmak” ifadesi, npm bağımlılık yönetiminin tamamen karmakarışık olduğunun işareti gibi görünüyorPeer dependency’ler o kadar bozulmuş ki v4’ün v3’müş gibi davranması gereken bir duruma gelinmiş
npm’in Zod’un içinde bulunduğu durumu iyi yönetemediği doğru. Ancak Zod, neredeyse hiçbir kütüphaneyi kabul etmeme kısıtı altında. Onlarca-yüzlerce kütüphane
"zod"üzerinden arayüzleri/sınıfları doğrudan içe aktarıp kendi public API’lerinde kullanıyorBu tür kütüphanelerin, Zod her major sürüm artırdığında yeni major sürüm çıkarması gerekiyor ve Zod’da bu herkes için acı verici bir sürüm çığına yol açabilir. Açıkçası ekosistemin önemli bir kısmı sonsuza dek v3’e kilitlenecek gibi görünüyordu
Bu yüzden Go’ya benzer şekilde, uyumluluğu bozan her sürüm için yeni paket sürümü çıkarmak yerine yeni bir alt yol eklemeyi seçtik. TypeScript ekosisteminde
zod@^3.25.0şeklinde tek bir peer dependency ile"zod/v3"ve"zod/v4"aynı anda desteklenebilirYani kullanım yerlerini tek tek
import ... from 'zod/v4'olarak refactor edip, bitince tamamen v4’e yükseltme akışıHatta npm, gerekirse birden çok sürümü aynı anda çalıştırabildiği veya transitif bağımlılık grafiğinin bir kısmını seçici olarak override edebildiği için daha fazla çıkış yolu sunuyor
Hangi paket yönetim sistemi bu sorunu çözüyor? Maven gibi “stabil” platformlar bile Apache Commons’ın v2’den v3’e geçişinde olduğu gibi yeni namespace ile sürüm çıkararak bu tür sorunları ele alıyor
Uzun zamandır merak ettiğim bir soru var. Zod’un buna uyabileceğini duymuştum ama dokümanlara bakınca nasıl yapılacağını pek anlayamadım.
Sunucu API’sinin ifade edebileceğinden daha incelikli bir tip döndürdüğünü varsayalım. Örneğin
api/:postid/authorbir User döndürüyor, ama bu normal bir User da olabilir anonim bir User da; bu yüzdenusername,locationgibi alanlar null gelebilir. Bu durumda User nesnesini ayrıştırılmış union olarak ifade etmek isteyebilirsiniz.Başka endpoint’lerden gelen nesnelerde de tip dönüşümü gerekebilir. User bazen
Post[]içerebilir; Post da moderatör gönderisiyse özel özelliklere sahip olabilir.Eskiden
normalizeUser()venormalizePost()gibi fonksiyonlar yazıyordum ama kısa sürede dağınıklaştı. Her endpoint User/Post modelinin farklı alt kümelerini döndürdüğü için yaklaşık 5 tanenormalizePostyazmak zorunda kaldım; çok karmaşık oldu. Bu tür sorunlar genelde nasıl çözülüyor merak ediyorum.statusgibi bir ayrıştırıcı alanı temel alıpsuccessvefailednesnelerini ayırmak gibi. Moderatörlere özel çok sayıda özellik varsa ama hepsini tek tek listelemek ya da kontrol etmek istemiyorsanız passthrough davranışı tanımlayabilirsiniz.Birden fazla metodun farklı şemaları olsa bile ortak bir bölüm varsa paylaşılan bir nesne şeması oluşturup, bunun üstüne ek alanlar bindirilmiş nesneler oluşturabilirsiniz. Olasılık sayısı fazlaysa yine dağınık olacaktır; ama durum zaten dağınıksa, doğrulayıcı en azından bu dağınıklığı doğrulayabilir.
Full-stack TypeScript değilse, örneğin Python backend’de farklı
Userbiçimlerini Pydantic modelleri ve union’lar olarak tanımlayıp, OpenAPI/GraphQL şeması üretimi ve kod üretimiyle TypeScript istemci tipleri oluşturabilirsiniz."user_type"gibi bir ayrıştırıcı özellik eklerseniz genel durumları ve özel durumları ele almak kolaylaşır.Örneğin
user.user_type === 'authenticated'kontrolünü yaptığınızda tip sistemi, bunun ardındanuser.namekullanılabileceğini bilir.GraphQL sorguları için TypeScript kütüphaneleri, seçilen alan biçiminden yanıt biçimini dinamik olarak çıkarabilir.
{ user { username posts { text } } }seçersenizpostsiçeren bir yanıt tipi olur; yalnızca{ user { username } }seçersenizpostsözelliği tamamen çıkar.Sunucu gönderdiği veriyi bilir; bu yüzden bu bilgiyi metadata olarak istemciye sunmalı. Pratikte bu, Python backend’in Pydantic şemaları kullanması, bunlara dayanarak OpenAPI spesifikasyonunu otomatik üretmesi ve istemcinin tipleri üretmesi şeklinde olabilir.
Zod, gördüğüm alternatiflerden çok daha iyi; ama böyle açık doğrulama gereksiniminin kendisi bazen modern web geliştirmenin geldiği nokta açısından bir başarısızlık gibi hissettiriyor.
Full-stack geliştirmede aynı şekli birden fazla biçimde tarif etmek zorunda kalmak çok can sıkıcı. JS girdi doğrulaması, API tanımı için Swagger, sunucu tarafı girdi doğrulaması, şema uygunluğu için ORM, ayrıca sunucu ve istemci için ayrı TypeScript tanımları gerekiyor; bunlar sıkıcı.
TypeScript elimizdeki en iyi tek doğruluk kaynağı gibi hissettiriyor; ama gerçekte reflection yapmaya çalışan araçların her biri kendi modelini ve builder’ını yeniden tanımlıyor. Reflection’ın merkezde olduğu 5 büyük alan var ve her birinin birden fazla implementasyonu bulunuyor.
Eski bir TypeScript tip yayma aracı olan
reflect-metadata, runtime tip bilgisinin bir kısmını sağlıyor; ancak çok eski decorator ve metadata spesifikasyonlarını hedefliyor: https://www.npmjs.com/package/reflect-metadataBelki de birleşmenin başlangıcına gelmiş olabiliriz. Standard Schema projesi, başlıca doğrulama kütüphanelerinin çoğundan destek alıyor gibi görünüyor. Ancak bunu API tanımı veya ORM araçlarına kadar genişletmek hâlâ çok erken aşamada.
https://github.com/standard-schema/standard-schema?tab=readm...
Zod şemasında bir kez değişiklik yaptığınızda, tip kontrolüyle birlikte tüm uygulamaya yayılır. Zod şeması tek doğruluk kaynağı hâline gelir.
Elinizde zaten JSON Schema/Swagger şeması varsa buradan Zod üretebilirsiniz. TypeScript ORM kullanıyorsanız neredeyse kesinlikle bir Zod generator’ı vardır.
Açıkçası Zod o kadar yaygın kullanılıyor ki benim için stack’teki diğer şeylerin dayanabileceği birleşik şema tanımı hâline geldi. Tipleri doğrudan tanımladığı için geliştiriciler gerçekten güncel tutuyor. Şirketin Swagger dokümanları değişikliklerin hep gerisinde kalıyor.
Mevcut düzenin kabul edilebilir olduğu tek durum, sadece sonucu isteyen ve nasıl yapıldığıyla ilgilenmeyen müşteriler ve işverenlerle çalıştığınız zamandır. Böyle bir bağlamda bu talihsiz karmaşıklık katmanları en azından faturalandırılabilir saatleri artırır.
Elbette Zod’un, kişinin seçtiği TypeScript şema tanımı ve doğrulama kütüphanesi olduğu varsayımıyla.
Zod 4 iyi görünüyor, ancak en son iyileştirmeler dahil edilse bile ArkType hâlâ tek haneli katlar düzeyinde daha hızlı
Geriye dönük uyumluluk ve söz dizimi uyumluluğu için, tamamen sıfırdan başlamış bir kütüphane kadar hızlı yapmak bazen çok daha zor olabiliyor. Yakın tarihli bir projede bu araçların hepsini analiz ettik ve kısmen bu nedenle ArkType’ı seçtik. TypeScript kullanım deneyimi de daha iyi hissettirdi
Biz Zod’u yalnızca form doğrulaması için kullanıyoruz, bu yüzden “bu neden önemli?” diye düşünüyorum. İnsanların yüksek iş hacimli API giriş mesajları gibi şeyleri doğruladığı ve performansın daha önemli hâle geldiği durumlar mı var acaba
Yine de Zod’dan geçeceğimi sanmıyorum
Zod ekibini yeni sürüm için tebrik ederim. Fazla olumsuz duyulma riskini göze alarak söyleyeyim: migrasyon rehberinde listelenen uyumluluğu bozan değişikliklerin sayısını düşününce ürperiyorum
Zod’a ciddi ölçüde bağımlı bir proje için bunun geliştirici odağı ve zamanı gerektiren göz korkutucu bir iş olacağını düşünüyorum. İş yerinde 4–5 yıllık birkaç frontend projesinin bakımını yaptığım için özellikle empati kuruyorum
Büyük React projeleri genelde çok sayıda kütüphaneye dayanıyor; her kütüphane büyük değişiklikler yayımladığında, hele dokümantasyon da yetersizse, bir anda bunaltıcı hâle geliyor. JavaScript ile çalışırken en sevmediğim şeylerden biri bu; her şeyi hizalı tutup sorunsuz çalışmaya devam ettirmek bitmeyen bir yokuş gibi hissettiriyor
Açıkçası kâbustu; keşke Django ile yapmış olsaydık diye düşündüm. Beklediğimin aksine Tailwind 3 → 4 migrasyonu en acı verici olanlar arasındaydı
miniedisyonuyla birlikte çift sunum yaklaşımını seçtiler. Paket yöneticisine dokunmadan kademeli migrasyon yapmak daha kolayminiedisyonuyla ilgilenmeyen kullanıcıların bu kısmı önemsemesine gerek yok. Ancakminiedisyonunun tree-shaking avantajı o kadar büyüktü ki alternatif geliştirmeyi teşvik ediyordu; Zod’un bunu benimsemesi ya da gerilemesi gerekiyorduProdüksiyonda binlerce kullanıcısı olan bir SaaS’ı bizzat işleten bir full-stack geliştirici olarak, SPA yapmamaya ve JS frontend framework’ü kullanmamaya karar verdiğim için hiç bilmediğim ne kadar çok problem olduğunu bazen memnuniyetle fark ediyorum
Zod/ArkType gibi bir şeye ihtiyaç duyabileceğimi hiç düşünmedim bile; ilk kez duyuyorum ve kullanacağım bir durum da yok
SPA yapmanın gerektirdiği emek, karmaşıklık ve araç miktarı beni şaşırtıyor. SPA yapmamaya karar verdiğinizde belirli bir problem kümesi tamamen ortadan kalkıyor. Bunun yerine tarayıcıyı tasarlandığı şekilde, tam sayfa yenilemeleri ve backend geliştirme odağıyla kullanıyor; ara sıra reaktivite eklemek için Laravel Livewire gibi yalnızca backend taraflı framework’lerden yararlanıyoruz
Erişim kontrolünden doğrulamaya ve durum yönetimine kadar her şey basit. Uygulama hızlı, responsive, modern, SEO dostu ve prodüksiyonda binlerce kişiye hizmet veriyor
Sonuçta bir yerlerde bir şema var. Veritabanı sisteminde tanımlanmış olabilir ya da ORM modelinde tanımlanmış olabilir. Ancak büyük projelerde şemayı veritabanı sistemine veya ORM’ye koymak çok zor sorunlar doğurabildiği için biz Zod ve Protobuf kullanıyoruz. Protobuf’un da Zod ya da benzeri bir şeyle tamamen değiştirilebileceğini düşünüyorum
Birleşik Krallık Post Office skandalında Horizon adlı bir IT sistemi vardı: https://en.wikipedia.org/wiki/British_Post_Office_scandal
Ayrıntıları okuyunca, Zod gibi şema doğrulaması olsaydı bu skandalı önlemeye katkı sağlayabilirmiş gibi geldi. Toplu dava mahkeme belgelerinin teknik ekinde de şema kullanımının yokluğundan bahsediliyor: https://en.wikipedia.org/wiki/Bates_%26_Others_v_Post_Office...
Şu an kulağa savunmacı şekilde bir sürü
ifyazıyormuşsunuz gibi geliyor. Daha kötüsü, yalnızca HTML’in istemci taraflı form doğrulamasına güveniyor da olabilirsinizUzman olmadığım için temkinliyim ama JSON Schema şema tabanlı olduğundan TypeScript dışındaki dillerde de doğrulayıcılar uygulanabildiği için iyi bir seçenek olabileceğini düşünmüştüm
https://ajv.js.org bu tür JSON Schema kütüphanelerinden biri. Zod ile kıyaslandığında nasıl olduğunu merak ediyorum
İsterseniz JSON dönüştürücü olarak da kullanabilirsiniz. Örneğin bir string alıp ISO tarih string'i olup olmadığını doğrulayan ve
Datenesnesi çıktısı veren bir şema yazabilirsinizÖnemli fark ön işleme ve
refine. Zod'da doğrulama öncesinde callback sağlayabilirsiniz; bu çok kullanışlıdır ama JSON ile ifade edilemez. Örneğin tarih doğrulamasından önceMM/DD/YYYY'yiDD/MM/YYYY'ye çevirmek sanıldığından daha sık işe yararDoğrulama için AJV'yi ya da TypeBox'ın kendi şema doğrulama sistemini kullanabilirsiniz. İkincisi çok daha hızlıdır ama yalnızca senkron çalışır; AJV ise veritabanı kontrolü gibi asenkron doğrulama seçeneklerine sahiptir
Bu konu etrafındaki olumsuz tepki şaşırtıcı
Zod v4'ün erken bir sürümünü test ettim ve yeni API hoşuma gitti, ancak geçiş yolunun nasıl olacağı konusunda çok endişeliydim. Hatta tamamen yeni bir paket adıyla yayımlanmasını önermeyi bile düşünmüştüm
Ama yazarın yaklaşımı akıllıca. Tüm bağımlılıkların güncellenmesini beklemeden benim gibi kişilerin v4'ü hemen benimsemesine olanak tanıyor
Yeni bir projede Zod'u daha yeni kullanmaya başlamıştım; bundan daha iyi bir zaman olamazdı
Şu an görünenlere göre v4'e geçmek için gerçekten çok şey değiştirmem gerekecekmiş gibi görünüyor