Frontend Academy · Pelajaran

Corak UI Masa Nyata

Gunakan kemas kini optimistik untuk maklum balas segera, gunakan baris gilir tempatan ketika luar talian, dan bandingkan data masuk untuk mengemas kini hanya item UI yang berubah.

Pelajaran 4 daripada 414 langkah

Corak UI Masa Nyata ialah pelajaran Frontend Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Frontend Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Frontend Academy merangkumi sejumlah 4 pelajaran.

Masa Nyata Bermaksud UX yang Terasa Nyata

Masa nyata bukan sekadar pantas — ia responsif, boleh dijangka dan bertolak ansur dengan kependaman. Tiga corak utama: kemas kini optimistik, baris gilir setempat dan perbandingan perbezaan yang bijak.

Kemas Kini Optimistik

Kemas kini antara muka pengguna serta-merta apabila pengguna melakukan tindakan, sebelum pelayan mengesahkannya. Kembalikan perubahan jika pelayan menolaknya. Ini menjadikan aplikasi terasa pantas.

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');
  }
}

Optimistik dengan ID Sementara

Untuk item yang dicipta, berikan ID sementara secara setempat. Gantikannya dengan ID sebenar daripada pelayan apabila 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));
  }
}

Menjadikan Tindakan Dalam Baris Gilir Apabila Luar Talian

Apabila rangkaian terputus, masukkan tindakan ke dalam baris gilir secara setempat dan ulangkannya apabila rangkaian kembali. Pengguna boleh 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 Perbezaan Data Masa Nyata yang Masuk

Jika pelayan menolak keseluruhan senarai, bandingkan dengan keadaan semasa dan kemas kini perubahan sahaja — ini mengelakkan pemaparan semula yang tidak perlu serta gangguan animasi.

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;
}

Kemas Kini Berasaskan Tampalan

Lebih baik berbanding petikan penuh: pelayan hanya menghantar medan yang berubah. Gunakan perubahan secara berperingkat — ini menggunakan jalur lebar yang lebih sedikit dan lebih pantas untuk dipaparkan.

// 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
    ));
  }
});

Mengehadkan Kadar Kemas Kini Berfrekuensi Tinggi

Sesetengah strim menghantar banyak kemas kini setiap saat, seperti kedudukan tetikus dan perubahan saham. Hadkan kemas kini antara muka pengguna kepada kira-kira 60Hz untuk mengelakkan pelayar tersentak-sentak.

import { throttle } from 'lodash-es';

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

ws.on('tick', applyUpdate);

Penunjuk Kehadiran

Paparkan siapa lagi yang berada dalam talian atau sedang menaip secara masa nyata. Pelayan menerbitkan peristiwa kehadiran; klien memaparkan senarai bersama 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));
});

Sepanduk Keadaan Sambungan

Paparkan sepanduk halus apabila luar talian atau sedang menyambung semula. Sembunyikannya selepas penyambungan semula sepenuhnya. Pengguna lebih mudah menerima kependaman apabila mereka dapat melihat perkara yang sedang berlaku.

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

Penyelesaian Konflik

Aplikasi masa nyata mesti mengendalikan suntingan serentak yang bercanggah. Strategi: penulisan terakhir menang (ringkas tetapi kehilangan data), vektor versi, OT (transformasi operasi), CRDT (Yjs, Automerge).

CRDT untuk Kerjasama

CRDT (Jenis Data Replikasi Tanpa Konflik) membolehkan penyuntingan kolaboratif masa nyata tanpa pelayan pusat. Pustaka: Yjs, Automerge. Digunakan oleh aplikasi seperti Figma, Linear dan Notion.

Prestasi: Senarai Tervirtualisasi

Suapan masa nyata boleh menjadi panjang. Gunakan senarai tervirtualisasi (react-virtuoso, @tanstack/react-virtual) untuk memaparkan item yang kelihatan sahaja — memori dan CPU kekal tetap tanpa mengira jumlah item.

Semakan Pantas

Apakah maksud 'kemas kini optimistik' dalam antara muka pengguna masa nyata?

Imbas Kembali: Corak Antara Muka Pengguna Masa Nyata

Kemas kini optimistik menjadikan aplikasi terasa pantas; kembalikan perubahan apabila gagal. ID sementara untuk item yang dicipta. Baris gilir setempat untuk ketahanan luar talian. Bandingkan perbezaan atau gunakan tampalan bagi kemas kini pelayan untuk mengelakkan pemaparan semula. Hadkan kadar strim berfrekuensi tinggi. Paparkan kehadiran (dalam talian, sedang menaip) dan sepanduk sambungan. CRDT (Yjs, Automerge) untuk penyuntingan kolaboratif. Tervirtualisasikan senarai masa nyata yang panjang.

Percuma untuk bermula

Pelajari HTML dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
41
Pelajaran
163

Soalan Lazim

Adakah pelajaran “Corak UI Masa Nyata” percuma?

Ya — teks penuh “Corak UI Masa Nyata” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Frontend Academy, tingkat taraf kepada CoddyKit PRO. Kursus Frontend Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Corak UI Masa Nyata”?

Gunakan kemas kini optimistik untuk maklum balas segera, gunakan baris gilir tempatan ketika luar talian, dan bandingkan data masuk untuk mengemas kini hanya item UI yang berubah. Anda berlatih Frontend Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Frontend Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Frontend Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Corak UI Masa Nyata” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Frontend Academy ini?

Ya. Setiap pelajaran Frontend Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. API WebSocket: buka, mesej, tutup dan ralat
  2. Penyepaduan Klien Socket.io
  3. Server-Sent Events untuk Penstriman Sehala
  4. Corak UI Masa Nyata
← Kembali ke Frontend Academy