Pola UI Waktu Nyata
Terapkan pembaruan optimistis untuk respons instan, gunakan antrean lokal saat offline, dan bandingkan data masuk agar hanya item yang berubah yang diperbarui di UI.
Pola UI Waktu Nyata adalah pelajaran Frontend Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Frontend Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Frontend Academy mencakup 4 pelajaran total.
Waktu Nyata Berarti UX yang Terasa Nyata
Waktu nyata bukan sekadar cepat — pengalaman ini harus responsif, dapat diprediksi, dan toleran terhadap latensi. Tiga pola utama: pembaruan optimistis, antrean lokal, dan perbandingan perbedaan yang cerdas.
Pembaruan Optimistis
Perbarui UI segera setelah tindakan pengguna, sebelum server mengonfirmasinya. Kembalikan perubahan jika server menolaknya. Hal ini membuat aplikasi terasa instan.
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');
}
}Pembaruan Optimistis dengan ID Sementara
Untuk elemen yang dibuat, berikan ID sementara secara lokal. Ganti dengan ID asli dari server saat respons tiba.
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));
}
}Mengantre Secara Lokal Saat Luring
Saat jaringan tidak tersedia, antrekan tindakan secara lokal dan putar ulang saat jaringan kembali. Pengguna dapat terus bekerja.
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);Membandingkan Data Waktu Nyata yang Masuk
Jika server mendorong seluruh daftar, bandingkan dengan keadaan saat ini dan perbarui hanya perubahan yang ada — hal ini menghindari render ulang dan gangguan animasi yang tidak perlu.
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;
}Pembaruan Berbasis Patch
Lebih baik daripada snapshot penuh: server hanya mengirim bidang yang berubah. Terapkan secara bertahap — ini menggunakan lebih sedikit bandwidth dan lebih cepat dirender.
// 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
));
}
});Membatasi Pembaruan Berfrekuensi Tinggi
Beberapa aliran mengirim banyak pembaruan per detik (posisi tetikus, perubahan harga saham). Batasi pembaruan UI hingga sekitar 60 Hz agar browser tidak tersendat.
import { throttle } from 'lodash-es';
const applyUpdate = throttle((data) => {
setData(data);
}, 16); // ~60fps
ws.on('tick', applyUpdate);Indikator Kehadiran
Tampilkan siapa saja yang sedang online atau mengetik secara waktu nyata. Server menerbitkan peristiwa kehadiran; klien menampilkan daftar dengan avatar.
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 Status Koneksi
Tampilkan banner sederhana saat luring atau sedang menyambungkan kembali. Sembunyikan saat koneksi tersambung kembali sepenuhnya. Pengguna jauh lebih toleran terhadap latensi jika mereka dapat melihat apa yang sedang terjadi.
{!isConnected && (
<div className="connection-banner">
Reconnecting... Your changes will sync when you're back online.
</div>
)}Penyelesaian Konflik
Aplikasi waktu nyata harus menangani perubahan bersamaan yang saling bertentangan. Strateginya: penulisan terakhir menang (sederhana tetapi dapat menghilangkan perubahan), vektor versi, OT (transformasi operasional), dan CRDT (Yjs, Automerge).
CRDT untuk Kolaborasi
CRDT (Tipe Data Tereplikasi Tanpa Konflik) memungkinkan penyuntingan kolaboratif waktu nyata tanpa server pusat. Pustaka yang tersedia: Yjs, Automerge. Teknologi ini digunakan oleh aplikasi bergaya Figma, Linear, dan Notion.
Performa: Daftar Tervirtualisasi
Umpan waktu nyata dapat menjadi sangat panjang. Gunakan daftar tervirtualisasi (react-virtuoso, @tanstack/react-virtual) untuk hanya merender elemen yang terlihat — penggunaan memori dan CPU tetap terkontrol, berapa pun jumlah totalnya.
Pemeriksaan Singkat
Apa yang dimaksud dengan 'pembaruan optimistis' dalam UI waktu nyata?
Ringkasan: Pola UI Waktu Nyata
Pembaruan optimistis membuat aplikasi terasa instan; kembalikan perubahan saat terjadi kegagalan. Gunakan ID sementara untuk elemen yang dibuat. Gunakan antrean lokal agar data tetap tersedia saat luring. Bandingkan atau gunakan patch pada pembaruan server untuk menghindari render ulang. Batasi aliran berfrekuensi tinggi. Tampilkan kehadiran (online, mengetik) dan banner koneksi. Gunakan CRDT (Yjs, Automerge) untuk penyuntingan kolaboratif. Virtualisasikan daftar waktu nyata yang panjang.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pola UI Waktu Nyata” gratis?
Ya — teks lengkap “Pola UI Waktu Nyata” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Frontend Academy, upgrade ke CoddyKit PRO. Kursus Frontend Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pola UI Waktu Nyata”?
Terapkan pembaruan optimistis untuk respons instan, gunakan antrean lokal saat offline, dan bandingkan data masuk agar hanya item yang berubah yang diperbarui di UI. Kamu berlatih Frontend Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Frontend Academy?
Tidak diperlukan pengalaman sebelumnya. Frontend Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Pola UI Waktu Nyata” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Frontend Academy ini?
Ya. Setiap pelajaran Frontend Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- API WebSocket: buka pesan tutup error
- Integrasi Klien Socket.io
- Server-Sent Events untuk Streaming Satu Arah
- Pola UI Waktu Nyata