Search⌘ K
AI Features

تقنية Web Workers في React (تفريغ العمليات الثقيلة)

تعرّف على كيفية حماية خط أنابيب عرض React من العمليات الحسابية التي تستهلك موارد وحدة المعالجة المركزية بشكل كبير عن طريق نقل العمل المكلف من خيط الرئيسي باستخدام Web Workers.

لا تنشأ معظم مشاكل أداء React من كثرة المكونات، بل من كثرة العمليات المتزامنة التي تُنفذ في أوقات غير مناسبة. تخيّل لوحة تحكم تُحمّل مجموعة بيانات ضخمة وتُجري عليها عمليات تجميع معقدة، أو جدول بيانات يُرتب 50,000 صف مع كل تغيير في الفلتر، أو أداة رسم بياني تُعيد حساب الأبعاد الهندسية مع كل تفاعل، أو أداة معالجة صور تضغط الملفات أو تُحوّلها قبل تحميلها. هذه ليست حالات استثنائية غير واقعية، بل شائعة في أنظمة الإنتاج.

في البداية، تعمل الخاصية بشكل صحيح. ثم يحدث خللٌ ما. أثناء إجراء العملية الحسابية، تتجمد واجهة المستخدم. يصبح إدخال إدخال متقطعًا. تبدو الأزرار غير مستجيبة. تتقطع الرسوم المتحركة. حتى مؤشر التحميل البسيط لا يعمل بسلاسة. المشكلة ليست في توافق React ، بل في أن خيط الرئيسي للمتصفح متوقف.

هذا فرق جوهري. يوفر لنا React 19 الانتقالات،Suspense وجدولة المهام لتنسيق أولوية العرض. لكن لا فائدة من هذه الأدوات إذا كان JavaScript نفسه يستحوذ على خيط الرئيسي. فإذا استمرت حلقة تكرارية لمدة 400 مللي ثانية، فلن يتمكن React من العرض خلال تلك المدة. ولن يتمكن المتصفح من الرسم، ولن تتم معالجة المدخلات. ولا تعمل الجدولة إلا عندما يكون خيط متاحًا. تكمن المشكلة الأساسية في بنية النظام. إذ تتم عمليات حسابية وعرض مكثفة على نفس خيط، ويتنافسان على نفس الموارد. وعندما تتفوق العمليات الحسابية، تتأثر سرعة الاستجابة سلبًا.

تُستخدم تقنية Web Workers لحل هذا التباين. فهي تسمح بتشغيل العمليات التي تستهلك موارد المعالج بكثافة على خيط منفصل. فبدلاً من محاولة تحسين الحلقة أولاً، يمكن عزل هذه العمليات. وبدلاً من منافسة مُجدوِل خيط الرئيسي، يتم التخلص من هذه المنافسة.

Rendering stays responsive when heavy computation lives outside the main thread
Rendering stays responsive when heavy computation lives outside the main thread

يوضح الرسم التخطيطي أعلاه مسارين متوازيين. يحتوي مسار خيط الرئيسي على أحداث إدخال المستخدم، وعرض React ، ورسم الشاشة. أما مسار العامل فيحتوي على مهمة حسابية معقدة. يرسل سهم الرسائل بيانات إدخال إلى العامل، بينما يعيد سهم آخر النتائج المحسوبة. يبقى خيط الرئيسي حرًا لمعالجة النقرات وإعادة العرض أثناء تشغيل الحساب بالتوازي.

فصل الحساب عن العرض باستخدام عمال الويب

يقوم المتصفح بتشغيل React ومكوناتك على خيط الرئيسي. هذا خيط مسؤول عن:

  • معالجة إدخال المستخدم

  • تشغيل JavaScript

  • تنفيذ مرحلتي العرض والالتزام في React

  • رسم الشاشة

عندما تُنفَّذ دالة متزامنة طويلة الأمد على هذا خيط، لا يستطيع المتصفح التداخل بين العرض والتفاعل. حتى لو جدولت React التحديثات باستخدام الانتقالات، فإن وقت تشغيل JavaScript نفسه يكون متوقفًا. لهذا السبب، تبدو العمليات التي تستهلك موارد المعالج بكثافة أكثر كارثية من تأخيرات الشبكة. تأخيرات الشبكة غير متزامن، بينما حلقات المعالج ليست كذلك. توفر Web Workers سياق تنفيذ JavaScript منفصلًا يعمل على خيط آخر. يتم التواصل بين خيط الرئيسي والعامل من خلال تمرير الرسائل. هذا يُنشئ حدودًا معمارية واضحة: يتولى خيط الرئيسي العرض والتفاعل، بينما يتولى العامل الحساب.

النموذج الذهني بسيط:

  • عرض إحداثيات React .

  • يقوم العامل بإجراء عمليات حسابية معقدة.

  • الرسائل تربطهم.

مع ذلك، يُؤدي هذا الفصل إلى مفاضلات معمارية. لا يُمكن للعمال الوصول إلى DOM، ولا يُمكنهم مشاركة الحالة القابلة للتغيير مع خيط الرئيسي. يجب تسلسل ...