Giriş
Türkiye adresleri için headless React hook'u: il, ilçe ve mahalle zincirleme seçilir, posta kodu mahalleden türetilir; sunucu doğrulaması ve PTT verisiyle.
Adres formu göründüğünden zordur: il değişince ilçe ve mahalle temizlenmeli, posta kodu kullanıcıya yazdırılmamalı, 72 bin mahalle tek seferde indirilmemeli ve gönderilen adres sunucuda yeniden kontrol edilmelidir. useViraAddress() bunları tek hook ile çözer. Select'leriniz ve stiliniz sizde kalır.
Başlarken
$ pnpm add @virastack/addressAdres satırı
Seçim yaptıkça burada oluşur
value
{
"provinceCode": null,
"province": null,
"district": null,
"neighbourhood": null,
"postalCode": null,
"postalCodes": []
}İl seçilince ilçeler gelir, ilçe seçilince o ilin mahalleleri yüklenir, mahalle seçilince posta kodu value.postalCode alanına düşer. Bir üst seviyeyi değiştirmek altındakileri temizler. Posta kodu yazmak ters yönde çalışır ve select'leri doldurur.
Yukarıdaki demo aynı hook'u shadcn/ui Select ile kullanır; diğer bileşenler için UI kütüphaneleri sayfasına bakın.
Neden ViraStack Address?
- Zincirleme seçim: İl, ilçe, mahalle. Üst seviye değişince alttakiler hem hook'ta hem formda temizlenir.
- İki yönlü posta kodu: Mahalle seçilince kodu gelir, kod yazılınca select'ler dolar: kodun tek mahallesi varsa üçü de, yoksa il ve ilçe. Bkz. posta kodundan adres.
- Tek satır adres:
formatAddressseçimi "Alandüzü Mah. Adapazarı/Sakarya" biçimine getirir; istenirse posta koduyla. - Güncel veri: Veri her ay otomatik bir sistemle PTT'ye karşı kontrol edilir. Bir değişiklik bulunursa yeni bir patch sürümü yayınlanır; API değişmez.
- İsteğe bağlı yükleme: İl ve ilçe adları paketle gelir; bir ilin mahalleleri yalnızca o il seçilince yüklenir. Tipik bir ziyaret yaklaşık 10 kB indirir.
- Headless: Hiçbir şey çizmez. Native select, shadcn/ui, Ant Design veya kendi bileşeninizle çalışır.
- Türkçe farkındalık: Sıralama, harf dönüşümü ve arama
İileı'yı doğru işler. - Sunucuda doğrulama: Client'ın gönderdiği posta koduna güvenilmez;
resolveAddressadresi veri setine karşı yeniden kontrol eder, posta kodunu sunucuda türetir ve uymayan bir kodu reddeder.
Karşılaştırma
Karşılaştırılan iki paket veri paketidir: select'leri, zincirlemeyi ve doğrulamayı siz yazarsınız. Fark hook, posta kodu, isteğe bağlı yükleme ve sunucu tarafındadır.
| Özellik | ViraStack Address | turkey-neighbourhoods | turkey-location-data |
|---|---|---|---|
| React hook (zincirleme select'ler) | Var | Yok | Yok |
| İl, ilçe ve mahalle verisi | Var | Var | Var |
| Pakette bulunan mahalle sayısı | 72.466 | 73.305 | 49.662 |
| Mahalleden posta kodu | Var | Yok | Yok |
| Tarayıcıda çalışır | Var | Var | Yok |
| İl bazında isteğe bağlı yükleme | Var | Yok | Yok |
| Sunucuda adres doğrulama | Var | Kısmi ya da elle | Kısmi ya da elle |
| Türkçe harf dönüşümü, sıralama ve arama | Var | Yok | Kısmi ya da elle |
| Şehirler arası mesafe | Yok | Var | Yok |
| Çalışma zamanı bağımlılığı | - | - | fs |
| Boyut (aynı form, ilk yükleme, min+gzip) | 8,6 KB | 434,5 KB | Tarayıcı için derlenemez |
| Son sürüm | 0.0.0Yayınlanmadı | 4.0.3Mart 2024 | 1.1.1Mayıs 2025 |
var · kısmi ya da elle · yok. 29 Ekim 2026’da npm paketleri (turkey-neighbourhoods 4.0.3, turkey-location-data 1.1.1) ve @virastack/address yerel derlemesi üzerinden kontrol edildi.
Boyut nasıl ölçüldü: Aynı form (zincirleme il, ilçe ve mahalle select'leri) üç paketle ayrı ayrı yazıldı ve esbuild ile production modunda, minify, tree-shaking ve code splitting açık derlendi. Tablodaki boyut, sayfa ilk açıldığında inen JS'in aynı formun veri paketi olmadan derlenmiş halinden farkının gzip boyutudur; React iki tarafta da olduğu için boyuta dahil edilmez. Address'te bir ilin mahalleleri o il seçilince ayrıca iner: ortanca 4,8 KB, en büyüğü 29,6 KB. turkey-location-data veriyi Node'un fs modülüyle okuduğu için tarayıcı için derlenemez. Sunucu doğrulamasındaki kısmi işaret, adresin dışa aktarılan listelerle elle kontrol edilebildiği anlamına gelir.
Giriş noktaları
Yalnızca kök girişte "use client" vardır. /server ve /data React import etmez; Server Component, Server Action, route handler ve Node betiklerinde çalışır.
| Import | Dışa aktarımlar | Çalıştığı yer |
|---|---|---|
@virastack/address | useViraAddress, formatAddress, formatName, toSearchKey, compareNames, normalizePostalCode, defaultSource | client |
@virastack/address/server | resolveAddress, resolvePostalCode, postalCodeFor, formatAddress, districtsOf, findProvince, provinces | server |
@virastack/address/data | provinces, districts, province, neighbourhoods, findPostalCode, setLoader, source | client + server |
Gereksinimler
- Hook için React 18.2+ (React 19 desteklenir).
/serverve/dataReact olmadan çalışır. - Node.js 20+
- Çalışma zamanı bağımlılığı yok; veri paketin içinde gelir.
- React Hook Form isteğe bağlıdır. Hook ondan hiçbir şey import etmez; formu
formseçeneğiyle alır.
Kapsam
- useViraAddress(), React Hook Form ve UI kütüphaneleri
- Sunucu doğrulaması ve veri seti
- Türkçe yardımcılar ve tipler
Kapsam dışı: sokak, bina ve kapı numarası (veri setinde yoktur, serbest metin olarak alın), yurt dışı adresler, harita ve konumdan adres bulma, hazır select bileşeni.
