Merhaba sevgili teknoloji tutkunları ve web geliştirme yolculuğunda benim gibi bazen minik pürüzlerle karşılaşanlar! Bugün hepimizin özellikle modern web uygulamaları geliştirirken zaman zaman başını ağrıtan, ancak doğru yaklaşımla çok büyük farklar yaratabileceğimiz bir konuyu ele alacağız: JavaScript olay (event) optimizasyon teknikleri.
Düşünsenize, kullanıcılar sitenizde gezinirken her tıklama, her kaydırma, her tuş vuruşu aslında bir olay zincirini tetikliyor. Bu olayların yönetimini hafife almak, inanın bana, hem sitenizin performansını dibe çekiyor hem de kullanıcıların “Ya bu site ne kadar yavaş!” diye hayıflanmasına neden oluyor.
Benim de bu konuda çokça kafa yorduğum, deneyimlerimden süzdüğüm ve 2024-2025’in en güncel yaklaşımlarını bir araya getirdiğim bu rehberle, artık web sayfalarınızın adeta bir yarış arabası gibi hızlanmasını sağlayacağız.
Unutmayın, hızlı ve akıcı bir kullanıcı deneyimi sadece memnuniyet değil, aynı zamanda SEO performansınız ve kazancınız için de hayati öneme sahip. Hazırsanız, bu olayları nasıl ustaca yöneteceğimizi, gereksiz yükten nasıl kurtulacağımızı ve sitelerimizi nasıl uçuracağımızı adım adım keşfetmeye başlayalım.
Emin olun, bu küçük dokunuşlarla elde edeceğiniz verim sizi şaşırtacak. Gelin, web sitelerinizin performansını zirveye taşıyacak JavaScript olay optimizasyon tekniklerini detaylıca inceleyelim!
Gereksiz Yüklerden Kurtulmak: Olay Dinleyicilerini Akıllıca Kullanmak

Web sayfalarımızda her bir etkileşim, aslında arka planda bir olayı tetikler ve bu olayı dinleyen bir kod parçacığının çalışmasını sağlar. Ancak bazen farkında olmadan yüzlerce, hatta binlerce gereksiz olay dinleyicisi ekleyebiliyoruz.
Özellikle dinamik olarak içerik yüklenen veya silinen sayfalarda bu durum, sayfa performansını ciddi şekilde olumsuz etkileyebilir. Ben şahsen, bir projemde sayfa ilk açıldığında fark etmediğim bu yavaşlığı, kullanıcı raporlarıyla keşfettiğimde şaşırmıştım.
Sonra oturup kodu incelediğimde gördüm ki, her bir listeleme elemanına ayrı ayrı click dinleyicisi eklemişim. O an anladım ki, “az kod, çok iş” prensibi sadece okunabilirlik için değil, performans için de altın değerinde.
Bu dinleyicilerin sayısı arttıkça, tarayıcının her etkileşimde kontrol etmesi gereken mekanizma büyüyor, bu da doğal olarak sayfanın yanıt verme süresini uzatıyor ve kullanıcı deneyimini baltalıyor.
Unutmayın, kullanıcının sabrı bir yere kadar, hele ki günümüz internet hızında herkes anında tepki bekliyor.
Tekrar Eden Dinleyicilere Veda Edin
Eğer bir olay dinleyicisini bir elemente zaten eklemişseniz, aynı dinleyiciyi aynı elemente tekrar eklemek sadece gereksiz kaynak tüketimine yol açar.
Bu durum özellikle döngüler içinde veya dinamik içerik güncellemeleri sırasında sıkça yapılan bir hatadır. Örneğin, bir liste güncellendiğinde tüm liste elemanlarına yeniden olay dinleyicisi eklemek yerine, var olan dinleyicilerin düzgün bir şekilde yönetildiğinden emin olmalıyız.
Bu, hem belleği daha verimli kullanmamızı sağlar hem de tarayıcının üzerinde gereksiz yük bindirmesini engeller. Benim tavsiyem, özellikle karmaşık tek sayfa uygulamalarında, bir bileşenin yaşam döngüsünü iyi anlamak ve dinleyicileri sadece ihtiyaç duyulduğunda ekleyip, bileşen yok edildiğinde kaldırmayı bir alışkanlık haline getirmek.
Böylece gereksiz yere yığılmış dinleyicilerden kurtulur, sayfanızın adeta nefes almasını sağlarsınız.
Dinleyici Sayısını Azaltmanın Yolları
Toplam olay dinleyicisi sayısını azaltmanın en etkili yollarından biri, olay delegasyonu (event delegation) gibi teknikleri kullanmaktır. Bu tekniği birazdan daha detaylı inceleyeceğiz, ancak özetle, birçok alt elemente dinleyici eklemek yerine, bu elemanların ortak bir üst atasına tek bir dinleyici ekleyerek işimizi halletmek anlamına gelir.
Böylece, yüzlerce küçük dinleyici yerine sadece bir tane büyük dinleyiciye sahip oluruz. Bu, sadece performansı artırmakla kalmaz, aynı zamanda kodunuzu daha temiz ve yönetilebilir hale getirir.
Düşünsenize, bir düğme koleksiyonunuz var ve her birine ayrı ayrı yazmak yerine, hepsini kapsayan tek bir elemanına dinleyici ekleyip, tıklanan düğmenin hangisi olduğunu iç logic ile bulmak çok daha zarif bir çözüm.
Bu tür yaklaşımlar, özellikle büyük ölçekli ve dinamik web uygulamalarında hayati önem taşır.
Performansı Zirveye Taşıyan Değişimler: Event Delegation Mucizesi
Event delegation (olay delegasyonu), web geliştirme dünyasında bence altın standartlardan biri olmalı. Gerçekten de, performansı artırmanın ve kod temizliğini sağlamanın en şık yollarından biri.
Hayatımda bir sürü projede bu teknik sayesinde çok büyük dertlerden kurtuldum, adeta bir can simidi oldu benim için. Özellikle dinamik olarak eklenen içeriklerle çalıştığımızda, her yeni eklenen elemana tek tek olay dinleyicisi bağlamak hem yorucu hem de performans katili bir işlem.
Düşünsenize, bir alışveriş sitesinde ürün listeliyorsunuz ve kullanıcı sürekli yeni ürünler yüklüyor (sonsuz kaydırma gibi). Eğer her bir ürün kartına “sepete ekle” butonu için ayrı bir dinleyici ekleseydiniz, sayfanızdaki dinleyici sayısı hızla binleri bulur ve bu da tarayıcınızın canını okurdu.
İşte tam bu noktada olay delegasyonu sahneye çıkıyor ve “Dur bakalım, bu iş böyle olmaz!” diyor. Benim tecrübelerime göre, bu teknik sayesinde hem kodum daha az yer kapladı hem de sitenin tepkime süresi gözle görülür şekilde iyileşti.
Sanki bir orkestra şefi gibi, tüm enstrümanları tek bir merkezden yönetiyorsunuz, her enstrüman için ayrı ayrı şef görevlendirmek yerine.
Neden Event Delegation Kullanmalıyız?
Olay delegasyonu kullanmak için birçok geçerli sebep var. En başta, daha önce de belirttiğim gibi, performans artışı sağlıyor. Daha az olay dinleyicisi demek, daha az bellek tüketimi ve daha hızlı işlem anlamına geliyor.
İkinci olarak, dinamik içerik yönetimi çok daha kolaylaşıyor. Yeni elemanlar eklediğinizde veya mevcut elemanları sildiğinizde, olay dinleyicilerini manuel olarak ekleyip kaldırma derdinden kurtuluyorsunuz.
Çünkü dinleyici, ebeveyn eleman üzerinde olduğu için, çocuk elemanların gelip gitmesi onu hiç etkilemiyor. Üçüncü olarak, kodunuz daha temiz ve daha az hataya açık hale geliyor.
Her bir elemana ayrı ayrı dinleyici eklemek yerine, tek bir merkezi yerden yönetmek, kod tekrarını azaltır ve gelecekteki değişiklikleri çok daha basitleştirir.
Bu teknik, modern JavaScript çerçevelerinin (React, Vue, Angular gibi) sanal DOM ve bileşen tabanlı yaklaşımlarının temelinde yatan prensiplerden biri aslında.
Kullanıcılar anında tepki veren bir sayfa gördüğünde, siteye olan güvenleri artıyor ve daha uzun süre kalıyorlar.
Event Delegation ile Daha Temiz Kod
Olay delegasyonunu uygularken genellikle özelliğini kullanırız. Olay dinleyicisini bir ebeveyn elemana bağlarız ve olay tetiklendiğinde, özelliğini kontrol ederek olayın aslında hangi alt eleman üzerinde gerçekleştiğini buluruz.
Örneğin, bir liste elemanına tıklanıldığında, tıklanan spesifik elemanını (veya içindeki , gibi elemanları) verir. Daha sonra bu elemanının belirli bir sınıf adı veya veri özniteliği (data attribute) olup olmadığını kontrol ederek istediğimiz işlemi gerçekleştirebiliriz.
Bu, kodunuzu inanılmaz derecede esnek yapar ve DOM yapısında yapılacak küçük değişikliklerden etkilenmemenizi sağlar. Benzer şekilde, eğer bir yerine ya da içinde bir ikon kullanıyorsak ve bu ikona tıklanılmasını istiyorsak, ile doğru elemanı yakalamak, kullanıcı deneyimini bozmadan esnek bir şekilde etkileşim sağlayabilir.
Unutmayın, ne kadar az ve merkezi dinleyici, o kadar az hata potansiyeli ve o kadar kolay bakım!
Tetiklenmeyi Kontrol Altına Almak: Debounce ve Throttle ile Daha Akıcı Deneyimler
Bazı olaylar var ki, neredeyse her an tetiklenebilirler: klavye girişi (keyup, keydown), pencere boyutlandırma (resize), kaydırma (scroll), fare hareketi (mousemove).
Eğer bu olayları doğrudan dinleyip her tetiklendiğinde ağır bir işlem çalıştırırsak, sayfamız saniyeler içinde kilitlenebilir veya inanılmaz derecede yavaşlayabilir.
Benim başıma gelen bir olayı anlatayım: Bir arama kutusu yapmıştım ve kullanıcı her harf girdiğinde sunucuya istek atıp sonuçları anında getiriyordu. İlk başta kulağa hoş gelse de, kullanıcı hızlıca “İstanbul” yazdığında arka arkaya yedi tane sunucu isteği gidiyordu.
Bu da hem sunucuyu gereksiz yere yoruyor hem de kullanıcı arama sonuçları gelene kadar beklemek zorunda kalıyordu. Tamamen kaotik bir durumdu! İşte bu tür senaryolarda ve imdadımıza yetişiyor.
Bu iki teknik, olayların tetiklenme sıklığını sınırlayarak gereksiz iş yükünü ortadan kaldırır ve kullanıcı arayüzünün akıcı kalmasını sağlar. Onları adeta bir trafik polisi gibi düşünebilirsiniz; olay akışını düzenleyip, sadece doğru zamanda geçiş izni veriyorlar.
Debounce: Sadece Son Dokunuş Önemlidir
Debounce, bir olayın belirli bir süre içinde tekrar tetiklenmesini engeller. Eğer olay bu süre içinde tekrar tetiklenirse, önceki sayacı sıfırlar ve yeniden beklemeye başlar.
Yani, olay durana kadar hiçbir işlem yapmaz, sadece son tetiklenmeden sonra belirlenen süre geçtikten sonra fonksiyonu çalıştırır. Yukarıdaki arama kutusu örneğinde, kullanıcı “İstanbul” yazarken her harften sonra 300ms beklersek ve bu süre içinde yeni bir harf girmezse, ancak o zaman sunucu isteği göndeririz.
Kullanıcı hızlı yazmayı bitirdiğinde sadece tek bir istek gönderilmiş olur. Bu, benim de kullandığım ve büyük verim aldığım bir yöntemdir. Özellikle otomatik tamamlama, canlı arama ve pencere yeniden boyutlandırma gibi yoğun olaylarda harikalar yaratır.
Kullanıcının klavyesini hızla tuşlaması veya fareyi sürekli hareket ettirmesi, arayüzü kilitlemek yerine, sistemin sadece nihai girdi üzerinde çalışmasını sağlar.
Bu sayede hem kullanıcı daha akıcı bir deneyim yaşar hem de sunucu tarafındaki yük azalır.
Throttle: Akışı Kontrollü Tutmak
Throttle ise debounce’a benzer, ancak farklı bir yaklaşıma sahiptir. Bir olayın belirli bir zaman aralığında sadece bir kez tetiklenmesini sağlar. Yani, olay ne kadar sık tetiklenirse tetiklensin, belirlenen zaman aralığında fonksiyon sadece bir kez çalışır.
Örneğin, bir kaydırma olayını (scroll event) dinlerken, her piksel kaydırmada fonksiyon çalıştırmak yerine, throttle ile bunu 200ms’de bir çalıştırabiliriz.
Bu, özellikle sonsuz kaydırma (infinite scroll) uygulamalarında, animasyonlarda veya fare hareketine bağlı görsel güncellemelerde çok işe yarar. Benim bir defasında büyük bir harita uygulamasında mousemove olayına bağlı sürekli marker güncellemeleri yapmam gerekiyordu ve throttle kullanmadan önce sayfa kasım kasım kasılıyordu.
Throttle uyguladığımda ise, sanki bir sihirli değnek değmiş gibi tüm sorunlar ortadan kalktı ve harita akıcı bir şekilde yanıt vermeye başladı. Bu, kullanıcı deneyimi açısından inanılmaz bir fark yaratır ve web uygulamanızın profesyonel görünmesini sağlar.
Görünmez Ama Güçlü Optimizasyonlar: Pasif Olay Dinleyicilerin Sırrı
Modern web tarayıcıları ve web uygulamaları, kullanıcı deneyimini daha akıcı hale getirmek için sürekli gelişiyor. Bu gelişmelerden biri de pasif olay dinleyicileri (passive event listeners).
Belki adını çok duymadınız ya da tam olarak ne işe yaradığını bilmiyorsunuzdur, ama inanın bana, özellikle mobil cihazlarda kaydırma (scroll) performansını uçurmak için paha biçilmez bir araç.
Benim de ilk keşfettiğimde “Aaa, böyle bir şey mi varmış?” diye şaşırdığım ve hemen uygulamaya başladığım bir özellik oldu. Eski alışkanlıklarımızdan biri, özellikle kaydırma veya dokunma olaylarını dinlerken metodunu kullanmaktı.
Bu metod, tarayıcının varsayılan davranışını (örneğin kaydırma) engellemek için kullanılırdı. Ancak tarayıcı, bir olay dinleyicisinin içinde çağrılıp çağrılmayacağını önceden bilemediği için, olayı dinleyen tüm betiğin çalışmasını beklemek zorunda kalıyordu.
Bu bekleme süresi, özellikle yavaş cihazlarda veya yoğun sayfalarda takılmalara, gecikmelere ve genel bir yavaşlığa yol açıyordu. İşte pasif olay dinleyicileri tam da bu sorunu çözmek için geliştirildi.
Scroll Performansını Uçuran Pasif Dinleyiciler
Pasif olay dinleyicileri, tarayıcıya “Ey tarayıcı, bu olay dinleyicisi içinde asla çağırmayacağım, bu yüzden varsayılan davranışı engelleme endişen olmasın, olayı olabildiğince hızlı bir şekilde işle” demenin bir yoludur.
Bu, tarayıcının olay dinleyicisinin tamamlanmasını beklemeden kaydırma gibi varsayılan davranışları sorunsuzca gerçekleştirmesine olanak tanır. Özellikle mobil cihazlarda parmakla kaydırma veya dokunma (touch) olayları, pasif dinleyiciler sayesinde çok daha tepkisel ve akıcı hale gelir.
Benim şahsen gördüğüm, özellikle içerik yoğun sayfalarda veya karmaşık animasyonların olduğu durumlarda, pasif dinleyicilerin etkinleştirilmesiyle sayfa kaydırma deneyiminin belirgin şekilde iyileşmesi.
Kullanıcılar artık takılmalar veya gecikmeler olmadan sayfayı akıcı bir şekilde aşağı yukarı kaydırabiliyorlar, bu da hem onların memnuniyetini artırıyor hem de sitenizin daha modern ve hızlı algılanmasını sağlıyor.
‘Passive: true’ ile Hızlı Yanıt
Bir olay dinleyicisini pasif hale getirmek oldukça basit. metoduna üçüncü parametre olarak seçeneğini eklemeniz yeterli. Örneğin, şeklinde bir kullanım, tarayıcıya bu kaydırma olayının varsayılan davranışını engellemeyeceğini söyler.
Ancak burada önemli bir uyarı: Eğer gerçekten de varsayılan davranışı engellemek (örneğin, bir dokunmatik kaydırmada özel bir kaydırma efekti uygulamak) istiyorsanız, pasif dinleyicileri kullanmamalısınız.
Aksi takdirde, çağrınız konsola bir hata fırlatabilir ve istediğiniz etkiyi elde edemeyebilirsiniz. Bu yüzden, pasif dinleyicileri akıllıca ve gerçekten ihtiyacınız olan yerlerde kullanmak çok önemli.
Genellikle , , , ve gibi olaylar için pasif dinleyiciler harika sonuçlar verir. Benim tecrübelerimle sabit, bu küçük dokunuş, özellikle mobil kullanıcılar için büyük bir fark yaratıyor.
Bellek Sızıntılarına Dur Demek: Olay Dinleyicilerini Doğru Yönetmek

Bir web uygulamasında performans sorunlarının önemli bir kısmı, aslında gözden kaçan bellek sızıntılarından kaynaklanır. Ve olay dinleyicileri, bu bellek sızıntılarının en sinsi nedenlerinden biri olabilir.
Benim de uzun zaman önce büyük bir e-ticaret sitesinde başımı ağrıtan bir sorundu bu. Kullanıcılar sitede gezinirken, sayfalar arasında geçiş yaptıkça sitenin yavaşladığını ve hatta bazı durumlarda tarayıcının kilitlendiğini fark ettik.
Uzun süren araştırmalar sonucunda, dinamik olarak eklenen ve kaldırılan bileşenlere bağlı olay dinleyicilerinin düzgün bir şekilde temizlenmediğini ve her sayfa geçişinde bellekte birikmeye devam ettiğini keşfettik.
Adeta bir hayalet ordu gibi, kullanılmayan ama hala bellekte yer kaplayan dinleyiciler, zamanla tarayıcının kaynaklarını tüketiyordu. Bu tür bellek sızıntıları, sadece performansı düşürmekle kalmaz, aynı zamanda kullanıcının cihazının genel performansını da olumsuz etkileyebilir ve en nihayetinde kullanıcıların sitenizden uzaklaşmasına neden olabilir.
Gereksiz Dinleyicilerden Kurtulma
JavaScript’te bir olay dinleyicisi eklediğimizde, o dinleyici genellikle referansını tuttuğu elementle birlikte bellekte kalır. Eğer bu elementi DOM’dan kaldırırsak, ancak olay dinleyicisini kaldırmazsak, o dinleyici bellekte gereksiz yere yer kaplamaya devam eder.
Bu durum, özellikle tek sayfa uygulamalarında (SPA’lar) veya dinamik olarak oluşturulan ve yok edilen bileşenlerde sıkça karşılaşılan bir sorundur. Çözüm oldukça basittir: Her çağrısına karşılık, element DOM’dan kaldırılmadan önce veya bileşenin yaşam döngüsünün sonunda mutlaka çağrısı yapmak.
Bu, benim de her projede titizlikle uyguladığım bir prensiptir. Özellikle bileşen tabanlı yaklaşımlarda, bileşenin (sökülme) anında tüm dinleyicileri temizlemek, bellek sızıntılarını önlemenin en garantili yoludur.
Bu sayede tarayıcının belleği temiz kalır, uygulamanız her zaman ilk günkü gibi hızlı ve tepkisel çalışır.
| Optimizasyon Tekniği | Kullanım Alanı | Faydaları |
|---|---|---|
| Event Delegation (Olay Delegasyonu) | Dinamik listeler, birçok benzer elementin olduğu durumlar | Daha az bellek kullanımı, daha temiz kod, dinamik içeriğe kolay uyum |
| Debounce | Arama kutuları, pencere boyutlandırma, yoğun klavye girişleri | Gereksiz fonksiyon çağrılarını azaltır, sunucu yükünü hafifletir, UI’ın akıcılığını artırır |
| Throttle | Scroll olayları, mousemove, animasyonlar | Belirli bir zaman aralığında fonksiyonu sadece bir kez çalıştırır, UI takılmalarını önler |
| Passive Event Listeners (Pasif Dinleyiciler) | Scroll, touchmove, wheel olayları (özellikle mobil) | Kaydırma performansını iyileştirir, tarayıcının varsayılan davranışını beklemesini engeller |
| Olay Dinleyicilerini Temizleme | Dinamik olarak eklenen/silinen bileşenler, SPA’lar | Bellek sızıntılarını önler, uygulamanın uzun süreli performansını korur |
Unutulmuş Listener’lar, Ağır Bedeller
Unutulmuş olay dinleyicileri, özellikle karmaşık ve büyük uygulamalarda tespit edilmesi zor, sinsi sorunlara yol açar. Bir veya çağrısı içinde bir olay dinleyicisi ekleyip, bu zamanlayıcıyı veya dinleyiciyi temizlemeyi unuttuğunuzda, problem katlanarak büyüyebilir.
Bu durumlar, tarayıcının geliştirici araçlarındaki performans ve bellek profilleme sekmelerinde genellikle “detachable DOM” veya “detached elements” olarak görülebilir.
Yani, aslında DOM’dan kaldırılmış gibi görünen ancak hala bir yerlerde referansı tutulduğu için bellekte kalan elemanlar anlamına gelir. Bu tür senaryolarda ben genellikle bir bileşen kaldırıldığında çalışan bir fonksiyonu oluştururum.
Bu fonksiyon, bileşenin eklediği tüm dinleyicileri, zamanlayıcıları ve diğer kaynakları sistematik bir şekilde temizler. Bu proaktif yaklaşım, uygulamanızın uzun ömürlü ve performanslı kalmasını sağlar ve benim de bizzat uygulayarak birçok baş ağrısından kurtulduğum bir yöntemdir.
Çünkü bellek sızıntıları, web sitenizin kullanıcı nezdindeki itibarını zedeleyen ve onları uzaklaştıran en önemli faktörlerden biridir.
Modern Yaklaşımlar ve Geleceğin Trendleri: Yeni Nesil API’lerle Performans Sıçrayışı
JavaScript ekosistemi sürekli gelişiyor ve tarayıcı API’ları da bu gelişimin önemli bir parçası. Eskiden belki de manuel olarak, performans maliyeti yüksek döngülerle veya karmaşık hesaplamalarla yaptığımız bazı işlemleri, artık tarayıcının kendi içinde optimize edilmiş yeni API’lar sayesinde çok daha verimli bir şekilde yapabiliyoruz.
Ben de bu yenilikleri yakından takip eden ve projelerimde uygulamaktan keyif alan biriyim. Çünkü bu modern API’lar, hem geliştirici deneyimini kolaylaştırıyor hem de kullanıcılara gerçekten “wow” dedirtecek bir performans sunuyor.
Özellikle kullanıcı arayüzü ve deneyimi söz konusu olduğunda, bu yeni nesil araçlar sayesinde web sitelerimizi adeta geleceğe taşıyoruz. Benim tecrübelerime göre, bu API’ları doğru yerlerde kullanmak, eski yöntemlerle elde edemeyeceğiniz bir hız ve akıcılık sağlıyor.
Eskiden çok uğraştığım bazı karmaşık animasyonlar ve element görünürlüğü kontrolleri, bu yeni API’larla adeta çocuk oyuncağı haline geldi.
Intersection Observer: Görünürlük Temelli Olay Yönetimi
Intersection Observer API, bir elementin (target element) başka bir elementle (root element, genellikle viewport) kesişimini veya görünürlüğünü asenkron olarak izlememizi sağlayan inanılmaz güçlü bir araç.
Bu, özellikle “lazy loading” (tembel yükleme) görüntüler veya bileşenler için, sonsuz kaydırma (infinite scroll) uygulamalarında yeni içerik yüklemek için veya reklamların görünürlüğünü takip etmek gibi senaryolarda hayat kurtarıcı bir rol oynar.
Eskiden bu tarz işlemleri olayı dinleyicisiyle ve metodunu kullanarak manuel olarak yapmaya çalışırdık, ki bu da çok performanssız ve hata yapmaya açık bir yöntemdi.
Ancak Intersection Observer ile artık tarayıcı, elementin görünürlük durumunu sizin için optimize edilmiş bir şekilde takip ediyor ve sadece durum değiştiğinde size haber veriyor.
Benim e-ticaret sitelerinden birinde ürün görsellerini Intersection Observer ile yüklemeye başladığımda, sayfa yüklenme süresi yarıya düştü ve kullanıcılar ürünleri çok daha hızlı görmeye başladı.
Resize Observer: Element Boyut Değişikliklerine Akıllı Tepki
Bir diğer harika API ise Resize Observer. Adından da anlaşılabileceği gibi, bu API, bir elementin boyutunda (content rect) bir değişiklik olduğunda bize bildirimde bulunuyor.
Bu, özellikle responsive tasarımlarda, bir bileşenin kendi boyutuna göre içindeki elemanları yeniden düzenlemesi gerektiğinde veya bir container’ın boyutuna göre grafiklerin yeniden çizilmesi gerektiğinde çok işe yarar.
Eskiden bu tarz durumları izlemek için olayını dinlerdik, ki bu da tüm pencerenin boyutu değiştiğinde tetiklenir ve gereksiz yere birçok bileşenin yeniden hesaplama yapmasına neden olabilirdi.
Ancak Resize Observer ile sadece ilgili elementin boyutu değiştiğinde tetikleniriz, bu da çok daha verimli ve hedefe yönelik bir yaklaşım sağlar. Benim dashboard uygulamalarından birinde, widget’ların boyutları kullanıcı tarafından ayarlanabiliyordu ve Resize Observer sayesinde her widget kendi içeriğini anında ve akıcı bir şekilde güncelleyebildi.
Bu, kullanıcıya dinamik ve hızlı bir arayüz sunarken, gereksiz hesaplamaların önüne geçerek performansımızı da zirvede tutmamızı sağladı.
Kullanıcı Deneyimini Zenginleştiren İpuçları: Küçük Dokunuşlarla Büyük Etki
Şimdiye kadar teknik detaylara odaklandık ama unutmayalım ki tüm bu optimizasyonların nihai amacı, kullanıcılarımıza kusursuz bir deneyim sunmak. Çünkü hızlı bir site sadece teknik bir başarı değil, aynı zamanda kullanıcıların sitenizde daha fazla zaman geçirmesini, içeriğinizi daha çok tüketmesini ve en önemlisi geri gelmesini sağlayan bir çekim gücüdür.
Benim de blog yazarken veya web sitesi geliştirirken en çok dikkat ettiğim şeylerden biri, okuyucunun veya kullanıcının ne hissettiğidir. Bir web sitesi adeta sıcak bir kahve gibi olmalı; ilk yudumdan son yuduma kadar keyif vermeli, herhangi bir pürüz yaşatmamalı.
Bazen en küçük gibi görünen dokunuşlar, kullanıcı memnuniyetinde devasa farklar yaratabiliyor. Özellikle performans optimizasyonları, görünmez kahramanlar gibidir; kullanıcı onların varlığını fark etmez ama yokluklarında acısını çok derinden hisseder.
Anında Geri Bildirim ve Bekleme Sürelerini Yönetme
Kullanıcı bir düğmeye tıkladığında veya bir form gönderdiğinde, hemen bir geri bildirim görmelidir. Bu, bir yükleme göstergesi (spinner), düğmenin durumunun değişmesi veya bir bildirim mesajı olabilir.
Eğer sistem bir işlemi gerçekleştirmek için biraz zaman alacaksa, kullanıcıya bir şeylerin olduğunu göstererek sabrını korumasını sağlayabiliriz. Benim bir projemde, bir form gönderildiğinde bazen arka planda büyük bir dosya işlemi yapılıyordu ve kullanıcılar boş ekrana bakakalıyorlardı.
Küçük bir “işlem devam ediyor…” mesajı ve animasyonlu bir yükleme simgesi eklediğimde, şikayetler anında kesildi. Bu, olayın kendisini optimize etmese de, kullanıcının algılanan performansını muazzam şekilde artırır.
Ayrıca, yoğun olaylarda (debounce/throttle ile yönettiğimiz gibi) işlemi bekletirken, kullanıcıya hafifletilmiş bir görsel göstererek “şu an hazırlık yapıyorum” mesajı verebiliriz.
Hafif Animasyonlar ve Geçişler ile Akıcılığı Artırma
Performansı düşürmeyen, hatta artırabilen bir diğer unsur da akıllıca kullanılan animasyonlar ve geçişlerdir. CSS tabanlı ve özellikleri kullanarak yapılan animasyonlar, genellikle JavaScript ile yapılan animasyonlara göre çok daha performanslıdır çünkü doğrudan GPU tarafından işlenebilirler.
Bir elementin ekranda belirme veya kaybolma şekli, bir menünün açılıp kapanması gibi basit animasyonlar, kullanıcı arayüzüne canlılık katar ve uygulamanızın daha modern ve pürüzsüz hissedilmesini sağlar.
Benim en sevdiğim şeylerden biri, bir listeleme elemanı silindiğinde hafif bir efekti vermek veya bir menü açıldığında yumuşak bir animasyonu kullanmaktır.
Bu tür küçük, hafif dokunuşlar, sitenizin genel kalitesini ve kullanıcı tarafından algılanan hızını yükseltir. Unutmayın, önemli olan hızı azaltan değil, akıcılığı artıran estetik dokunuşlar yapmak.
글을maçi 며
Sevgili dostlar, bugün JavaScript olay optimizasyonu konusunda derinlemesine bir yolculuğa çıktık. Gördüğünüz gibi, bu küçük gibi görünen dokunuşlar, web sitelerimizin genel performansı ve kullanıcı deneyimi üzerinde inanılmaz büyük farklar yaratabiliyor. Unutmayın, günümüz internet kullanıcıları sabırsız ve her zaman en hızlı, en akıcı deneyimi bekliyor. Biz geliştiricilere düşen de bu beklentileri fazlasıyla karşılamak. Benim de bu alanda çokça zaman harcadığım ve deneyimlediğim gibi, bu teknikler sadece sitenizin hızlanmasını sağlamakla kalmaz, aynı zamanda kodunuzu daha temiz, daha yönetilebilir ve geleceğe daha hazır hale getirir. Bu rehberle edindiğiniz bilgileri projelerinize uyguladığınızda, sitelerinizin adeta bir kuş gibi hafiflediğini ve kullanıcılarınızın gözünde parladığını göreceksiniz. Hızlı bir site, mutlu kullanıcılar ve en önemlisi, sizin için daha verimli bir web dünyası demektir. Hadi şimdi öğrendiklerimizi pratiğe dökelim ve web’i hep birlikte daha iyi bir yer haline getirelim!
알아두면 쓸모 있는 정보
1.
Uygulamanızın bellek kullanımını düzenli olarak tarayıcınızın Geliştirici Araçları’ndaki “Performans” ve “Bellek” sekmelerinden kontrol edin. Bellek sızıntıları, özellikle uzun süreli kullanımlarda sitenizi anlamsızca yavaşlatabilir.
2.
JavaScript kodunuzda ağır hesaplamalar veya uzun süren döngüler varsa, bunları ana iş parçacığını (main thread) bloke etmemek için Web Workers’a taşımayı düşünün. Bu sayede kullanıcı arayüzünüz her zaman tepkisel kalır.
3.
Kullanıcı etkileşimlerini takip ederken sadece gerekli olan olay dinleyicilerini ekleyin ve işiniz bittiğinde kaldırmayı asla unutmayın. Özellikle dinamik olarak eklenen elementler için bu kural hayati önem taşır.
4.
Modern tarayıcı API’ları olan Intersection Observer ve Resize Observer gibi araçları kullanarak performanslı ve reaktif uygulamalar geliştirin. Eskiden manuel olarak yaptığımız birçok işlemi, bu API’lar bizim için çok daha optimize bir şekilde halleder.
5.
Herhangi bir performans iyileştirmesi yaptığınızda, mutlaka test edin. Farklı cihazlarda ve farklı internet bağlantı hızlarında sitenizin nasıl davrandığını gözlemlemek, gerçek dünya performansı hakkında size değerli bilgiler verecektir.
중요 사항 정리
Bugünkü rehberimizde, JavaScript olay optimizasyonunun web sitelerimizin performansını ve kullanıcı deneyimini nasıl temelden etkilediğini ayrıntılı bir şekilde ele aldık. Olay delegasyonu ile gereksiz dinleyici yükünden kurtulup kodumuzu sadeleştirmeyi öğrendik. Debounce ve Throttle teknikleriyle yoğun olayları kontrol altına alarak arayüzün akıcılığını sağladık. Pasif olay dinleyicilerinin özellikle mobil cihazlarda kaydırma performansını nasıl zirveye taşıdığını keşfettik ve bellek sızıntılarına karşı olay dinleyicilerini doğru bir şekilde yönetmenin önemini vurguladık. Son olarak, Intersection Observer ve Resize Observer gibi modern API’ların sunduğu yeni nesil performans sıçrayışlarına göz attık. Unutmayın, bu teknikler sadece sitenizi hızlandırmakla kalmaz, aynı zamanda kullanıcılarınızın sitenizde daha keyifli vakit geçirmesini, içeriğinize daha fazla odaklanmasını ve sonuç olarak sitenize olan sadakatini artırır. Geliştirici olarak amacımız, sadece çalışan değil, aynı zamanda kullanıcılarını mest eden hızlı ve akıcı web deneyimleri yaratmaktır. Bu bilgilerle donanmış olarak, artık web sitelerinizi bir performans şaheserine dönüştürmek için hazırsınız!
Sıkça Sorulan Sorular (FAQ) 📖
S: Etkinlik delegasyonu (Event Delegation) performansa neden bu kadar kritik bir katkı sağlıyor ve ben bunu projelerimde nasıl uygulayabilirim?
C: Ah, etkinlik delegasyonu! Bu konu benim için web geliştirmenin altın kurallarından biri diyebilirim sevgili dostlar. Düşünsenize, bir listeniz var ve içinde yüzlerce hatta binlerce öğe bulunuyor.
Her bir öğeye ayrı ayrı bir tıklama olayı (event listener) atadığınızı hayal edin. Tarayıcının bu kadar çok olayı dinlemesi başlı başına bir performans yükü oluşturmaz mı?
İşte tam bu noktada etkinlik delegasyonu imdadımıza yetişiyor. Ben ilk başladığımda her şeyi tek tek dinletmeye çalışır, sonra da sitenin neden yavaşladığını anlamaya çalışırdım.
Meğerse olay, ebeveyn (parent) elemente tek bir dinleyici atayıp, olayların kabarcıklanma (event bubbling) özelliğinden faydalanarak hangi çocuk (child) elementten geldiğini tespit etmekmiş.
Yani yüzlerce değil, sadece bir dinleyici ile tüm çocukları kontrol altında tutabiliyorsunuz. Bu sadece bellek kullanımını azaltmakla kalmıyor, aynı zamanda DOM’a sonradan eklenen elementler için de otomatik olarak çalışıyor.
Yeni bir öğe eklediğinizde ona özel bir dinleyici atamanıza gerek kalmıyor; ebeveyn zaten dinlemede! Mesela, ben bir e-ticaret sitesi üzerinde çalışırken binlerce ürünü listelediğim bir sayfada bu tekniği uyguladığımda, sayfa yükleme hızında ve tıklama tepkime süresinde gözle görülür bir iyileşme fark ettim.
Kullanıcı deneyimi adeta şaha kalktı! Uygulamak da çok basit: Olay dinleyicisini ortak bir üst öğeye (örneğin bir veya ‘e) ekliyorsunuz ve ardından olayın hedefinin (event.target) hangi alt öğe olduğunu kontrol ederek gerekli işlemi yapıyorsunuz.
Benim favori yöntemim metodunu kullanmak; hem temiz hem de performansı yüksek bir çözüm sunuyor. Kesinlikle deneyimlemelisiniz, siteniz size teşekkür edecek!
S: Debouncing ve Throttling tam olarak nedir ve projelerimde bunları ne zaman kullanmalıyım? Aralarındaki farkı sık sık karıştırıyorum.
C: Bu ikili, performansı düşman belleyen her geliştiricinin cebinde olması gereken sihirli değnekler gibidir, ama evet, ne zaman hangisini kullanacağımızı karıştırmak çok doğal.
Ben de ilk zamanlar epey bocalardım. Basitçe açıklayacak olursak:
Debouncing, belirli bir olayın art arda çok hızlı tetiklenmesini engellemek için kullanılır.
Olay tetiklenmeyi bıraktıktan sonra belirli bir süre (örneğin 300 milisaniye) bekler ve ancak o zaman işlevi çalıştırır. Düşünsenize, bir arama kutunuz var ve kullanıcı her tuşa bastığında anında sunucuya istek gönderiyorsunuz.
Bu hem sunucuya gereksiz yük bindirir hem de kullanıcının yazdığı kadar hızlı sonuç alamamasına neden olur. Benzer bir durumu, bir kez daha, bir ürün arama sayfasında yaşamıştım.
Debouncing ile kullanıcı yazmayı bitirdiğinde, yani belirli bir sessizlik süresi sonunda, arama isteğini göndererek hem gereksiz çağrıları kestim hem de kullanıcıya daha tutarlı bir deneyim sundum.
Throttling ise, bir olayın belirli bir zaman aralığında en fazla bir kez çalışmasını sağlar. Yani, olay ne kadar hızlı tetiklenirse tetiklensin, sizin belirlediğiniz periyotta sadece bir kez işlev çalışır.
Örneğin, bir sayfa kaydırma (scroll) olayı veya pencere boyutlandırma (resize) olayı. Kullanıcı sayfayı hızla aşağı kaydırırken her pikselde bir işlem yapmak yerine, throttling ile her 100 milisaniyede bir veya 200 milisaniyede bir işlem yapmayı tercih edebilirsiniz.
Ben kişisel olarak bu tekniği, özellikle mobil cihazlarda kaydırma performansını optimize etmek ve animasyonların akıcılığını artırmak için kullanıyorum.
Geçenlerde bir “sonsuz kaydırma” özelliği olan blog sayfamda throttling kullandığımda, sayfayı kaydırma deneyimi inanılmaz derecede pürüzsüz hale gelmişti; tarayıcı sanki rahatlamış gibiydi.
Peki farkı nasıl hatırlayacağız? Debouncing “bekle, durulunca yap” derken, Throttling “belirli aralıklarla yap” der. Pratik düşününce aslında mantık çok açık; birinde son tetiklenmeyi beklersiniz, diğerinde ise bir zamanlayıcıyla düzenli aralıklarla tetiklersiniz.
İkisini de doğru yerlerde kullandığınızda sitenizin performansı adeta roket yakıtı almış gibi hızlanacaktır.
S: Olay dinleyicileri (event listeners) ile ilgili sürekli bellek sızıntıları (memory leaks) duyuyorum. Sitemin her zaman hızlı ve sorunsuz çalışmasını sağlamak için bunları nasıl etkin bir şekilde yönetebilir ve kaldırabilirim?
C: İşte bu da benim başıma sıkça dert açan, ama çözümü bildiğinizde rahat bir nefes almanızı sağlayan kritik bir konu! Bellek sızıntıları, özellikle tek sayfalık uygulamalarda (SPA’lar) veya çok dinamik içerikli sitelerde can sıkıcı olabiliyor.
Bir olayı dinlemeye başladığınızda, o dinleyici tarayıcının belleğinde yer kaplar. Eğer o elementi veya komponenti DOM’dan kaldırırken, atadığınız olay dinleyicisini de kaldırmazsanız, işte o zaman hafıza sızıntısı denen durum oluşur.
Tarayıcı o kullanılmayan dinleyiciyi bellekte tutmaya devam eder ve zamanla siteniz yavaşlar, hatta bazı kullanıcıların cihazları kilitlenebilir. İnanın bana, bu durumu fark etmeden saatlerimi harcadığım zamanlar oldu, ta ki bir performans profili aracıyla bellek kullanımının sürekli arttığını görene kadar.
Peki, ne yapmalıyız? En basit ve etkili yolu, bir element DOM’dan kaldırılmadan önce ona atadığınız tüm olay dinleyicilerini metoduyla manuel olarak kaldırmaktır.
Özellikle React, Vue gibi kütüphanelerle çalışırken, komponent yaşam döngüsü (lifecycle) metotlarını (örneğin veya ) kullanarak bu temizliği otomatik hale getirebilirsiniz.
Mesela ben, modal pencereleri veya dinamik olarak yüklenen bileşenleri DOM’dan kaldırırken, onlara atanmış tüm olay dinleyicilerini titizlikle kaldırırım.
Böylece, kullanıcı modalı kapattığında, o modalla ilişkili hiçbir bellekte çöp kalmamasını sağlamış olurum. Bir diğer önemli nokta da, sadece anonim fonksiyonlar yerine isimlendirilmiş fonksiyonları kullanmaktır.
Çünkü metoduna, hangi fonksiyonu kaldırmak istediğinizi net bir şekilde belirtmeniz gerekir. Anonim bir fonksiyonu kaldırmak neredeyse imkansızdır.
Bu, ilk bakışta biraz angarya gibi gelebilir ama inanın bana, uzun vadede size çok zaman ve baş ağrısından tasarruf ettirir. Belleği temiz tutmak, sitenizin uzun ömürlü ve “tıpkı bir fırça gibi” akıcı çalışmasının anahtarıdır.
Kullanıcıların sitenizde ne kadar süre kaldığı, sayfanızın ne kadar hızlı tepki verdiği ve genel deneyim, işte bu gibi detaylara verdiğiniz önemle doğru orantılıdır.
Unutmayın, mutlu kullanıcı demek, daha çok ziyaretçi, daha uzun kalış süresi ve sonuç olarak daha fazla kazanç demektir!






