عندما يتعلق الأمر بـ HTML5، يتحدث الناس عنه دائمًا. هناك العديد من الميزات وواجهات برمجة التطبيقات المثيرة للاهتمام والتي يتم تحديثها. ومع ذلك، لا تزال العديد من أحذية الأطفال في المرحلة الدلالية وتتجاهل قوة HTML5.
سنناقش في هذا القسم عامل الويب متعدد الخيوط.
1. وضح أن جافا سكريبت هي لغة مفردةالميزة الرئيسية للغة JavaScript هي أنها أحادية الخيط، مما يعني أنها لا تستطيع سوى القيام بشيء واحد في كل مرة.
قد يبدو الأمر غريبًا، لماذا لا يتم تصميمه بخيوط متعددة لتحسين الكفاءة؟ يمكننا أن نفترض السيناريو:
افترض أن JavaScript
يحتوي على خيطين في نفس الوقت، يضيف أحدهما المحتوى إلى عقدة DOM
معينة، بينما يحذف الخيط الآخر العقدة، في هذه الحالة، ما هو الخيط الذي يجب أن يستخدمه المتصفح؟
باعتبارها لغة برمجة للمتصفح، فإن الغرض الرئيسي من JavaScript
هو التفاعل مع المستخدمين ومعالجة DOM
.
يحدد هذا أنه لا يمكن أن يكون سوى خيط واحد، وإلا فإنه سوف يسبب مشاكل مزامنة معقدة للغاية. من أجل تجنب التعقيد، كانت JavaScript
ذات ترابط واحد منذ ولادتها، وقد أصبحت هذه سمة أساسية للغة ومن المتوقع أن يكون من الصعب تغييرها على المدى القصير.
لقد كان الترابط الفردي دائمًا نقطة ضعف من أجل الاستفادة من قوة الحوسبة CPU
المركزية متعددة النواة، يقترح HTML5
معيار Web Worker
، والذي يسمح لبرامج JavaScript
بإنشاء سلاسل رسائل متعددة. ومع ذلك، يتم التحكم في الخيط الفرعي بالكامل بواسطة الخيط الرئيسي ويجب ألا يقوم بتشغيل DOM
.
لذلك، لا يغير هذا المعيار الجديد طبيعة الترابط الفردي لـ JavaScript
.
Web Workers
هو حل JavaScript
متعدد الخيوط توفره المتصفحات الحديثة ويمكننا العثور على العديد من سيناريوهات الاستخدام:
1. يمكننا استخدام Web Worker
للقيام ببعض العمليات الحسابية المكثفة؛
2. يمكن تنفيذ الاقتراع ويمكن تغيير بعض الدول.
3. تحديث حالة رسالة الرأس، مثل الإشعار بعدد الرسائل في رأس الصفحة؛
4. تفاعل المستخدم عالي التردد، والتدقيق الإملائي، على سبيل المثال: مساعدة المستخدمين على إكمال وظائف تصحيح أخطاء الإدخال والتصحيح بناءً على عادات إدخال المستخدم والسجلات التاريخية وذاكرة التخزين المؤقت وغيرها من المعلومات
5. التشفير: قد يستغرق التشفير في بعض الأحيان وقتًا طويلاً جدًا، خاصة إذا كنت بحاجة إلى تشفير الكثير من البيانات بشكل متكرر (على سبيل المثال، تشفير البيانات قبل إرسالها إلى الخادم).
6. جلب البيانات مسبقًا: من أجل تحسين موقع الويب الخاص بك أو تطبيق الويب الخاص بك وتحسين وقت تحميل البيانات، يمكنك استخدام Workers
لتحميل بعض البيانات مقدمًا في حالة احتياجك إليها.
يعد التشفير سيناريو رائعًا لاستخدام Web Worker
لأنه لا يتطلب الوصول إلى DOM
أو أي سحر آخر، فهو يستخدم فقط الخوارزميات لإجراء العمليات الحسابية. نظرًا لأن الجمهور يولي اهتمامًا متزايدًا بالبيانات الشخصية الحساسة، فقد أصبح أمن المعلومات والتشفير على رأس الأولويات. يمكن أن ينعكس هذا من حادث تسرب بيانات المستخدم 12306 الأخير.
بمجرد إجراء الحساب في العامل، يصبح الأمر سلسًا بالنسبة للمستخدم ولا يؤثر على تجربة المستخدم.
3. التوافق 4. المفاهيم الأساسية1. تذكر أولاً أن تحكم على ما إذا كان مدعومًا أم لا
إذا (window.Worker) { ...}
2. من السهل إنشاء worker
جديد
const myWorker = new Worker('worker.js');
تعد طريقة postMessage () ومعالج الأحداث onmessage بمثابة السحر الأسود للعمال.
3. يستخدم postMessage
لإرسال الرسائل، ويستخدم onmessage
للاستماع إلى الرسائل.
const عامل = new Worker('src/worker.js');worker.onmessage = e => { console.log(e.data);};worker.postMessage('كيف حالك!');
عند استخدامهما في الموضوع الرئيسي، يجب تعليق onmessage
و postMessage()
على كائن worker
، ولكن هذا غير مطلوب عند استخدامهما في worker
. والسبب هو أنه داخل worker
، worker
هو النطاق العالمي فعليًا.
4. معالجة الاستثناءات:
Worker.onerror = function(error) { console.log(error.message);
5. إنهاء worker
عامل.إنهاء();
يتم قتل مؤشر الترابط worker
على الفور، دون أي فرصة له لإكمال عملياته أو تنظيفه.
6. في مؤشر ترابط worker
، يمكن workers
أيضًا استدعاء طريقة close
الخاصة بهم للإغلاق:
يغلق()؛5. بداية سريعة
من أجل فهم سريع، دعونا نفعل مثالا صغيرا: هيكل المشروع على النحو التالي
├──index.html└── src ├── main.js └── عامل.js
أتش تي أم أل
<html><head> <title>عرض عمل الويب</title> <meta charset=UTF-8 /></head><body> <div id=app> مرحبًا جارتو </div> <script src=src /main.js></script></body></html>
main.js
const عامل = new Worker('src/worker.js');worker.onmessage = e => { const message = e.data; console.log(`[من العامل]: ${message}`); ('app').innerHTML = message;};worker.postMessage('مكتوب بشكل جيد!');
Work.js
onmessage = e => { const message = e.data; console.log(`[من الرئيسي]: ${message}`); لدعمكم ');
الكود بسيط جدًا. يرسل الخيط الرئيسي: "إنه مكتوب بشكل جيد!"
تلقى عامل الويب الرسالة ووجد أن المحتوى يحتوي على كلمة "جيد" وأعادها إلى الموضوع الرئيسي: "شكرًا لك على دعمك".
6. القيود 1. داخل worker
، لا يمكن معالجة عقد DOM
مباشرة، ولا يمكن استخدام الأساليب والخصائص الافتراضية لكائن window
. ومع ذلك، يمكننا استخدام عدد كبير من الأشياء ضمن كائن window
، بما في ذلك آليات تخزين البيانات مثل WebSockets
و IndexedDB
Data Store API
الخاصة FireFox OS
.
هنا مثال، قمنا بتعديل main.js
:
const عامل = new Worker('src/worker.js');worker.onmessage = e => { const message = e.data; console.log(`[من العامل]: ${message}`); ('app').innerHTML = message;};+ عامل.onerror = وظيفة(خطأ) {+ console.log(خطأ);+ عامل.إنهاء();+ };worker.postMessage('مكتوب بشكل جيد!');
لنقم بتعديل work.js
مرة أخرى
+ تنبيه('jartto');onmessage = e => { const message = e.data; console.log(`[من الرئيسي]: ${message}`); if(message.indexOf('good') > - 1) { postMessage('شكرًا لك على دعمك' }};
في هذا الوقت، سيتم الإبلاغ عن:
وذلك لأن: السياق الذي يتم تنفيذ worker.js
فيه يختلف عن السياق الذي يتم فيه تنفيذ HTML
للصفحة الرئيسية. كائن المستوى الأعلى ليس Window
، وهو السياق العام لتنفيذ woker.js
، ولكنه WorkerGlobalScope
. دعونا نشرح بالتفصيل.
2. يتم نقل البيانات بين workers
والخيط الرئيسي من خلال آلية الرسائل هذه: يستخدم كلا الطرفين طريقة postMessage()
لإرسال رسائلهما الخاصة، ويستخدمان معالج حدث onmessage
للرد على الرسالة (يتم تضمين الرسالة في سمة data
لحدث Message
).
في هذه العملية، لا تتم مشاركة البيانات بل نسخها.
3. نفس قيود الأصل
يجب أن يكون لملف البرنامج النصي المخصص لمؤشر الترابط Worker
نفس أصل ملف البرنامج النصي لمؤشر الترابط الرئيسي.
4. قيود الملف
لا يستطيع مؤشر ترابط Worker
قراءة الملفات المحلية، أي أنه لا يمكنه فتح نظام الملفات المحلي (file://)
يجب أن يأتي البرنامج النصي الذي يقوم بتحميله من الخادم.
5. الملفات المحلية غير مسموح بها
خطأ أمني لم يتم اكتشافه: فشل في إنشاء عامل:
البرنامج النصي في "(المسار)/worker.js"
لا يمكن الوصول إليه من الأصل "فارغ".
لا يسمح لك Chrome بتحميل عمال الويب عند تشغيل البرامج النصية من ملف محلي.
فكيف حلها؟ يمكننا تشغيل خادم محلي. يوصى باستخدام http-server
، وهو بسيط وسهل الاستخدام.
6. سياسة أمان المحتوى
لدى worker
سياق التنفيذ الخاص به، والذي يختلف عن كائن document
الذي قام بإنشائه. لذا بشكل عام، worker
غير مقيد بسياسة أمان المحتوى الخاصة document
(أو worker
الأصلي ) الذي قام بإنشائه.
لنأخذ مثالاً، على افتراض أن document
يحتوي على إعلان الرأس التالي:
سياسة أمان المحتوى: script-src 'self'
جزء من الغرض من هذا الإعلان هو منع التعليمات البرمجية النصية الموجودة بداخله من استخدام طريقة eval()
. ومع ذلك، إذا قام البرنامج النصي بإنشاء worker
، فيمكن تنفيذ التعليمات البرمجية في سياق worker
باستخدام eval()
.
من أجل تحديد CSP للعامل، يجب إلحاق طلب إرسال رمز العامل نفسه بـ CSP.
الاستثناء الوحيد هو أنه إذا كان مصدر البرنامج النصي worker
عبارة عن معرف فريد عالمي (على سبيل المثال، يحدد URL
الخاص به مخطط بيانات أو blob
)، فسوف يرث worker
document
أو CSP
worker
الذي قام بإنشائه.
حول، يمكننا العثور على الوثائق على MDN
:
1. self
:
يمكننا استخدام الخاصية self
لـ WorkerGlobalScope
للحصول على مرجع للكائن نفسه.
2. location
:
تقوم سمة location
بإرجاع كائن WorkerLocation
المرتبط بمؤشر الترابط عند إنشائه، وهو يمثل عنوان URL
المطلق لمورد البرنامج النصي المستخدم لتهيئة مؤشر ترابط العامل. لن يتغير موقع مورد URL
هذا حتى إذا تمت إعادة توجيه الصفحة عدة مرات.
3. close
:
إغلاق الموضوع الحالي، على غرار terminate
.
4. caches
:
يحتوي السياق الحالي على CacheStorage
لضمان التوفر في وضع عدم الاتصال ويمكن تخصيص الاستجابة للطلب.
5. console
:
دعم بناء جملة console
.
6. importScripts
يمكننا تحميل وظائف المكتبة في worker
من خلال url
من خلال طريقة importScripts()
.
7. XMLHttpRequest
ومن خلاله يمكن تقديم طلبات Ajax
.
8. يمكنك استخدام:
هناك العديد API
التي يمكن استخدامها، لذلك لن أقدم أمثلة واحدة تلو الأخرى هنا.
عندما يواجه worker
خطأ قيد التشغيل، سيتم استدعاء معالج حدث onerror
الخاص به. سيتلقى حدثًا يسمى error
يعمل على توسيع واجهة ErrorEvent
. الحدث لا يتصاعد ويمكن إلغاؤه.
لمنع تشغيل الإجراء الافتراضي، يمكن للعامل استدعاء أسلوب منع الافتراضي () لحدث الخطأ.
نستخدم عادةً المعلومات الأساسية الثلاثة التالية لأحداث الخطأ:
Worker.onerror = function(error) { console.log(error.message);
ما ورد أعلاه هو المحتوى الكامل لهذه المقالة وآمل أن يكون مفيدًا لدراسة الجميع وآمل أيضًا أن يدعم الجميع شبكة VeVb Wulin.