שני משתמשים עורכים בו-זמנית רשימת משימות: אחד באייפון, השני באנדרואיד. הנתונים מתפצלים במהירות, קונפליקטים מצטברים, והמצב הסופי אינו צפוי. REST API אינו מספק זמן אמת, ובניית שרת WebSocket מותאם אישית עם CRDT אורכת חודשים של פיתוח וניפוי באגים. אובדן נתונים עקב קונפליקטים יכול להגיע ל-15% מכלל השינויים.
אנו משלבים את Liveblocks—תשתית מנוהלת לעריכה שיתופית. היא מספקת שרת WebSocket מוכן, אחסון CRDT (המבוסס על Liveblocks Storage), נוכחות, תגובות והתראות דרך API בענן. בדפדפן, האינטגרציה אורכת יום; באפליקציית React Native לנייד, משבוע. זה מאיץ את זמן היציאה לשוק פי 3–6 בהשוואה לבנייה מאפס. החיסכון בעלויות התשתית יכול להיות משמעותי.
מה Liveblocks מספקת ישירות מהקופסה?
- Storage — אחסון CRDT המבוסס על יישום עצמי עם LiveObject, LiveList, LiveMap. שינויים משתכפלים בין לקוחות ב-<100 אלפיות השנייה בתוך אותו אזור.
- Presence — מצב משתמש זמני: מיקום סמן, בחירה, סטטוס. לא נשמר, רק באונליין.
- אינטגרציית Yjs — דרך @liveblocks/yjs ניתן להשתמש במסמכי Yjs עם עורכי אינטרנט (Tiptap, Slate).
לפי ויקיפדיה, CRDT מבטיח עקביות במערכות מבוזרות.
איך מחברים את Liveblocks ב-React Native?
- התקנת חבילות:
LiveObject - יצירת לקוח עם
LiveListוהגדרת אימות. - הגדרת סוגי Presence ו-Storage עבור האפליקציה שלך.
- ייצוא hooks דרך
LiveMap. - עטיפת מסך העורך ב-RoomProvider.
import { createClient } from '@liveblocks/client';
import { createRoomContext } from '@liveblocks/react';
const client = createClient({
authEndpoint: '/api/liveblocks-auth', // или publicApiKey для прототипов
});
type Presence = {
cursor: { x: number; y: number } | null;
selectedItemId: string | null;
};
type Storage = {
items: LiveList<{ id: string; text: string; done: boolean }>;
};
export const {
RoomProvider,
useMyPresence,
useStorage,
useMutation,
} = createRoomContext<Presence, Storage>(client);
RoomProvider עוטף את מסך העורך. בפנים, @liveblocks/yjs נותן snapshot בלתי ניתן לשינוי, npm install @liveblocks/client @liveblocks/react — מוטציות טרנזקציונליות.
בעיה ב-RN: createClient משתמש ב-createRoomContext וב-RoomProvider, שזמינים, אבל import { createClient } from '@liveblocks/client'; import { createRoomContext } from '@liveblocks/react'; const client = createClient({ authEndpoint: '/api/liveblocks-auth', // или publicApiKey для прототипов }); type Presence = { cursor: { x: number; y: number } | null; selectedItemId: string | null; }; type Storage = { items: LiveList<{ id: string; text: string; done: boolean }>; }; export const { RoomProvider, useMyPresence, useStorage, useMutation } = createRoomContext<Presence, Storage>(client); (SSE להתראות) חסר ללא polyfill. התקן RoomProvider ו-polyfill גלובלי:
import EventSource from 'react-native-event-source'; global.EventSource = EventSource; קבל ייעוץ על הגדרת לקוח ו-polyfills—זה חוסך לך עד 40% מזמן האינטגרציה.
מה זה Presence בהקשר נייד?
בדפדפן, presence פירושו קואורדינטות עכבר. באפליקציה ניידת, מקרי שימוש אחרים:
- עריכה שיתופית של רשימת משימות: presence =
useStorage— הדגשת הפריט הנערך. - לוח שיתופי: presence =
useMutation— הצגת העט. - עורך מסמכים: presence =
@liveblocks/client— בחירת טקסט.
השתמש ב-fetch וב-WebSocket לנתוני presence ריאקטיביים. לאופטימיזציה, EventSource בוחר רק שדות נחוצים.
למה לבחור ב-Liveblocks לאפליקציה ניידת?
| קריטריון | Liveblocks | יישום עצמי |
|---|---|---|
| זמן עד לייצור | 2–8 שבועות | 3–6 חודשים |
| תמיכה במצב אופליין | דורש עבודה | שליטה מלאה |
| עלות תשתית | מנוי | משמעותית |
| SLA | 99.9% (Pro) | תלוי בך |
| מיקום נתונים | ענן בלבד | שליטה מלאה |
ההשוואה מראה: Liveblocks מנצחת במהירות האינטגרציה אך נופלת במצב אופליין ובשליטה על נתונים. עבור רוב ה-MVPs והפרויקטים הבינוניים, זה מספיק.
מצב אופליין: מה לא כלול ישירות מהקופסה
Liveblocks אינה מספקת שמירה אופליין. כאשר אין רשת, שינויים אובדים. אנו פותרים זאת עם buffer מוטציות ב-AsyncStorage:
דוגמה ליישום buffer אופליין
const [pendingMutations, setPendingMutations] = useAtom(pendingMutationsAtom);
NetInfo.addEventListener(state => {
if (!state.isConnected) {
const snapshot = storage.toObject();
AsyncStorage.setItem('offline_snapshot', JSON.stringify(snapshot));
} else {
pendingMutations.forEach(mutation => mutation());
setPendingMutations([]);
}
});זה לא CRDT אופליין אמיתי—מיזוג אינו מובטח עם שינויים אופליין במקביל. לפתרון מלא, שלב עם Yjs דרך react-native-event-source וספק מקומי מותאם. יותר מורכב אבל נכון.
| אסטרטגיית אופליין | מורכבות | הבטחת עקביות | זמן יישום |
|---|---|---|---|
| Buffer מוטציות | נמוכה | לא, אובדן אפשרי | 1–2 שבועות |
| עותק מקומי + מיזוג | בינונית | חלקית (last-write-wins) | 2–4 שבועות |
| Yjs עם ספק מקומי | גבוהה | CRDT מלא | 4–8 שבועות |
AppState וחיבור מחדש
iOS הורגת WebSocket ברקע. ה-SDK מתחבר מחדש אוטומטית, אבל import EventSource from 'react-native-event-source'; global.EventSource = EventSource; עובר דרך 'reconnecting'. אם ה-UI לא מגיב, המשתמש רואה מצב מיושן. טפל בזה במפורש:
const status = useStatus(); if (status === 'reconnecting') { return <ReconnectingBanner />; } מה כלול בעבודה
- הגדרת לקוח Liveblocks וספק אימות.
- אינטגרציית Storage ו-Presence עבור מקרה השימוש שלך.
- יישום buffer אופליין (אופציונלי).
- אינטגרציית Yjs לתאימות עם עורכי אינטרנט.
- בדיקת חיבור מחדש וטיפול ב-appState.
- תיעוד והדרכת צוות.
- שבועיים של תמיכה לאחר השקה.
הזמן פרויקט הדגמה עם אינטגרציה בסיסית—נראה איך Liveblocks עובדת בהקשר שלך. צור קשר להערכת פרויקט תוך 1–2 ימי עסקים.
איך אנו מעריכים את הפרויקט
לוחות זמנים משוערים:
- אינטגרציה בסיסית (Storage + Presence, ללא אופליין): 2–4 שבועות.
- עם buffer אופליין: 3–6 שבועות.
- עם Yjs ואופליין מלא: 6–10 שבועות.
העלות מחושבת באופן אישי לאחר ניתוח ה-MVP שלך. קבל ייעוץ—נעריך את הפרויקט תוך 1–2 ימי עסקים.
הניסיון שלנו: יותר מ-5 שנים בפיתוח נייד, 15+ פרויקטים עם סינכרון בזמן אמת. עבדנו עם Liveblocks מאז השחרור הציבורי שלה.







