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
- WebSocket API: open, message, close ve error
- Socket.io İstemci Entegrasyonu
- Tek Yönlü Akış için Sunucu Tarafından Gönderilen Olaylar
- Gerçek Zamanlı Arayüz Kalıpları