مستوى المقال: متوسط. الكلام ده موجّه لمطوّر يكتب JavaScript ويستخدم import/export، وعمل قبل كده build بأداة زي Vite أو webpack. لو لسه مبتدئ، في كل قسم تشبيه بسيط قبل الشرح التقني.
تقسيم الكود في JavaScript: حمّل أقل وافتح موقعك أسرع
لو موقعك بيحمّل ملف JavaScript حجمه أكتر من ميجابايت، والمستخدم بيبصّ في شاشة شبه فاضية 4 أو 5 ثواني — المشكلة غالبًا مش في السيرفر ولا في النت. المشكلة إنك بتبعت للمتصفح كل كود التطبيق دفعة واحدة، وهو محتاج جزء صغير منه علشان يعرض أول صفحة. تقسيم الكود (Code Splitting) بيحل ده، وفي حالة عملية وصل بأول تحميل من 1.83 ميجابايت لـ 210 كيلوبايت.
المشكلة باختصار
أغلب أدوات الـ build بتجمّع كل ملفاتك في bundle واحد. لوحة التحكم، صفحة التقارير، محرّر النصوص، مكتبة الرسوم البيانية — كله بيتحمّل أول ما المستخدم يفتح الموقع، حتى لو راح للصفحة الرئيسية وبس. النتيجة: المتصفح بيقف يحمّل ويفسّر كود مش محتاجه دلوقتي، وزمن التفاعل بيطول.
ليه الـ bundle الواحد بيوقّف موقعك
تخيّل إنك طلبت كوباية مياه في مطعم. بدل ما النادل يجيبهالك على طول، بيستنى لحد ما يجهّز كل أطباق المنيو الـ 80 ويجيبهم على ترابيزتك مرة واحدة. انت محتاج حاجة واحدة، بس بتدفع وقت تجهيز الـ 80. ده بالظبط اللي بيحصل مع الـ bundle الواحد: المتصفح لازم ينزّل ويقرأ كل الكود قبل ما الصفحة تبقى قابلة للاستخدام.
تقنيًا، الـ JavaScript بيتنفّذ على الـ main thread — نفس الـ thread المسؤول عن رسم الصفحة والاستجابة للنقر. كل كيلوبايت JavaScript زيادة معناه وقت أطول في الـ parsing والـ compilation والـ execution على الـ main thread. والنتيجة تأخير في «زمن التفاعل» (Time to Interactive): اللحظة اللي الصفحة تبقى فيها مستجيبة فعلاً، مش بس ظاهرة على الشاشة.
الحل: قسّم الكود لأجزاء تتحمّل عند الطلب
ارجع لمثال المطعم. الطريقة الصح: النادل يجيبلك الكوباية على طول، وباقي الأطباق تتجهّز لما حد يطلبها فعلاً. تقسيم الكود بيعمل نفس الفكرة مع موقعك.
Code Splitting هو تقسيم الـ bundle الواحد لعدة ملفات منفصلة اسمها chunks، كل واحد بيتحمّل وقت الحاجة ليه بس. أداة الـ build بتقطع الكود عند كل نقطة import() ديناميكي وبتعمل chunk مستقل. أفضل طريقة عملية للبداية: قسّم على مستوى المسارات (routes) — كل صفحة في chunk لوحدها.
- حدّد المسارات التقيلة اللي مش بتظهر أول لحظة: التقارير، الإعدادات، المحرّر.
- استبدل الـ import العادي بـ import ديناميكي عن طريق
React.lazy(أوdefineAsyncComponentفي Vue). - لفّ المكوّنات الكسولة بـ
<Suspense>وحدّد عنصر تحميل مؤقت (fallback). - اعمل build وقِس أحجام الـ chunks الناتجة.