تحليل الحزمة واستراتيجية تقسيم التعليمات البرمجية
حلّل حجم الحزمة باستخدام rollup-plugin-visualizer وحدد استراتيجية لتقسيم التعليمات البرمجية حسب المسار.
تحليل الحزمة واستراتيجية تقسيم التعليمات البرمجية درس مجاني في React Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
لماذا يهم حجم الحزمة
تؤخر حزم JavaScript الكبيرة زمن التفاعل (Time To Interactive). يجب تنزيل كل كيلوبايت من JavaScript وتحليله وتنفيذه قبل أن تصبح الصفحة تفاعلية — خصوصاً على شبكات الهاتف المحمول البطيئة.
التحليل باستخدام rollup-plugin-visualizer
في مشاريع Vite، استخدم إضافة المرئيات لإنشاء مخطط شجري لحزمتك يوضح الوحدات التي تشغل أكبر مساحة.
// vite.config.ts
import { visualizer } from 'rollup-plugin-visualizer';
export default defineConfig({
plugins: [
visualizer({ open: true, gzipSize: true, brotliSize: true })
],
});
// After build, open the generated HTML file to explore the treemapمحلل حزم Next.js
استخدم @next/bundle-analyzer لتحليل حزم الخادم والعميل في Next.js.
npm install @next/bundle-analyzer
// next.config.js
const withBundleAnalyzer = require('@next/bundle-analyzer')({
enabled: process.env.ANALYZE === 'true',
});
module.exports = withBundleAnalyzer({});
// Run:
// ANALYZE=true npm run buildتقسيم الشيفرة حسب المسارات
أكثر أساليب التقسيم تأثيراً هو تحميل شيفرة كل مسار فقط عندما ينتقل المستخدم إليه. ينفذ React Router باستخدام lazy() وNext.js App Router ذلك تلقائياً.
// React Router v6 with lazy loading
import { lazy, Suspense } from 'react';
const Dashboard = lazy(() => import('./pages/Dashboard'));
const Settings = lazy(() => import('./pages/Settings'));
<Routes>
<Route path="/dashboard" element={<Suspense fallback={<Loading />}><Dashboard /></Suspense>} />
<Route path="/settings" element={<Suspense fallback={<Loading />}><Settings /></Suspense>} />
</Routes>تقسيم الشيفرة على مستوى المكوّنات
أجّل تحميل المكوّنات الثقيلة، مثل الخرائط والمخططات والمحررات، حتى الحاجة إليها باستخدام lazy().
const MonacoEditor = lazy(() => import('@monaco-editor/react'));
const MapView = lazy(() => import('./MapView'));
function ProductEditor({ showMap }) {
return (
<>
<Suspense fallback={<EditorSkeleton />}><MonacoEditor /></Suspense>
{showMap && <Suspense fallback={<MapSkeleton />}><MapView /></Suspense>}
</>
);
}الاستيراد الديناميكي للميزات المشروطة
استورد المكتبات الكبيرة فقط عند تفعيل إحدى الميزات لتجنب تحميلها لجميع المستخدمين.
async function exportToPDF() {
const { default: jsPDF } = await import('jspdf'); // ~300KB — loaded on demand
const doc = new jsPDF();
doc.text('Hello', 10, 10);
doc.save('export.pdf');
}إزالة الشيفرة غير المستخدمة
تزيل أدوات التجميع الحديثة الصادرات غير المستخدمة (الشيفرة الميتة). تأكد من أن تبعياتك تدعم ESM وليس CJS حتى تعمل إزالة الشيفرة غير المستخدمة، وتجنب استيراد مكتبات كاملة عندما تستخدم دالة واحدة فقط.
// Bad — imports entire lodash (~70KB):
import _ from 'lodash';
const result = _.debounce(fn, 300);
// Good — imports only debounce (<2KB):
import debounce from 'lodash/debounce';
// or with tree-shaking-friendly lodash-es:
import { debounce } from 'lodash-es';التحميل المسبق للحزم المهمة
استخدم <link rel='modulepreload'> أو تعليقات Webpack السحرية لتحميل حزمة الصفحة التالية مسبقاً أثناء وجود المستخدم في الصفحة الحالية.
// Webpack magic comment — preload on hover:
const Dashboard = lazy(() => import(/* webpackPrefetch: true */ './Dashboard'));
// or preload (higher priority):
const Dashboard = lazy(() => import(/* webpackPreload: true */ './Dashboard'));تحليل تأثير الجهات الخارجية
استخدم bundlephobia.com أو إضافة Import Cost في VS Code لمعرفة الحجم المضغوط بصيغة gzip لأي حزمة npm قبل تثبيتها.
تحديد ميزانية الحزمة
حدّد حداً للحجم لكل مسار في إعدادات Webpack أو Vite. يفشل البناء إذا تجاوزت إحدى الحزم الميزانية، ما يكشف التراجعات غير المقصودة في الحجم ضمن CI.
// vite.config.ts
build: {
rollupOptions: {
output: {
manualChunks: {
'vendor-react': ['react', 'react-dom'],
'vendor-router': ['react-router-dom'],
},
},
},
chunkSizeWarningLimit: 200, // warn at 200KB
},تحقق سريع
ما استراتيجية تقسيم الشيفرة الأكثر تأثيراً لتطبيقات React SPA التي تحتوي على صفحات كثيرة؟
مراجعة
حلّل الحزم باستخدام rollup-plugin-visualizer أو @next/bundle-analyzer. استخدم التقسيم حسب المسارات وعلى مستوى المكوّنات مع lazy(). طبّق إزالة الشيفرة غير المستخدمة باستيراد ما تحتاج إليه فقط. حدّد ميزانيات الحجم في CI، واستخدم تلميحات الجلب المسبق والتحميل المسبق للمسار التالي الأرجح.
الأسئلة الشائعة
هل درس «تحليل الحزمة واستراتيجية تقسيم التعليمات البرمجية» مجاني؟
نعم — نص درس «تحليل الحزمة واستراتيجية تقسيم التعليمات البرمجية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «تحليل الحزمة واستراتيجية تقسيم التعليمات البرمجية»؟
حلّل حجم الحزمة باستخدام rollup-plugin-visualizer وحدد استراتيجية لتقسيم التعليمات البرمجية حسب المسار. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «تحليل الحزمة واستراتيجية تقسيم التعليمات البرمجية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- قياس مؤشرات الويب الأساسية في تطبيقات React
- تحليل الحزمة واستراتيجية تقسيم التعليمات البرمجية
- تحسين الصور والخطوط في React
- تقليل INP: تحسين معالجات الأحداث