useWebSocket Composable مع إعادة الاتصال
تغليف WebSocket داخل Composable، وإعادة الاتصال تلقائيًا مع تراجع أُسّي، وتتبع الحالة
useWebSocket Composable مع إعادة الاتصال درس مجاني في Vue Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Vue Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Vue Academy 4 دروس في المجموع.
تغليف WebSockets داخل Composable
يصبح التعامل المباشر مع WebSocket موزعًا بين المكوّنات أمرًا فوضويًا. يركّز Composable باسم useWebSocket حالة الاتصال وإعادة الاتصال ومعالجة الرسائل في مكان واحد، ويمكنك إعادة استخدامه في كل مكان.
سنَبنيه خطوةً خطوة.
تتبّع الحالة باستخدام Ref
اعرض حالة الاتصال في ref تفاعلي باسم status حتى تتمكن واجهة المستخدم من إظهار شارات «جارٍ الاتصال» أو «مفتوح» أو «مغلق».
import { ref } from "vue"
export function useWebSocket(url) {
const status = ref("CLOSED") // CONNECTING | OPEN | CLOSED
// ...
return { status }
}دالة connect
ضع فتح المقبس داخل دالة داخلية باسم connect حتى نتمكن من استدعائها لاحقًا لإعادة الاتصال. حدّث status عند كل حدث من أحداث دورة الحياة.
let ws
function connect() {
status.value = "CONNECTING"
ws = new WebSocket(url)
ws.onopen = () => { status.value = "OPEN" }
ws.onclose = () => { status.value = "CLOSED"; scheduleReconnect() }
}إعادة الاتصال بتأخير متزايد
تؤدي إعادة الاتصال الفورية في حلقة متقاربة إلى إرهاق الخادم. استخدم التراجع الأسي: انتظر مدة أطول بعد كل محاولة فاشلة، مع وضع حد أقصى للانتظار.
let attempts = 0
function scheduleReconnect() {
attempts++
const delay = Math.min(1000 * 2 ** attempts, 30000)
setTimeout(connect, delay)
}إعادة ضبط التراجع عند النجاح
بعد نجاح الاتصال، أعد ضبط عدّاد المحاولات حتى تبدأ عملية الفصل التالية التراجع من البداية بدلًا من تأخير طويل.
ws.onopen = () => {
status.value = "OPEN"
attempts = 0
flushQueue()
}قائمة انتظار للرسائل أثناء انقطاع الاتصال
إذا أرسل المستخدم رسالة بينما المقبس متوقف، فلا ينبغي أن تفقد الرسالة. خزّن الرسائل الصادرة مؤقتًا في قائمة انتظار، ثم أفرغها عند فتح الاتصال.
const queue = []
function send(data) {
const payload = JSON.stringify(data)
if (ws && ws.readyState === WebSocket.OPEN) {
ws.send(payload)
} else {
queue.push(payload)
}
}تفريغ قائمة الانتظار
عند فتح المقبس، أفرغ كل ما تراكم فيه. أزل العناصر من المقدمة باستخدام Shift للحفاظ على ترتيبها.
function flushQueue() {
while (queue.length && ws.readyState === WebSocket.OPEN) {
ws.send(queue.shift())
}
}معالجات الرسائل حسب النوع
اسمح للمستهلكين بتسجيل معالجات لكل type من أنواع الرسائل. خزّن دوال الاستدعاء في خريطة، ووزّع كل إطار وارد حسب نوع الرسالة.
const handlers = {}
function on(type, cb) { handlers[type] = cb }
// inside connect:
ws.onmessage = (e) => {
const msg = JSON.parse(e.data)
if (handlers[msg.type]) handlers[msg.type](msg.payload)
}التنظيف في onUnmounted
يمتلك Composable المؤقتات ومقبس الاتصال. أوقفها وأزلها عند إلغاء تحميل المكوّن المستخدم حتى لا تستمر إعادة الاتصالات بعد اختفاء العرض.
import { onUnmounted } from "vue"
let reconnectTimer
onUnmounted(() => {
clearTimeout(reconnectTimer)
if (ws) ws.close(1000, "component unmounted")
})تجنب إعادة الاتصال بعد الإغلاق المقصود
يجب ألا يؤدي الإغلاق السليم، بالرمز 1000، الناتج عن عملية التنظيف الخاصة بك إلى إعادة الاتصال. تتبّع راية intentional وتخطَّ جدولة إعادة الاتصال عند ضبطها.
let intentional = false
function close() { intentional = true; ws.close(1000) }
ws.onclose = () => {
status.value = "CLOSED"
if (!intentional) scheduleReconnect()
}البنية الكاملة لـ Composable
تجتمع جميع الأجزاء: الاتصال عند الإنشاء، وإتاحة status وsend وon، ووضع الرسائل في قائمة انتظار أثناء الانقطاع، وإعادة الاتصال مع التراجع، والتنظيف تلقائيًا.
export function useWebSocket(url) {
const status = ref("CLOSED")
// connect, scheduleReconnect, send, on, flushQueue, cleanup...
connect()
return { status, send, on, close }
}
// usage:
// const { status, send, on } = useWebSocket("wss://...")تحقق سريع
تحقق من فهمك لاستراتيجية إعادة الاتصال.
مراجعة
بنيت Composable قويًا باسم useWebSocket:
- يعكس ref باسم
statusحالات CONNECTING / OPEN / CLOSED لواجهة المستخدم. - أعد الاتصال باستخدام التراجع الأسي مع حد أقصى، وأعد ضبط العدّاد عند النجاح.
- ضع الرسائل الصادرة في قائمة انتظار أثناء انقطاع الاتصال، ثم أفرغها عند الفتح.
- وزّع الإطارات الواردة على دوال استدعاء للمعالجات حسب النوع.
- نظّف المؤقتات والمقبس داخل
onUnmounted، وتخطَّ إعادة الاتصال بعد الإغلاق المقصود.
الأسئلة الشائعة
هل درس «useWebSocket Composable مع إعادة الاتصال» مجاني؟
نعم — نص درس «useWebSocket Composable مع إعادة الاتصال» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Vue Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Vue Academy 4 دروس في المجموع.
ماذا ستتعلم في «useWebSocket Composable مع إعادة الاتصال»؟
تغليف WebSocket داخل Composable، وإعادة الاتصال تلقائيًا مع تراجع أُسّي، وتتبع الحالة تتمرن على Vue Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Vue Academy؟
لا تُشترط خبرة سابقة. Vue Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «useWebSocket Composable مع إعادة الاتصال»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Vue Academy هذا؟
نعم. كل درس في Vue Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات WebSocket في المتصفح
- عميل Socket.io مع Vue
- بناء مكوّن محادثة فورية
- useWebSocket Composable مع إعادة الاتصال