0Pricing
Frontend Academy · Ders

Gerçek Zamanlı Arayüz Kalıpları

Anında geri bildirim için iyimser güncellemeler uygulamayı, çevrimdışıyken yerel sıraya almayı ve arayüzde yalnızca değişen öğeleri güncellemek için gelen verileri karşılaştırmayı öğrenin.

Gerçek Zamanlı Arayüz Kalıpları, CoddyKit'te ücretsiz bir Frontend Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Frontend Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Frontend Academy kursu toplamda 4 dersten oluşur.

Gerçek Zamanlı, Gerçek Gibi Hissettiren Kullanıcı Deneyimi

Gerçek zamanlılık, yalnızca hızlı olmak demek değildir; duyarlı, öngörülebilir ve gecikmeyi tolere eden bir deneyim sunmalıdır. Üç temel kalıp vardır: iyimser güncellemeler, yerel kuyruğa alma ve akıllı farklandırma.

İyimser Güncellemeler

Sunucu onaylamadan önce, kullanıcı eylemi gerçekleşir gerçekleşmez kullanıcı arayüzünü güncelleyin. Sunucu reddederse değişikliği geri alın. Bu, uygulamaların anında tepki veriyormuş gibi hissettirmesini sağlar.

async function likePost(id) {
  // 1. Optimistically update UI:
  setLikes(l => ({ ...l, [id]: (l[id] || 0) + 1 }));
  setLiked(prev => ({ ...prev, [id]: true }));

  try {
    await fetch(`/api/posts/${id}/like`, { method: 'POST' });
  } catch (err) {
    // 2. Rollback on failure:
    setLikes(l => ({ ...l, [id]: (l[id] || 1) - 1 }));
    setLiked(prev => ({ ...prev, [id]: false }));
    toast.error('Could not like — please retry');
  }
}

Geçici ID'lerle İyimser Güncellemeler

Oluşturulan öğelere yerel olarak geçici bir ID verin. Yanıt geldiğinde bunu sunucunun gerçek ID'siyle değiştirin.

async function addComment(text) {
  const tempId = `tmp-${Date.now()}`;
  setComments(c => [...c, { id: tempId, text, pending: true }]);

  try {
    const saved = await fetch('/api/comments', {
      method: 'POST',
      body: JSON.stringify({ text })
    }).then(r => r.json());

    setComments(c => c.map(m => m.id === tempId ? saved : m));
  } catch (err) {
    setComments(c => c.map(m => m.id === tempId ? { ...m, error: true } : m));
  }
}

Çevrimdışıyken Yerel Kuyruğa Alma

Ağ bağlantısı kesildiğinde eylemleri yerel olarak kuyruğa alın ve bağlantı geri geldiğinde yeniden oynatın. Kullanıcı çalışmaya devam edebilir.

const queue = JSON.parse(localStorage.getItem('queue') || '[]');

function enqueue(action) {
  queue.push(action);
  localStorage.setItem('queue', JSON.stringify(queue));
  trySend();
}

async function trySend() {
  while (queue.length && navigator.onLine) {
    const action = queue[0];
    try {
      await fetch(action.url, action);
      queue.shift();
      localStorage.setItem('queue', JSON.stringify(queue));
    } catch {
      break; // stop until online
    }
  }
}

window.addEventListener('online', trySend);

Gelen Gerçek Zamanlı Verileri Farklandırma

Sunucu listenin tamamını gönderirse mevcut durumla karşılaştırın ve yalnızca değişiklikleri güncelleyin; böylece gereksiz yeniden oluşturmaları ve animasyon hatalarını önlersiniz.

function applyServerSnapshot(newList, currentList) {
  const current = new Map(currentList.map(i => [i.id, i]));
  const result = newList.map(item => {
    const prev = current.get(item.id);
    if (!prev) return { ...item, _state: 'new' };
    if (prev.updatedAt !== item.updatedAt) return { ...item, _state: 'updated' };
    return prev;
  });
  return result;
}

Yama Tabanlı Güncellemeler

Tam anlık görüntülerden daha iyidir: sunucu yalnızca değişen alanları gönderir. Güncellemeyi artımlı olarak uygulayın; bu yöntem daha az bant genişliği kullanır ve görüntülenmesi daha hızlıdır.

// Server sends: { type: 'patch', id: 42, fields: { likes: 11 } }
ws.on('message', (msg) => {
  if (msg.type === 'patch') {
    setPosts(posts => posts.map(p =>
      p.id === msg.id ? { ...p, ...msg.fields } : p
    ));
  }
});

Yüksek Frekanslı Güncellemeleri Sınırlama

Bazı akışlar saniyede çok sayıda güncelleme gönderir (fare konumu, hisse senedi hareketleri). Tarayıcının takılmasını önlemek için kullanıcı arayüzü güncellemelerini yaklaşık 60 Hz ile sınırlayın.

import { throttle } from 'lodash-es';

const applyUpdate = throttle((data) => {
  setData(data);
}, 16); // ~60fps

ws.on('tick', applyUpdate);

Çevrimiçi Olma Göstergeleri

Başka kimlerin gerçek zamanlı olarak çevrimiçi olduğunu veya yazdığını gösterin. Sunucu, çevrimiçi olma olaylarını yayımlar; istemci avatarlarla birlikte bir liste oluşturur.

ws.on('presence', ({ users }) => {
  setOnlineUsers(users);
});

ws.on('typing', ({ user, isTyping }) => {
  setTypingUsers(t => isTyping
    ? [...t.filter(u => u.id !== user.id), user]
    : t.filter(u => u.id !== user.id));
});

Bağlantı Durumu Bandı

Çevrimdışıyken veya yeniden bağlanılırken göze batmayan bir bant gösterin. Bağlantı tamamen yeniden kurulduğunda bandı gizleyin. Kullanıcılar neler olduğunu görebildiklerinde gecikmeyi çok daha iyi tolere eder.

{!isConnected && (
  <div className="connection-banner">
    Reconnecting... Your changes will sync when you're back online.
  </div>
)}

Çakışma Çözümü

Gerçek zamanlı uygulamalar, aynı anda yapılan çakışan düzenlemeleri ele almalıdır. Stratejiler: son yazan kazanır (basittir ancak veri kaybına yol açabilir), sürüm vektörleri, OT (işlemsel dönüşüm), CRDT'ler (Yjs, Automerge).

İş Birliği için CRDT'ler

CRDT'ler (Çakışmasız Çoğaltılmış Veri Türleri), merkezi bir sunucu olmadan gerçek zamanlı ortak düzenlemeyi mümkün kılar. Kütüphaneler: Yjs, Automerge. Figma, Linear ve Notion tarzı uygulamalarda kullanılır.

Performans: Sanallaştırılmış Listeler

Gerçek zamanlı akışlar uzayabilir. Yalnızca görünür öğeleri oluşturmak için sanallaştırılmış listeler (react-virtuoso, @tanstack/react-virtual) kullanın; toplam öğe sayısından bağımsız olarak bellek ve CPU kullanımı sabit kalır.

Hızlı Kontrol

Gerçek zamanlı bir kullanıcı arayüzünde "iyimser güncelleme" nedir?

Özet: Gerçek Zamanlı Kullanıcı Arayüzü Kalıpları

İyimser güncellemeler uygulamaları anında tepki veriyormuş gibi hissettirir; başarısızlık durumunda değişikliği geri alın. Oluşturulan öğeler için geçici ID'ler kullanın. Çevrimdışı dayanıklılık için yerel kuyruğa alma uygulayın. Yeniden oluşturmaları önlemek için sunucu güncellemelerini farklandırın veya yamalayın. Yüksek frekanslı akışları sınırlayın. Çevrimiçi olma durumunu (çevrimiçi, yazıyor) ve bağlantı bantlarını gösterin. Ortak düzenleme için CRDT'leri (Yjs, Automerge) kullanın. Uzun gerçek zamanlı listeleri sanallaştırın.

Sıkça Sorulan Sorular

“Gerçek Zamanlı Arayüz Kalıpları” dersi ücretsiz mi?

Evet — “Gerçek Zamanlı Arayüz Kalıpları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Frontend Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Frontend Academy kursu toplamda 4 dersten oluşur.

“Gerçek Zamanlı Arayüz Kalıpları” dersinde ne öğreneceğim?

Anında geri bildirim için iyimser güncellemeler uygulamayı, çevrimdışıyken yerel sıraya almayı ve arayüzde yalnızca değişen öğeleri güncellemek için gelen verileri karşılaştırmayı öğrenin. Frontend Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Frontend Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Frontend Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Gerçek Zamanlı Arayüz Kalıpları” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Frontend Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Frontend Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. WebSocket API: open, message, close ve error
  2. Socket.io İstemci Entegrasyonu
  3. Tek Yönlü Akış için Sunucu Tarafından Gönderilen Olaylar
  4. Gerçek Zamanlı Arayüz Kalıpları
← Frontend Academy Sayfasına Dön