Table of Contents
הודעות בזמן אמת הפכו אבן הפינה של עיצוב יישומים מודרני.משתמשים מצפים משוב מיידי כאשר מתרחשים אירועים: הודעת צ'אט חדשה מגיעה, עמית מאשר מסמך, או התראה השרתים.Build this Function into a JavaScript Web app דורש תכנון זהיר, פרוטוקולי התקשורת הנכונים, ועיצוב UI מתחשב.מדריך זה הולך לך באמצעות יישום הודעות בזמן אמת באמצעות WebSockets ו- ServerentSent אירועים (SE), שילוב אותם עם מערכת הפעלה ישירה, תמיכה ישירה, וחוויה ישירה.
למה דווקא מובנים בזמן אמת
הודעות בזמן אמת מבטלות את הצורך ברעננות דף ידני או סקר, אשר מרוקן רוחב פס ומפחית את חוויית המשתמש.כאשר משתמש מקבל התראה מיידית, הם נשארים מעורבים ויכולים להגיב במהירות.עבור פלטפורמות SaaS, כלי שיתוף פעולה, או לוחצים מסחר אלקטרוני, אמצעי זהירות זה משפיע ישירות על יעילות ושביעות רצון.
מעבר לחוויית המשתמש, הודעות בזמן אמת מאפשרות גם דפוסים חדשים של אינטראקציה: זרמי תגובה חיים, קידודי עריכה שיתופיים, והזנת אירוע בצד השרת.בחירת שכבת ההובלה הנכונה היא ההחלטה הטכנית הראשונה.
WebSocket: Full-Duplex Communication
(FLT:0WebSocketsFLT:1) לספק ערוץ מתמשך, דו-צדדי בין לקוח לשרת.בניגוד HTTP, החיבור נשאר פתוח לאחר לחיצת היד הראשונית, המאפשר צד לדחוף נתונים בכל עת.זה הופך את WebSockets אידיאלי עבור יישומים צ'אט, חי להאכיל פיננסים, משחקים מרובי-שחקנים - כל תרחיש שבו חסכוני, שתי דרכים הוא קריטי.
יצירת חיבור WebSocket ב- JavaScript
(ב) , עיין בכתובות (ב) ב[[1924]], [[1924]], [[1924]]]], [[1924]]]], [[1924]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]]]]]
const socket = new WebSocket('wss://api.directus.app/websocket');
socket.onopen = () => {
console.log('WebSocket connection established.');
// Optionally send an authentication token
socket.send(JSON.stringify({ type: 'auth', token: 'your-jwt' }));
};
socket.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === 'notification') {
showToast(data.payload.message);
}
};
socket.onerror = (err) => {
console.error('WebSocket error:', err);
};
socket.onclose = (event) => {
console.warn('WebSocket closed:', event.code, event.reason);
// optional reconnect logic
};
לאחר הקמת הקשר, תוכל לשלוח הודעות מקודמות של ג'ייסון ולטפל בתגובות ב-FLT:8 מטפל השרת חייב לתמוך בפרוטוקול WebSocket; מסגרות Node.js (למשל, FLT:9, FLT:9,FLT 10) ו- CMS אחוריים כמו Directus מציעים-in או תוסף מבוסס WebSocket תמיכה.
חיבור וקצבי לב
מערכת זמן אמתית חזקה חייבת להתמודד עם הפרעות רשת בחסד. ליישם אסטרטגיה מחדש שמגבה באופן אקספוננציאלי:
function connectWebSocket() {
const socket = new WebSocket('wss://api.directus.app/websocket');
let retryDelay = 1000;
socket.onclose = () => {
setTimeout(() => {
console.log('Reconnecting...');
connectWebSocket();
}, retryDelay);
retryDelay = Math.min(retryDelay * 2, 30000);
};
// ...other handlers
}
connectWebSocket();
בנוסף, לשלוח דפי פעימות לב תקופתיים (כל 30-60 שניות) כדי לזהות חיבורים מפוסקים.מספר ספריות WebSocket מטפלות באופן אוטומטי, אך אם אתה משתמש ב- API הגולמי, להגדיר מרווח כדי לשלוח הודעה של LT:12 ולצפות לתגובה (FLT:13).
אירועים קבועים: Simpler, One-Wayסטרימינג
(ב) [15] אירועים קבועים (SSE) ראט'ראל 1) הם אלטרנטיבה קלה כאשר אתה רק צריך את השרת לדחוף נתונים ללקוחות ללא צורך בהודעות הלקוח-ל-server.SSE משתמשות ב-HTTP סטנדרטי; השרת מגיב עם ראש FLT:14 ושומר על החיבור פתוח.
SSE פשוט יותר ליישום מאשר WebSockets, עובד על HTTP/2, ומתחבר באופן אוטומטי מחדש כאשר החיבור טיפות.עם זאת, הוא אינו תומך בתקשורת דו-צדדית, ולכן הוא מתאים ביותר עבור הזנת חדשות, סמן מניות או התראות מערכת.
שימוש ב EventSource בדפדפן
ממשק ה-FLT:16 הוא מינימלי:
const eventSource = new EventSource('/api/events?user_id=42');
eventSource.onopen = () => {
console.log('SSE connection opened.');
};
eventSource.addEventListener('notification', (event) => {
const data = JSON.parse(event.data);
displayNotification(data);
});
eventSource.onerror = (err) => {
console.error('EventSource error:', err);
// The browser will automatically attempt to reconnect
};
function displayNotification(data) {
// Update UI
}
בצד השרת, אתה מעצב כל אירוע כקווי טקסט:
event: notification
data: {"message":"Your report is ready","severity":"info"}
הערה: ה- API תומך רק בבקשות GET ואינו יכול לשלוח ראשי פנים מותאמים אישית.אם אתה צריך לעבור אסימוני אימות, נספח אותם כפרמטרי שאלה (שימוש ב- HTTPS כדי להימנע מחשיפת האסימון).
WebSocket vs. SSE: בחירת הגישה הנכונה
שתי הטכנולוגיות מסוגלות לטפל בהודעות בזמן אמת, אך הן משרתות מקרים שונים:
| Feature | WebSocket | SSE |
|---|---|---|
| Direction | Bidirectional | Server → Client only |
| Auto‑reconnect | Must implement manually | Built‑in |
| Binary data | Yes (ArrayBuffer, Blob) | Text only (UTF‑8) |
| Browser support | Excellent (IE10+) | Good (no IE/Edge Legacy) |
| Complexity | Higher | Lower |
אם הלקוח צריך לשלוח פקודות או נתונים בחזרה לשרת (למשל, סימון הודעה כקריאה), WebSocket היא הבחירה הטבעית. עבור הזנות הודעה פשוטות, SSE מקטין את הפיתוח מעל הראש וקל יותר ל debug כי זה משתמש ראשי HTTP סטנדרטיים.
אינטגרטיבית בזמן אמת עם Directus
(FLT:0)DirectusveFLT:1) הוא CMS חסר ראש לחשוף REST ו GraphQL API. כדי להוסיף יכולות בזמן אמת, אתה יכול למנף את התמיכה של WebSocket (התקבל ב Directus 10.x) או להגדיר נקודת קצה SSE באמצעות הרחבה אישית.
WebSocket מנוי בDirectus
נקודת הסיום של Directus (FLT:20) מקבל הודעות JSON להירשם, ללא רישום, או אותנטי.
const ws = new WebSocket('wss://cms.example.com/websocket');
ws.onopen = () => {
// Subscribe to changes on the notifications collection
ws.send(JSON.stringify({
type: 'subscribe',
collection: 'notifications',
query: { filter: { user_id: { _eq: currentUserId } } }
}));
};
ws.onmessage = (event) => {
const msg = JSON.parse(event.data);
if (msg.type === 'subscription' && msg.event === 'create') {
showNotification(msg.data);
}
};
גישה זו מדגימה את המורכבות של סינכרוניזציה בזמן אמת ל-CMS, בעוד אפליקציית JavaScript שלך צריכה רק לטפל בנתונים הנכנסים.
הצגת הודעות ב UI
לאחר שיש לך את הנתונים, חוויית המשתמש תלויה כיצד להציג את זה.ההודעות בסגנון טוסט הן התבנית הנפוצה ביותר: קטן, לא פולשני המופיע בפינה של המסך ו- auto-dismisses לאחר כמה שניות. Libraries כמו FLT:0Toastrph1, FLT:2Notyfalphalralpher 3, or conveterds to Getty: 4.
לחלופין, לבנות רכיב הודעה מותאם אישית.כאן דוגמה מינימלית באמצעות Vanilla JavaScript ו- CSS:
function showToast(message, type = 'info') {
const toast = document.createElement('div');
toast.className = `toast toast-${type}`;
toast.textContent = message;
toast.setAttribute('role', 'alert');
document.getElementById('toast-container').appendChild(toast);
setTimeout(() => toast.remove(), 3000);
}
// CSS (simplified):
.toast {
padding: 12px 20px;
margin-bottom: 8px;
border-radius: 4px;
color: #fff;
opacity: 0.9;
transition: opacity 0.3s;
}
.toast-info { background: #007bff; }
.toast-error { background: #dc3545; }
.toast-success { background: #28a745; }
ודא שהכולה קבועה בפינה הימנית העליונה וכי ערימה של ערימה אנכית להשתמש ב-FLT:24 על המיכל כדי להבטיח שהקוראים יודיעו הודעות חדשות.
ניהול העדפות המשתמש ואימות
לא כל ההודעות חשובות באותה מידה.אפשר למשתמשים להתאים אישית את האירועים שהם רוצים לקבל ובאמצעותם ערוצים (ב-app, דוא"ל, דחיפה) העדפות בחנות ב-Backend ו-סינון אירועים בשרת לפני שדוחפים אותם ללקוח.לדוגמה, משתמש עשוי להשבית "הערות חדשות" התראות אך לשמור על התראות "מסוכות".
באפליקציית JavaScript שלך, מעת לעת להביא את פרופיל ההעדפה של המשתמש ולהתאים את מסנני המנוי בהתאם.אם באמצעות Directus WebSockets, באפשרותך לשלוח שאילתה עדכנית של מנויים כאשר ההעדפות משתנות.
Fallback for Unsupported Browsers
בעוד שדפדפנים מודרניים תומכים באופן רחב WebSockets ו-SSE, סביבות ישנות יותר (למשל, Internet Explorer 11 עבור WebSockets, IE / Edge Legacy עבור SSE) עשויים לדרוש פולימטים או אסטרטגיות נפילה.
- (ב) ,ב"ה, ב"ד," (ב) ב"ה, ב"ד)" (ב"ד)
- (FLT:0) ביטול נפילה לאחור: השתמש בנקודת מוצא ארוכה המחודשת, אשר מחזירה אירועים חדשים כ-JSON.הלקוח מבקש את נקודת הקצה כל כמה שניות ומעבד כל אירועים החלפים.
- (ב) ,0) ,הפשטות של פרירי (FLT:1): השתמש בספריה כמו (FLT:27) אשר נופלת באופן שקוף מ- WebSocket ל-HTTP ארוך-פולינג.
כאשר סקרים, קבעו מרווח סביר (למשל, 5-10 שניות) והחזרת תגובה ריקה אם אין אירועים החלים.
שיקולים ביטחוניים
חיבורים בזמן אמת מציגים כמה וקטורים אבטחה שיש לטפל בהם:
- (ב) [ה]ה' [ה']'[דרוש מקור] [ב]'[דרוש מקור], שלח ג'ואט או מושב במסר הראשון.עבור SSE, נספח אסימון כפרמטר שאילתה (אך לעולם לא ב-URL אם אתה נכנס אליו).
- (FLT:0)Validate ו-Ssanitize את כל הנתונים של ההרחבה 1 לפני שדוחפים אותו ללקוח.גם אם ה-Backend שלך הוא מהימן, לעולם לא תפיק תוכן מחוספס למשתמש הודעה ללא בריחה.
- (ב) [ה]: [ה]], [ה], [ה], [ה],] [ה], [ה],] [ה], [ה],]], [ה], [ה],], [ה'], [ה'], [ה'], [ה']']']'[ה']']']'[ה'[ה']']']'[ה']']'[ה'[ה']'[ה'[ה']'[ה'[ה'[ה'[ה']']']'[ה']']'[ה'[ה']']']']']']'[ה'[ה'[ה']']']']']']']'[ה']']']'[ה']']']']']']'[ה']']'[ה'[ה']'[ה'[ה'[ה'[ה']']'[ה'[ה'[ה'[ה'
- (ב) [13] חיבורים של תפוצה:0) ,1 למשתמש כדי למנוע התעללות. Directus חושף הגדרות לקביעת שיעור הפחתת שיעור שניתן להגדיר.
- (ב) לא לחשוף את מצב השרת הפנימי 1R (בקיצור: WEBSocket) או SSE הודעות.תמיד להחזיר רק את הנתונים שהמשתמש מורשה לראות.
ביצועים ו Scalability
ככל שמספר הקשרים הדומים גדל, השרת שלך צריך לנהל אותם ביעילות.חשב אופטימיזציה אלה:
- (ב) [ה], [ה], [ה], [התהליך] ה[[המאה ה-20]], ו[[1924]], [[1924]], [[1924]]]], [[1924]]]], [[1924]]]], [[1924]]]]]]]], [[1924]]]]]]
- (FLT:0)Broadcast רק למשתמשים רלוונטיים 1Felo: להשתמש בחדרים או ערוצים המבוססים על מזהה משתמש, קבוצה או מסנן מנויים כדי להימנע מלשלח כל אירוע לכל לקוח.
- (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (ב) [15] ,9.10.Monitor Connections HealthFLT:1 עם מדדים כמו חיבורים פתוחים, הודעה באמצעות חישוב ושיעורי שגיאות.כלי כמו Prometheus יכולים לגרד את אלה מהשרת שלך.
- (FLT:0) אירועים בולטים של שרת השרתים cachingveveph:1 ; עם SSE, אתה יכול למנף ראשי צ'ינג HTTP אם הזרם סטטי לתקופה (למרות הודעות הן בדרך כלל דינמיות).
לשים את הכל ביחד: זרימה שלמה
כדי להמחיש דוגמה בעולם האמיתי, בואו נשלב את ה-Directus backend עם חזית JavaScript המשתמשת ב-SSE לקבלת הודעות.
- (ב) [הרחבה של ה-JWT:][דרוש מקור]] [ב], [ה], [ה]], [התחילה] [התרחבה] של ה-[[המאה ה-20]], היא זו ש[[המאה ה-20]], [[המאה ה-20]], [[המאה ה-20]], [[המאה ה-20]], [[1924]]]], [[1924]]]], [[1924]]]], [[1924]]]]]]]], [[1924]]]]]]]]]]]]]]]]]]]], [[1924]], [[1924]]]]]]]]]]]], [[1924]], [[1924]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
- (ב) ויקרא י"א: "ה' י"א י"א , ויקרא י"א , ויקרא י"ד , ויקרא י"ד , ויקרא י"ד , ).
- (ב) ,0 (הופנה מהדף ⁇ ): כל הודעה שהתקבלה הופכת ל כוסית באמצעות מרכיב מותאם אישית, עם אפשרויות לפטור או לפתוח את המשאב הקשור.
- (ב) [ה]העיקרון [ה]: [ה] [ה] [ה] כאשר המשתמש מעדכן את הגדרות ההודעות שלהם באמצעות טופס, שלח POST ל-Directus's FLT:37.
אדריכלות זו שומרת על הלקוח רזה ודוחפת את המריבה הכבדה ל Directus ולמערכת ה- TOR שלה.
בדיקות סימולציות בזמן אמת
לפני שאתה מפיץ, לבדוק ביסודיות את היישום שלך:
- (ב) עיין ב[[1924]]: [[1924]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]]]]]
- (FLT:0Network throttling: FLT:1hil השתמש ב-Chrome Devtools כדי לדמות איטי 3G או תנאים לא מקוון.בדוק כי חיבור מחדש של לוגיקה פועל וכי אין הודעות משוכפלות נמסרות.
- בדיקה אחרונה ב-5 ביולי 2010. ^ FLT:0Cross-browser Testing: Embeddph:1, Safari, Chrome, and Edge. for SSE, Test in Safari (אשר חסר תמיכה מלאה ב- EventSource
- (ב) [15] מקרים של סודיות: 1) ניסיון להתחבר עם אסימונים פגים, או להזרק JSON כדי להבטיח שמטפלים בשגיאות שלך לא ירסקו את הלקוח.
מסקנה
הודעות בזמן אמת אינן יותר מותרות; הן ציפייה בסיסית באפליקציות אינטרנט מודרניות.על ידי מינוף WebSockets או SSE, בשילוב עם גב כמו Directus המספק התאמות בזמן אמת, אתה יכול לספק עדכונים מיידיים ללא מכריע התשתית שלך. להתמקד התאמה אישית של משתמשים, תשואות חינניות, ואבטחה חזקה כדי ליצור מערכת הודעה כי מרגיש חלקה ואמינה.
התחל קטן: ליישם כוסית פשוטה עבור סוג אירוע אחד, ואז בהדרגה להרחיב לערוצים מרובים והעדפות המשתמש.המפתח הוא להתפתל על חוויית המשתמש תוך שמירה על התחבורה הבסיסית יעילה והחזקה.עם הגישות המתוארות כאן, אתה תהיה בסדר בדרך שלך לתכונת זמן אמתית לקריאה.