Javascript İle Dinamik Bir İstatistik Paneli Nasıl Yapılır?

Javascript İle Dinamik Bir İstatistik Paneli Nasıl Yapılır?
Javascript İle Dinamik Bir İstatistik Paneli Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce modern bir tarayıcı (Chrome, Firefox veya Edge'in güncel sürümleri) ve bir kod editörü (VS Code önerilir) yeterlidir. 2026 yılı standartlarında ES6+ modüllerini ve asenkron programlama yapılarını kullanacağız.

  • Node.js (Opsiyonel: Yerel bir sunucu çalıştırmak için gereklidir).
  • Temel HTML5 ve CSS3 bilgisi.
  • Modern Javascript (ES2022+) sözdizimi hakimiyeti.

Çalışma ortamınızı hazırlamak için projenizin ana dizininde bir index.html ve bir app.js dosyası oluşturun. Tarayıcıda doğrudan dosya açmak yerine, geliştirme sürecinde CORS hatalarından kaçınmak için "Live Server" benzeri bir yerel sunucu kullanmanız önerilir.

Adım 1: İstatistik Paneli İçin HTML Yapısını Kurma

Panelin iskeletini oluştururken, verilerin görüntüleneceği kutucukları (card) tanımlamalıyız. Anlamsal (semantic) HTML etiketleri kullanmak, hem SEO hem de erişilebilirlik açısından önemlidir.

Toplam Kullanıcı

0

Günlük Satış

0

Bu kod bloğu, verilerin dinamik olarak enjekte edileceği temel kapsayıcıları oluşturur. id seçicileri, Javascript tarafında DOM manipülasyonu yaparken hedef belirlememizi sağlar.

Adım 2: Veri Çekme ve Asenkron İşlemler

Dinamik bir panelin kalbi, sunucudan gelen veridir. fetch API'sini kullanarak JSON formatındaki verileri asenkron olarak çekiyoruz. Hata yönetimi (error handling), uygulamanın kararlılığı için zorunludur.

async function fetchData(url) {
  try {
    const response = await fetch(url);
    if (!response.ok) throw new Error('Veri çekme hatası: ' + response.status);
    return await response.json();
  } catch (error) {
    console.error('İşlem başarısız:', error);
  }
}

Burada async/await yapısı, kodun okunabilirliğini artırır. try...catch bloğu ise ağ hatalarını yakalayarak uygulamanın çökmesini engeller.

Adım 3: DOM Güncelleme Mantığı

Veriyi çektikten sonra, bu veriyi HTML elemanlarına yansıtmalıyız. DOM'a erişim maliyetli bir işlem olduğu için, güncellemeleri optimize etmek önemlidir.

function updateDashboard(data) {
  const userEl = document.getElementById('user-count');
  const salesEl = document.getElementById('sales-count');
  
  userEl.textContent = data.users.toLocaleString();
  salesEl.textContent = `${data.sales} TL`;
}

textContent kullanımı, XSS (Cross-Site Scripting) saldırılarını önlemek için innerHTML yerine tercih edilmelidir. toLocaleString() metodu ise sayıları yerel formatta (binlik ayraçları ile) göstermek için kullanılır.

Adım 4: Dinamik Güncelleme Döngüsü

Panelin "dinamik" olması, verilerin belirli aralıklarla yenilenmesi anlamına gelir. Bunun için setInterval fonksiyonunu kullanacağız.

const REFRESH_INTERVAL = 5000; // 5 saniye

setInterval(async () => {
  const data = await fetchData('/api/stats');
  if (data) updateDashboard(data);
}, REFRESH_INTERVAL);

Bu yapı, her 5 saniyede bir sunucuya istek atar. Ancak çok sık istek atmak sunucuyu yorabilir; bu nedenle üretim ortamında WebSocket veya Server-Sent Events (SSE) kullanımı daha verimli olabilir.

Veri Görselleştirme Yöntemlerinin Karşılaştırılması

Yöntem Avantaj Dezavantaj
DOM Manipülasyonu Hafif, kütüphanesiz Karmaşık veride yönetimi zor
Canvas API Yüksek performans Erişilebilirlik kısıtlı
SVG (D3.js vb.) Ölçeklenebilir, estetik Öğrenme eğrisi dik

Adım 5: Güvenlik ve Hata Yönetimi

Kritik Uyarı: Kullanıcıdan gelen verileri asla doğrudan DOM'a eklemeyin. Her zaman veriyi temizleyin (sanitization). API isteklerinde yetkilendirme (Bearer Token) kullanmayı ihmal etmeyin.

XSS saldırılarına karşı korunmak için veriyi her zaman textContent veya innerText ile atayın. Eğer HTML içeriği eklemeniz gerekiyorsa, DOMPurify gibi kütüphanelerle veriyi temizleyin.

Sıkça Sorulan Sorular

Dinamik panelde neden kütüphane kullanmalıyım?

Küçük projelerde saf Javascript yeterlidir. Ancak veri karmaşıklığı arttığında React veya Vue gibi kütüphaneler, durum yönetimi (state management) konusunda büyük kolaylık sağlar.

Veri güncelleme hızını nasıl optimize ederim?

Sürekli istek atmak yerine WebSocket kullanarak sunucudan veri "push" edilmesini sağlayabilirsiniz.

DOM manipülasyonu performansı etkiler mi?

Evet, çok sık DOM güncellemesi yapmak tarayıcıyı yorar. Mümkünse sadece değişen veriyi güncelleyin.

Hata yönetimi için en iyi pratik nedir?

try...catch bloklarını her asenkron işlemde kullanın ve kullanıcıya "Veri yüklenemedi" gibi anlamlı geri bildirimler gösterin.

Bu paneli mobil uyumlu yapabilir miyim?

Evet, CSS Grid ve Flexbox kullanarak panelin ekran boyutuna göre otomatik şekillenmesini sağlayabilirsiniz.

İleri Düzey Optimizasyon: Veri Akışında "Debouncing" ve "Throttling"

Dinamik panellerde verilerin sürekli güncellenmesi, özellikle düşük donanımlı cihazlarda tarayıcı performansını olumsuz etkileyebilir. Kullanıcı arayüzünde çok sık gerçekleşen DOM güncellemelerini kontrol altına almak için Debouncing ve Throttling tekniklerini kullanmak kritik öneme sahiptir.

Örneğin, bir arama kutusu veya filtreleme özelliği eklediğinizde, her tuş vuruşunda API isteği atmak yerine belirli bir süre beklemesini sağlayabilirsiniz.

function debounce(func, delay) {
  let timeout;
  return function(...args) {
    clearTimeout(timeout);
    timeout = setTimeout(() => func.apply(this, args), delay);
  };
}

const updateDashboard = debounce(() => {
  console.log("Veri güncelleniyor...");
  // API çağrısı burada tetiklenir
}, 500);

window.addEventListener('resize', updateDashboard);

Panelin Performansını İzleme ve Hata Ayıklama

Geliştirdiğiniz panelin ne kadar verimli çalıştığını anlamak için tarayıcınızın geliştirici araçlarını (DevTools) aktif kullanmalısınız. "Performance" sekmesi, hangi fonksiyonların ne kadar sürede çalıştığını ve "Reflow" (sayfa düzeninin yeniden hesaplanması) işlemlerini görmenizi sağlar.

Yaygın Performans Darboğazları

  • Layout Thrashing: JavaScript ile DOM üzerinde okuma ve yazma işlemlerinin sürekli iç içe yapılması. Önce tüm verileri okuyup, ardından tek seferde DOM'a yazmak bu sorunu çözer.
  • Bellek Sızıntıları: setInterval fonksiyonunu temizlemeyi unutmak, arka planda gereksiz işlemlerin devam etmesine neden olur.
// Bellek sızıntısını önlemek için interval yönetimi
let intervalId = setInterval(fetchData, 30000);

// Sayfa kapandığında veya panel devre dışı kaldığında temizle
function stopUpdates() {
  clearInterval(intervalId);
}

Deployment Sürecinde Dikkat Edilmesi Gerekenler

Panelinizi canlı ortama alırken sadece kodun çalışması yeterli değildir. Güvenli ve ölçeklenebilir bir yapı için şu adımları takip etmelisiniz:

  1. Environment Variables: API anahtarlarınızı veya uç noktalarınızı (endpoint) kod içinde sabit olarak yazmayın. .env dosyaları kullanarak yapılandırmayı dışarıdan yönetin.
  2. Minification: JavaScript dosyalarınızı Webpack, Vite veya esbuild gibi araçlarla sıkıştırarak (minify) dosya boyutunu küçültün.
  3. CDN Kullanımı: Statik varlıklarınızı (CSS, görseller) bir CDN üzerinden sunarak sunucu yükünü azaltın.
İpucu: Eğer paneliniz çok fazla eşzamanlı veri alıyorsa, geleneksel HTTP istekleri (fetch/polling) yerine WebSockets kullanarak sunucudan istemciye gerçek zamanlı veri akışı sağlayabilirsiniz. Bu, sunucu üzerindeki yükü azaltır ve veri gecikmesini (latency) minimuma indirir.

Sonuç

Javascript ile dinamik bir istatistik paneli yapmak, temel web teknolojilerini birleştirerek güçlü bir arayüz oluşturmanızı sağlar. Bu rehberde öğrendiğiniz fetch, DOM manipülasyonu ve periyodik güncellemeler, daha kompleks dashboard projelerinin temelini oluşturur. Bir sonraki adım olarak, bu verileri görselleştirmek için Chart.js gibi basit grafik kütüphanelerini projenize entegre etmeyi deneyebilirsiniz.

Sorumluluk Reddi: Bu makalede yer alan kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce güvenlik açıklarını (XSS, CSRF, CORS) gözden geçirin ve API uç noktalarınızı uygun şekilde yetkilendirin.

Bu yazıya tepkinizi paylaşın:
Kerem Tekin

Teknoloji ve yazılım kullanımı üzerine pratik kılavuzlar hazırlıyorum. Karmaşık dijital araçları, herkesin hızlıca öğrenebileceği sade rehberler haline getirmekte uzmanım.

Yorumlar (16)

16
okuyucu bu yazı hakkında yorum yaptı. Siz de deneyiminizi paylaşarak diğer okuyuculara yardımcı olabilirsiniz.
Caner Yılmaz
Caner Yılmaz 31 Temmuz 2026

Eline sağlık Kerem hocam, çok temiz bir anlatım olmuş. Özellikle asenkron veri çekme kısmında takılıyordum, bu rehber sayesinde çözdüm.

Kerem Tekin
Kerem Tekin 01 Ağustos 2026

Çözebilmenize sevindim Caner, asenkron yapılar başta biraz kafa karıştırabiliyor ama mantığı oturunca çok zevklidir.

Selin_Coder
Selin_Coder 02 Ağustos 2026

Ya ben kodları denedim ama veriler neden geç geliyo? console'da bi hata yok ama panel bomboş görünüyor, yardım eder misiniz?

Burak Aras
Burak Aras 03 Ağustos 2026

API endpoint'ini kontrol ettin mi? Bazen CORS hatası alıyosun ama konsolda direkt görünmeyebiliyo.

Hakan Demir
Hakan Demir 03 Ağustos 2026

Güzel yazı olmuş. React veya Vue için de bu tarz bi rehber bekliyoruz, hep vanilla JS gidiyoruz ama frameworklerde nasıl olur merak ediyorum.

Kerem Tekin
Kerem Tekin 04 Ağustos 2026

Önerin için teşekkürler Hakan, önümüzdeki haftalarda React ile bir dashboard örneği hazırlamayı planlıyorum.

Zeynep Öz
Zeynep Öz 04 Ağustos 2026

Çok açıklayıcı olmuş, ellerine sağlık. Güvenlik kısmına değinmen özellikle iyi olmuş, çoğu kişi onu atlıyor.

Ayşe Nur
Ayşe Nur 05 Ağustos 2026

Yazı güzel ama görseller çok küçük, telefondan bakarken kodları okuyamadım valla. Yine de emeğine sağlık.

Deniz Vural
Deniz Vural 07 Ağustos 2026

Aynen ya, bende zor okudum ama kodları kopyalayıp editöre yapıştırınca düzeliyo.

Fatih B.
Fatih B. 05 Ağustos 2026

Fetch API yerine Axios kullansak bir sorun olur mu? Hangisi daha güvenli sizce?

Mertcan Şahin
Mertcan Şahin 05 Ağustos 2026

Abi sen harikasın ya, tam aradığım şeydi. Bi de socket.io ile yaparsak canlı güncelleme daha mı iyi olur acaba, ne dersin?

Kerem Tekin
Kerem Tekin 06 Ağustos 2026

Socket.io kesinlikle daha performanslı olur Mertcan, anlık veri akışı için en mantıklısı o zaten. Bir sonraki yazıda değinebilirim.

Ceyda Y.
Ceyda Y. 06 Ağustos 2026

Benim dashboard nedense her saniye sayfayı yeniliyo, oysaki sadece veriyi güncellemesini istemiştim. Nerde hata yapmış olabilirim?

Kerem Tekin
Kerem Tekin 06 Ağustos 2026

Ceyda, muhtemelen setInterval içine yanlış bir fonksiyon çağırdın veya DOM'u komple render eden bir yapı kurdun. Kodlarını incelemem gerekebilir.

Emre K.
Emre K. 06 Ağustos 2026

harika içerik, uzun zamandır böyle temiz bi tutorial görmemiştim. devamını beklıyoz hocam.

Tolga Ünal
Tolga Ünal 06 Ağustos 2026

Başarılı bir çalışma, tebrikler. Basit ve anlaşılır olması yeni başlayanlar için büyük şans.

Yorum Yaz