0Pricing
Frontend Academy · درس

تقسيم الشيفرة والمسارات الكسولة

استخدم dynamic import() لتقسيم الحزمة عند حدود المسارات، وحمّل مكوّنات React وVue عند الطلب، وراقب أحجام الأجزاء في مخرجات البناء.

تقسيم الشيفرة والمسارات الكسولة درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.

لماذا تقسيم الشيفرة؟

تجبر حزمة JavaScript الأحادية كل زائر على تنزيل كل سطر من شيفرة تطبيقك، حتى الميزات التي لن يستخدمها أبدًا. يقسم تقسيم الشيفرة الحزمة إلى أجزاء تُحمّل عند الطلب.

Dynamic import()

تعيد import('./module') كائن Promise يُحل إلى الوحدة. تكتشف أدوات التجميع (Vite وwebpack) ذلك، وتُصدر جزءًا منفصلًا يُحمّل في وقت التشغيل.

// Without split — entire heavy lib in main bundle:
import { generateChart } from 'heavy-chart-lib';

// With split — loaded only when needed:
button.addEventListener('click', async () => {
  const { generateChart } = await import('heavy-chart-lib');
  generateChart(data);
});

React.lazy() — التقسيم على مستوى المكوّن

ينشئ React.lazy(() => import('./Heavy')) مكوّنًا لا يحمّل شفرته إلا عند عرضه للمرة الأولى. أحِطْه بـ <Suspense> لعرض محتوى بديل أثناء التحميل.

import { lazy, Suspense } from 'react';

const Dashboard = lazy(() => import('./Dashboard'));

function App() {
  return (
    <Suspense fallback={<Spinner />}>
      <Dashboard />
    </Suspense>
  );
}

التقسيم حسب المسار في React Router

يحصل كل مسار على جزء خاص به؛ فلا ينزّل المستخدمون إلا الشفرة الخاصة بالصفحات التي يزورونها.

import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import { lazy, Suspense } from 'react';

const Home    = lazy(() => import('./pages/Home'));
const Profile = lazy(() => import('./pages/Profile'));
const Admin   = lazy(() => import('./pages/Admin'));

const router = createBrowserRouter([
  { path: '/',        element: <Suspense fallback={<Spinner/>}><Home /></Suspense> },
  { path: '/profile', element: <Suspense fallback={<Spinner/>}><Profile /></Suspense> },
  { path: '/admin',   element: <Suspense fallback={<Spinner/>}><Admin /></Suspense> }
]);

المكوّنات غير المتزامنة في Vue 3

يوفر Vue الدالة defineAsyncComponent لتطبيق النمط نفسه.

import { defineAsyncComponent } from 'vue';

const Dashboard = defineAsyncComponent(() =>
  import('./Dashboard.vue')
);

// Use in template like a normal component

المسارات الكسولة في Vue Router

يدعم Vue Router عمليات الاستيراد الديناميكية في تعريفات المسارات، فتُصدر أجزاء منفصلة لكل مسار.

const routes = [
  { path: '/',        component: () => import('./pages/Home.vue') },
  { path: '/profile', component: () => import('./pages/Profile.vue') },
  { path: '/admin',   component: () => import('./pages/Admin.vue') }
];

التعليقات السحرية في Webpack

حدّد تلميحات حول أسماء الأجزاء وسلوك التحميل المسبق من خلال «التعليقات السحرية» في webpack داخل عبارة الاستيراد.

const Profile = lazy(() =>
  import(/* webpackChunkName: "profile", webpackPrefetch: true */ './Profile')
);

// Vite supports a subset; @vite-ignore for special cases

Prefetch مقابل Preload

prefetch: تنزيل الجزء أثناء وقت الخمول، للتنقلات المحتملة التالية. preload: تنزيله الآن بأولوية عالية، للأجزاء الحرجة الخاصة بالمسار الحالي. استخدم prefetch عند تمرير المؤشر فوق رابط، وpreload للاحتياجات الوشيكة المعروفة.

محلل الحزم

استخدم rollup-plugin-visualizer (Vite) أو webpack-bundle-analyzer لعرض أحجام الأجزاء بصريًا. ابحث عن الأجزاء كبيرة الحجم، والتبعيات المكررة، والمكتبات التي نسيت إجراء tree-shaking لها.

// vite.config.ts
import { visualizer } from 'rollup-plugin-visualizer';

export default {
  plugins: [visualizer({ open: true, gzipSize: true })]
};

تقسيم جزء مكتبات الطرف الثالث

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

// vite.config.ts
export default {
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          react: ['react', 'react-dom'],
          ui: ['@radix-ui/react-dialog', '@radix-ui/react-tooltip']
        }
      }
    }
  }
};

متى لا ينبغي تقسيم الشيفرة

تضر الأجزاء الصغيرة جدًا (أقل من 20KB) أكثر مما تنفع؛ إذ يتجاوز حمل HTTP التوفير الناتج عن تصغير الحزمة. لا تقسّم كل مكوّن؛ بل قسّم عند حدود المسارات وحول الميزات الثقيلة فعلًا.

تحقق سريع

مع ماذا يجب إقران غلاف lazy() في React حتى يُعرض بشكل صحيح؟

مراجعة: تقسيم الشيفرة

ينشئ Dynamic import() أجزاء منفصلة. استخدم React.lazy مع Suspense لتقسيم المكوّنات. استخدم مكوّنات المسارات الكسولة في React Router أو Vue Router. استخدم prefetch للأجزاء المحتمل تحميلها لاحقًا، وpreload للأجزاء الحرجة. يكشف محلل الحزم الهدر. قسّم مكتبات vendor لتحسين قابليتها للتخزين المؤقت. وتجنب الأجزاء الصغيرة جدًا التي يقل حجمها عن 20KB.

الأسئلة الشائعة

هل درس «تقسيم الشيفرة والمسارات الكسولة» مجاني؟

نعم — نص درس «تقسيم الشيفرة والمسارات الكسولة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Frontend Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Frontend Academy 4 دروس في المجموع.

ماذا ستتعلم في «تقسيم الشيفرة والمسارات الكسولة»؟

استخدم dynamic import() لتقسيم الحزمة عند حدود المسارات، وحمّل مكوّنات React وVue عند الطلب، وراقب أحجام الأجزاء في مخرجات البناء. تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Frontend Academy؟

لا تُشترط خبرة سابقة. Frontend Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «تقسيم الشيفرة والمسارات الكسولة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Frontend Academy هذا؟

نعم. كل درس في Frontend Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مؤشرات أداء الويب الأساسية: LCP وFID وCLS
  2. عمليات تدقيق Lighthouse والتقييم
  3. تحسين الصور: التحميل الكسول والصيغ وWebP
  4. تقسيم الشيفرة والمسارات الكسولة
← العودة إلى Frontend Academy