Safari 27, JavaScript modüllerinde top-level await‘i artık ECMAScript spesifikasyonuna tam uyumlu şekilde destekliyor. WebKit ekibi bunu, Safari’nin 2016’dan kalma modül yükleyicisini native C++ ile sıfırdan yeniden yazarak başardı ve değişikliği 2 Eylül 2026’da yayımladıkları blog yazısında duyurdu.
Top-level await, 2022’den beri diğer büyük tarayıcılarda sorunsuz çalışıyordu; Safari’de ise modül grafiği karmaşıklaştıkça modüllerin beklenmedik sırada çözünmesi gibi sinir bozucu hatalara yol açıyordu. WebKit’in çözümü kozmetik bir yama değil, yükleyicinin temelden değişmesiydi.
Top-Level Await Nedir?
Top-level await, bir JavaScript modülünün en üst seviyesinde — bir async fonksiyonun içine sarmadan — await kullanabilmeyi sağlayan ECMAScript 2022 özelliğidir. Bir modül top-level await’e rastladığında, onu import eden diğer modüller de o Promise çözülene kadar bekletilir.
Bu, geliştiricilere şunları sağlar:
Async veriyi doğrudan modül seviyesinde çekebilme — bir yapılandırma dosyasını veya API yanıtını modülün en tepesinde bekleyebilirsiniz, ayrı bir başlatma fonksiyonu yazmaya gerek kalmaz.
Koşullu modül yükleme — dinamik import()ile birlikte kullanıldığında, çalışma zamanı koşullarına göre farklı modüller yüklenebilir.- Modüller arası doğru bekleme sırası — bir modül grafiğindeki bağımlılıklar, gerçekten çözülme sırasına göre işlenir.
Safari’nin Eski Modül Yükleyicisinde Sorun Neydi?
Safari’nin eski modül yükleyicisi, top-level await henüz spesifikasyonda yokken, 2016’daki WHATWG Loader önerisine dayanılarak tasarlanmıştı. ECMAScript 2022 top-level await’i tanıttığında, bu mimari onu doğru şekilde desteklemeye uygun değildi.
WebKit’in blog yazısında verdiği somut örnek şu: “1”, “2” ve “3” modüllerini sırayla import eden bir kod, beklenen “1, 2, 3” yerine “2, 3, 1” sırasında tamamlanabiliyordu — bu da modüllerin birbirinin durumuna eriştiği senaryolarda gerçek erişim hatalarına yol açıyordu. Sorun uç bir durum değil, modül grafiği büyüdükçe daha sık karşılaşılan bir davranıştı.
Bu tür sıralama sorunları, tarayıcıların CSS ve JS platformunda spesifikasyona ne kadar sıkı bağlı kaldığı sorusuyla da örtüşüyor; benzer bir “tarayıcı aslında spesifikasyona uyuyor ama beklenti farklı” durumunu daha önce “Blocked aria-hidden” uyarısı yazımızda da ele almıştık.
WebKit Modül Yükleyiciyi Nasıl Yeniden Yazdı?
WebKit ekibi, sorunu yamamak yerine yükleyiciyi self-hosted JavaScript’ten native C++’a taşıdı. Gerekçe olarak başlangıç (startup) hızı ve performans tahmin edilebilirliği gösterildi. Yeniden yazım Ocak 2026’da başladı; ekip, ECMAScript spesifikasyonundaki modül yükleme algoritmasının pseudokodunu doğrudan C++’a çevirdi.

Bu, WebKit’in son dönemde platform uyumluluğuna verdiği önemin bir başka örneği; CSS’e gelen Document Picture-in-Picture desteği ve taslak aşamasındaki Navigasyon Eşleştirme gibi web platformu güncellemeleriyle aynı çizgide ilerliyor.
Zaman Çizelgesi

Yeni Yükleyici Nasıl Test Edildi?
Modül yükleme sırası gibi ince davranışlarda regresyon riski yüksek olduğu için WebKit dört farklı doğrulama katmanı kullandı:
- Bun test paketi — Bun runtime’ının kendi modül testleri Safari üzerinde çalıştırıldı.
- Özel bir fuzzer — rastgele modül grafikleri üreterek uç durumları taradı.
- Test262 ve WPT — ECMAScript ve web platformu standart uyumluluk paketleriyle çapraz kontrol edildi.
- Motorlar arası byte-for-byte karşılaştırma — sonuçlar diğer büyük JavaScript motorlarıyla birebir kıyaslandı.

Ne Zaman Kullanılabilir Olacak?
Düzeltme şu anda Safari Technology Preview 251 ve Safari 27 beta‘da mevcut; genel kullanıma Safari 27 sürümüyle birlikte sunulacak.
Eski hatalı sıralama davranışına dolaylı olarak bağımlı kodunuz varsa test etmeden Safari 27’ye geçmeyin — modül çözünüm sırası artık spesifikasyona uygun şekilde değişiyor.- Bir sorunla karşılaşırsanız WebKit ekibi hataları bugs.webkit.org üzerinden bildirmenizi istiyor.
Sık Sorulan Sorular
Top-level await Safari’nin hangi sürümünde tam olarak destekleniyor?
Şu an için Safari Technology Preview 251 ve Safari 27 beta’da mevcut. Genel kullanıma Safari 27’nin stabil sürümüyle sunulacak (kaynak: WebKit blog, 2 Eylül 2026).
Eski Safari’de top-level await neden hatalı çalışıyordu?
2016’daki WHATWG Loader önerisine dayanan eski modül yükleyici mimarisi, 2022’de eklenen top-level await için tasarlanmamıştı. Bu yüzden modüller, “1, 2, 3” yerine “2, 3, 1” gibi beklenmedik sırada çözünebiliyor ve erişim hatalarına yol açabiliyordu.
WebKit modül yükleyiciyi neden native C++’a taşıdı?
Ekip, başlangıç hızı ve performans tahmin edilebilirliği için self-hosted JavaScript yerine ECMAScript’in modül yükleme algoritmasını doğrudan native C++’a çevirdi. Yeniden yazım Ocak 2026’da başladı.
Bu değişiklik hangi testlerden geçti?
Bun runtime’ının test paketi, özel bir fuzzer, Test262/WPT uyumluluk testleri ve diğer JavaScript motorlarıyla byte-for-byte karşılaştırma kullanıldı. Amaç, modül çözünüm sırasındaki regresyonları yakalamaktı.








Bir Yorum Yazın