كيف تعمل معالجة الملفات محلياً داخل المتصفح
إذا لم يُرفع أي شيء، فمن الذي ينجز العمل فعلاً، وأين؟
ما معنى «محلي» هنا
المحوّل الإلكتروني التقليدي موقع ويب فيه نقطة رفع. يُنقل ملفك إلى جهاز لا تتحكم فيه، ويُعالَج هناك، ويُخزَّن مدةً ما، ثم يُعاد إليك للتنزيل. أما المعالجة المحلية فتحذف منتصف تلك الجملة: الشيفرة التي تقرأ ملفك تعمل داخل تبويب المتصفح المفتوح أمامك، على معالجك أنت، وتُكتب النتيجة عائدةً إلى قرصك أنت.
ولا يزال الموقع نفسه يُجلب عبر الشبكة — إذ تصل صفحات HTML وأوراق الأنماط والنصوص البرمجية ووحدات WebAssembly كلها من خادم، مثل أي صفحة ويب. والفرق هو في الاتجاه: شيفرة البرنامج تنزل، وملفك أنت لا يصعد.
المتصفح يحتوي القطع أصلاً
| الميزة | ما توفّره |
|---|---|
| واجهتا File و Blob | قراءة بايتات ملف اختاره المستخدم أو أفلته، دون إرسال نموذج |
| Web Workers | تنفيذ العمل الثقيل على خيط خلفي كي تبقى الواجهة مستجيبة |
| WebAssembly | تشغيل مكتبات ترميز مكتوبة بلغات C أو C++ أو Rust بسرعة قريبة من السرعة الأصلية |
| Canvas و OffscreenCanvas | فك ترميز الصور ورسمها وتغيير مقاسها وإعادة ترميزها |
| WebCodecs | الوصول إلى مُرمِّزات ومفكّكات الفيديو المسرَّعة عتادياً في المتصفح نفسه |
| WebGPU | تشغيل استدلال النماذج والعمل المتوازي على البكسلات عبر معالج الرسوميات |
| File System Access | كتابة النتيجة مباشرة في موقع يختاره المستخدم، حيثما كان مدعوماً |
لا شيء من هذا غريب. إنها المنصّة نفسها التي تشغّل الجداول الحسابية وأدوات التصميم والألعاب داخل تبويب. والقرار غير المعتاد الوحيد هو رفض إضافة خادم إليها.
المسار الذي يسلكه الملف
- تختار ملفاً. فيسلّم المتصفح الصفحة مقبضاً إليه — لا نسخة منه، بل مرجعاً.
- تقرأ الصفحة البايتات الأولى لتحديد نوع الملف الحقيقي من بصمته، بدل الوثوق بالامتداد.
- تقدّر مقدار الذاكرة التي تحتاجها المهمة، وترفض العمل أو تضعه في طابور إذا تجاوز ما يستطيع الجهاز توفيره بأمان.
- تُنقل البايتات إلى Web Worker. ونقل ArrayBuffer ينقل الملكية بدل النسخ، فلا يوجد الملف الكبير مرتين في الذاكرة.
- وداخل العامل، يتولى مرمّز WebAssembly أو واجهة من واجهات المنصّة فك الترميز والترميز الفعليين.
- تعود النتيجة على هيئة بايتات، وتُغلَّف في Blob، ثم تُعرض عليك للتنزيل أو تُكتب في موقع تختاره.
- يُبطل الرابط المؤقت لذلك الـ Blob وتُحرَّر الذواكر المؤقتة.
لماذا كان WebAssembly هو الجزء الذي غيّر المعادلة
مرمّزات الصور والفيديو هي حصيلة عقود من شيفرة C المحسَّنة بعناية. وإعادة كتابتها بلغة JavaScript لم تكن يوماً خياراً واقعياً. أما WebAssembly فهو صيغة تعليمات ثنائية محمولة تنفّذها المتصفحات داخل صندوق رملي بسرعة قريبة من الشيفرة الأصلية، ما يعني أن تلك المكتبات القائمة يمكن ترجمتها وشحنها إلى المتصفح كما هي.
والصندوق الرملي لا يقل أهمية عن السرعة. فوحدة WebAssembly لا تملك وصولاً تلقائياً إلى نظام ملفاتك ولا إلى شبكتك ولا إلى تبويباتك الأخرى. إنها ترى الذاكرة التي تسلّمها الصفحة إياها ولا شيء سواها. ولا يستطيع مرمّز خبيث، أو حتى مرمّز معطوب فحسب، أن يشرد ويقرأ شيئاً لم يُعطَ له.
ما الذي يمرّ عبر الشبكة، ولماذا ليس ملفك منه
ثلاثة أشياء تصل عبر الشبكة: الصفحة نفسها، ومحرّك الأداة التي فتحتها، وأوزان النموذج في حالة إزالة الخلفية. وهذه الثلاثة كلها ملفات ثابتة تخص FileSlimmer وحده، وتُجلب من مصدر FileSlimmer نفسه قبل أن تُقرأ أي بايتة من بايتاتك. إنها تنزيلات قابلة للتخزين المؤقت، وبعد الاستخدام الأول يمكن تقديمها من ذاكرة المتصفح المؤقتة دون أي اتصال بالشبكة إطلاقاً.
وكل ما يلي تلك النقطة محلي. فالمحرّكات لا تتلقى بايتات الملفات إلا عبر postMessage من الصفحة؛ ولا يُعطى أي منها رابطاً يرسل إليه شيئاً، كما تقيّد سياسة أمان المحتوى الوجهات التي يمكن للصفحة الاتصال بها حتى لو حاولت شيفرة ما ذلك.
المفاضلات، بصراحة
| الاعتبار | في متصفحك | على خادم |
|---|---|---|
| إلى أين يذهب ملفك | لا مكان | إلى جهاز لا تتحكم فيه |
| السرعة | بقدر ما يستطيع جهازك | بقدر ما دفع مشغّل الخدمة |
| الملفات الضخمة جداً | مقيّدة بذاكرة المتصفح | مقيّدة بحدود مشغّل الخدمة |
| العمل دون اتصال | نعم، بعد تخزين المحرّك مؤقتاً | لا |
| الصيغ النادرة | فقط ما يمكن ترجمته إلى WebAssembly | أي شيء يثبّته مشغّل الخدمة |
| دفعة من ألف ملف | محدودة بإمكانات الجهاز | أنسب لها عادةً |
المعالجة المحلية ليست أفضل في كل الحالات. إنها أفضل حين يكون الملف خاصاً، وحين يكون الجهاز قادراً، وحين يتّسع العمل في الذاكرة. والخادم أفضل حين تحتاج إلى معالجة أكثر بكثير مما يستوعبه جهاز واحد. والوضوح بشأن أي الحالتين أنت فيها أنفع من الإصرار على أن أحد النهجين ينتصر في كل مكان.
ما الذي لا يدّعيه هذا الكلام
هذا بيان عمّا يفعله هذا التطبيق. وليس ادّعاءً بشأن إضافات متصفحك، التي تستطيع قراءة محتوى أي صفحة تفتحها، ولا بشأن نظام تشغيلك، الذي يستطيع فحص أي ملف تلمسه، ولا بشأن مشغّل شبكتك، الذي يستطيع أن يرى أنك زرت موقعاً ما. فهذه كلها خارج متناول أي موقع ويب، وأي أداة تخبرك بغير ذلك تبالغ في وصف نفسها.
أما الادّعاء فضيّق وقابل للتحقق: الملفات التي تختارها تُعالَج محلياً في هذا المتصفح ولا يرفعها FileSlimmer. والدليل التالي يشرح كيف تتحقق من ذلك بنفسك بدل أن تصدّقه.
أدوات لهذا الغرض
المصادر
- W3C — File API
- W3C — WebAssembly Core Specification
- WHATWG — HTML Standard, Web Workers
- W3C — WebCodecs