Muster für Echtzeit-UIs
Verwenden Sie optimistische Aktualisierungen für sofortiges Feedback, lokale Warteschlangen im Offline-Modus und vergleichen Sie eingehende Daten, um in der UI nur geänderte Elemente zu aktualisieren.
Muster für Echtzeit-UIs ist eine kostenlose Frontend Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Frontend Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Frontend Academy-Kurs umfasst insgesamt 4 Lektionen.
Echtzeit bedeutet ein Echtzeitgefühl in der UX
Echtzeit bedeutet mehr als nur Schnelligkeit – die Anwendung muss reaktionsfähig, vorhersehbar und tolerant gegenüber Latenz sein. Drei Kernmuster sind optimistische Aktualisierungen, lokale Warteschlangen und intelligentes Diffing.
Optimistische Aktualisierungen
Aktualisieren Sie die UI unmittelbar nach der Benutzeraktion, bevor der Server sie bestätigt. Setzen Sie die Änderung zurück, wenn der Server sie ablehnt. Dadurch wirken Anwendungen sofortig.
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');
}
}Optimistische Aktualisierungen mit temporären IDs
Vergeben Sie für neu erstellte Elemente lokal eine temporäre ID. Ersetzen Sie sie durch die echte ID des Servers, sobald die Antwort eintrifft.
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));
}
}Lokale Warteschlange ohne Netzwerkverbindung
Wenn das Netzwerk ausfällt, stellen Sie Aktionen lokal in eine Warteschlange und spielen Sie sie nach der Wiederherstellung der Verbindung erneut ab. So kann der Benutzer weiterarbeiten.
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);Eingehende Echtzeitdaten per Diff vergleichen
Wenn der Server die gesamte Liste sendet, vergleichen Sie sie per Diff mit dem aktuellen Zustand und aktualisieren Sie nur die Änderungen – das vermeidet unnötige erneute Render-Vorgänge und Animationsfehler.
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;
}Patch-basierte Aktualisierungen
Besser als vollständige Snapshots: Der Server sendet nur die geänderten Felder. Wenden Sie sie schrittweise an – das spart Bandbreite und lässt sich schneller rendern.
// 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
));
}
});Aktualisierungen mit hoher Frequenz drosseln
Einige Streams senden viele Aktualisierungen pro Sekunde, etwa bei Mauspositionen oder Börsenkursen. Drosseln Sie UI-Aktualisierungen auf etwa 60 Hz, um Ruckeln im Browser zu vermeiden.
import { throttle } from 'lodash-es';
const applyUpdate = throttle((data) => {
setData(data);
}, 16); // ~60fps
ws.on('tick', applyUpdate);Presence-Indikatoren
Zeigen Sie in Echtzeit, wer sonst online ist oder tippt. Der Server veröffentlicht Presence-Ereignisse; der Client rendert eine Liste mit Avataren.
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));
});Banner für den Verbindungsstatus
Zeigen Sie bei einer fehlenden Verbindung oder während der Wiederverbindung ein dezentes Banner an. Blenden Sie es nach einer vollständigen Wiederverbindung aus. Benutzer tolerieren Latenz deutlich besser, wenn sie sehen können, was gerade passiert.
{!isConnected && (
<div className="connection-banner">
Reconnecting... Your changes will sync when you're back online.
</div>
)}Konfliktlösung
Echtzeitanwendungen müssen mit widersprüchlichen gleichzeitigen Bearbeitungen umgehen. Strategien: last-write-wins (einfach, aber verlustbehaftet), Versionsvektoren, OT (operational transformation), CRDTs (Yjs, Automerge).
CRDTs für Zusammenarbeit
CRDTs (Conflict-free Replicated Data Types) ermöglichen die kollaborative Bearbeitung in Echtzeit ohne zentralen Server. Bibliotheken: Yjs, Automerge. Sie werden von Figma, Linear und Notion-ähnlichen Anwendungen verwendet.
Performance: virtualisierte Listen
Echtzeit-Feeds können sehr lang werden. Verwenden Sie virtualisierte Listen (react-virtuoso, @tanstack/react-virtual), um nur die sichtbaren Elemente zu rendern – Speicher- und CPU-Bedarf bleiben unabhängig von der Gesamtanzahl konstant.
Kurze Wissensprüfung
Was ist eine „optimistische Aktualisierung“ in einer Echtzeit-UI?
Zusammenfassung: Muster für Echtzeit-UIs
Optimistische Aktualisierungen lassen Anwendungen sofortig wirken; bei Fehlern setzen Sie sie zurück. Temporäre IDs für neu erstellte Elemente. Lokale Warteschlangen für Offline-Beständigkeit. Vergleichen Sie Serveraktualisierungen per Diff oder Patch, um erneute Render-Vorgänge zu vermeiden. Drosseln Sie Streams mit hoher Frequenz. Zeigen Sie Presence (online, tippt) und Verbindungsbanner an. CRDTs (Yjs, Automerge) für kollaborative Bearbeitung. Virtualisieren Sie lange Echtzeitlisten.
Häufig gestellte Fragen
Ist die Lektion „Muster für Echtzeit-UIs“ kostenlos?
Ja — der vollständige Text von „Muster für Echtzeit-UIs“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Frontend Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Frontend Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Muster für Echtzeit-UIs“?
Verwenden Sie optimistische Aktualisierungen für sofortiges Feedback, lokale Warteschlangen im Offline-Modus und vergleichen Sie eingehende Daten, um in der UI nur geänderte Elemente zu aktualisieren. Du übst Frontend Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Frontend Academy zu starten?
Keine Vorkenntnisse erforderlich. Frontend Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Muster für Echtzeit-UIs“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Frontend Academy-Lektion Code schreiben und ausführen?
Ja. Jede Frontend Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- WebSocket API: open, message, close und error
- Socket.io-Client-Integration
- Server-Sent Events für unidirektionales Streaming
- Muster für Echtzeit-UIs