divmagic Make design
SimpleNowLiveFunMatterSimple
شحن المزيد من CSS: كيف خفضت GitHub حجم الحزمة وعززت الأداء باستخدام التحميل التفضيلي
Blogs›أداء CSS›شحن المزيد من CSS: كيف خفضت GitHub حجم الحزمة وعززت الأداء باستخدام التحميل التفضيلي
أداء CSS

شحن المزيد من CSS: كيف خفضت GitHub حجم الحزمة وعززت الأداء باستخدام التحميل التفضيلي

التوتر بين تحميل ما يكفي من CSS لتصميم الصفحة بشكل صحيح والحفاظ على CSS خفيفًا بما يكفي للتقديم السريع هو معضلة كلاسيكية في الواجهة الأمامية. لسنوات، كانت أفضل الممارسة السائدة هي "تضمين النقدي فقط، وتأجيل الباقي". غالبًا ما كان هذا النمط يعني إنشاء CSS نقدي، وهي لقطة صغيرة مضبوطة يدويًا للأنماط التي تظهر فوق الطية يتم حقنها في <head>، بينما يتم تحميل ورقة الأنماط الرئيسية بشكل غير متزامن. ألقى فريق الهندسة في GitHub نظرة فاحصة على هذا النموذج وطرح سؤالًا غير بديهي: ماذا لو قمنا بشحن المزيد من CSS، وليس أقل، ولكن مع تحميلها باستراتيجية تتيح التقديم المتزامن؟

هذا المنشور يحلل البنية التقنية وراء إصلاح أداء موقع GitHub، وهو تحول قلل من أوراق الأنماط التي تمنع التقديم، وقلص حزم JavaScript، وحسن مقاييس المستخدم الحقيقي على نطاق عالمي. لمطوري الواجهة الأمامية الذين يتصارعون مع أنظمة التصميم المعقدة ومكتبات المكونات ومقاييس Core Web Vitals البطيئة، يقدم نمط تحميل CSS التفضيلي من GitHub بديلاً قويًا للعقيدة القديمة "التضمين أولاً".

38%
more CSS shipped per page load without increasing render-blocking resources

لماذا توقف "تقليل CSS" عن العمل لصالح GitHub

واجهة مستخدم GitHub هي نظام بيئي واسع من المستودعات والمشكلات وطلبات السحب والإجراءات وأدوات مراجعة الكود. يمكن لكل صفحة عرض مئات المكونات المميزة، ولكن ليس جميعها يظهر فورًا فوق الطية. النهج التقليدي، استخراج CSS النقدي، خلق عدة نقاط ألم:

  • النفقات العامة للصيانة: كل تغيير في المكون يتطلب إعادة معايرة مجموعة CSS النقدي. غالبًا ما كان أي تعديل في نظام التصميم يكسر اللقطة النقدية للمسار الحرج.
  • وميض المحتوى غير المصمم (FOUC): أثناء تحميل ورقة الأنماط غير المتزامنة، رأى المستخدمون تحولًا مزعجًا من تخطيطات بدائية مضمنة إلى الصفحة المصممة بالكامل.
  • الاعتماد على JavaScript: تعتمد أوراق الأنماط المؤجلة عادةً على JavaScript لتبديل الأنماط المحملة، مما يربط التقديم البصري بتنفيذ البرنامج النصي.
  • تعقيد البناء: تحتاج سلاسل الأدوات إلى تحليل HTML المقدم، واستخراج المحددات للعناصر التي تظهر فوق الطية، وحقنها في وقت البناء، وهو خط أنابيب هش.

أظهرت بيانات GitHub أن نمط التضمين النقدي لم يكن يتناسب مع سرعة نظام التصميم الخاص بهم. ومع ذلك، فإن التحميل الساذج تمامًا، بتسليم ورقة أنماط ضخمة واحدة، سيدمر Largest Contentful Paint (LCP). احتاج فريق الهندسة إلى طريق ثالث.

الابتكار الأساسي: التحميل التفضيلي بطبقات CSS

نفذ GitHub مفهومًا يسمى التحميل التفضيلي. يقسم CSS إلى نطاقات أولوية بناءً على احتمالية وتوقيت الحاجة البصرية:

typing, computer, man, workspace, work, workplace, desk, office, startup, businessman, technology, company, corporate, marketing, professional, internet, project, web, display, monitor, digital, electronic, modern, multimedia, typing, office, office, office, office, office, businessman, marketing, marketing, marketing, marketing, professional, internet, project, web

  1. الأوليات الأساسية: إعادة التعيين، الطباعة، رموز التباعد، مطلوبة فورًا لأي تقديم بصري.
  2. المكونات العامة: التنقل، التذييل، الشريط الجانبي، مرئية في كل صفحة تقريبًا ولكن غالبًا خارج الشاشة عند التحميل الأولي.
  3. الأنماط الخاصة بالصفحة: قوائم المهام، إبراز الفروق في الكود، سجلات الإجراءات، حاسمة لمسار معين ولكن غير ضرورية تمامًا في أماكن أخرى.
Loading StrategyInitial BytesRender BlockingFOUC Risk
Traditional Critical + Async~10-15 KB inlinePartial (inline only)High
One Massive Bundle~200+ KBFull blockNone
GitHub Preferential Loading~30-50 KB primitivesStratifiedVery Low

بنى الفريق آلية من جانب الخادم تحدد أي مجموعات وحدات CSS تحتاجها الصفحة حقًا. بدلاً من تقطيع CSS إلى تقسيم ثنائي نقدي/غير نقدي، يقومون بشحن ورقة أنماط أولية أساسية صغيرة كـ <link> متزامن وبث طبقات CSS إضافية بالتوازي، بدون الاعتماد على JavaScript لحل الحالة البصرية.

كيف تمكن طبقات تتابع CSS هذه الاستراتيجية

الممكن الرئيسي هو قاعدة CSS @layer at-rule. نظم GitHub أنماطهم في طبقات صريحة:

/* Core layer: minimal primitives */
@layer core {
  :root { /* design tokens */ }
  body { font-family: var(--font-stack); }
  .container { max-width: 1280px; }
}

/* Global layer: navigation and chrome */
@layer global {
  .AppHeader { /* ... */ }
  .SideNav { /* ... */ }
}

/* Component layer: page-specific elements */
@layer components {
  .diff-view { /* ... */ }
  .issue-timeline { /* ... */ }
}

من خلال وضع الأنماط المستقرة عالية الأولوية في طبقات أقل وبث طبقة المكونات بشكل غير متزامن، تمنع طبقات CSS حروب الخصوصية وتضمن أن الأنماط المحملة متأخرًا لا تلغي عن طريق الخطأ الأنماط السابقة. يمكن للمتصفح تقديم طبقات core و global فورًا بينما يتم بث بقية الصفحة، دون إعادة حساب التخطيط من الصفر.

Bar chart comparing three CSS loading strategies. GitHub's stratified approach delivers 38% more CSS overall but with significantly less render-blocking time than a single large bundle.

التقديم المتزامن مع أوراق الأنماط الطبقية

تحميل CSS غير المتزامن التقليدي بأدوات مثل <link rel="preload"> لا يزال يؤجل تطبيق ورقة الأنماط حتى تشغيل JavaScript. أزال GitHub هذا الاقتران بـ JS تمامًا باستخدام استعلامات media وحيل onload مقترنة ببث <link rel="stylesheet">.

إليك نسخة مبسطة من نمط التحميل الخاص بهم:

<!-- Synchronous core: paints immediately -->
<link rel="stylesheet" href="/css-dist/core-layer.css">

<!-- Print media trick: browser fetches, applies onload via media=all -->
<link rel="stylesheet" 
      href="/css-dist/global-layer.css" 
      media="print" 
      onload="this.media='all'">

<!-- Streamed from server: non-blocking, browser starts parsing early -->
<link rel="stylesheet" 
      href="/css-dist/components-layer.css" 
      media="(min-width: 0px)">

العلامة الأولى هي طلب قياسي يمنع التقديم للطبقة الأساسية الدنيا، صغيرة بما يكفي لتصل في رحلة ذهاب وإياب واحدة. الثانية تستخدم خدعة الوسائط print لجلب الطبقة العامة دون حظر التقديم، ثم تتحول إلى all بمجرد التحميل. العلامة الثالثة تطلب أنماط المكونات باستخدام استعلام وسائط يتم تقييمه دائمًا إلى صحيح؛ يجلبها المتصفح بأولوية منخفضة ولكن يطبقها بمجرد وصول البايتات. الأهم من ذلك، لا يتطلب أي من هذه JavaScriptلحل الحالة البصرية النهائية، معالج onload هو احتياطي تحسين تدريجي.

"انتقلنا من نموذج تقديم محكوم بـ JavaScript إلى نموذج بث CSS تصريحي. أصبح المتصفح هو منسق الجاهزية البصرية، وليس حزم JS الخاصة بنا." - هندسة GitHub

من تعقيد وقت البناء إلى الذكاء في وقت التشغيل

بدا خط أنابيب CSS النقدي القديم لـ GitHub كما يلي:

computer, laptop, tech, blue computer, blue laptop, blue tech, computer, laptop, tech, tech, tech, tech, tech

  1. يقوم الخادم بتقديم شجرة مكونات إلى HTML.
  2. تقوم خطوة معالجة لاحقة باجتياز DOM ومطابقة كل محدد مرئي مقابل ورقة الأنماط الكاملة.
  3. يتم استخراج القواعد المتطابقة وتضمينها، ويتم تأجيل باقي CSS.
  4. في وقت التشغيل، تقوم JavaScript بتبديل ورقة الأنماط المؤجلة، مما يسبب غالبًا إعادة تدفق.

أضافت كل خطوة زمن استجابة وتغيرًا. النموذج الجديد ينقل الذكاء إلىمحرك القالب من جانب الخادم. عندما يتم تقديم مسار، فإنه يعلن عن تبعيات CSS الخاصة به كواردات طبقة معيارية:

// On the server, for the pull-request view
const cssDeps = [
  { layer: 'core', path: 'core-layer.css' },
  { layer: 'global', path: 'global-layer.css', priority: 'low' },
  { layer: 'components', path: 'diff-views.css', priority: 'low' }
];

يقوم الخادم ببث هذه العلامات مباشرة إلى HTML <head>. لا استخراج في وقت البناء، ولا اجتياز DOM في وقت التشغيل. النتيجة: تسلسل تحميل أكثر قابلية للتنبؤ والتصحيح يعمل بشكل مماثل في بيئة التطوير والإنتاج.

45%
reduction in Time to Interactive (TTI) for pages with heavy JS-bootstrapped stylesheets

التحسين التدريجي دون هشاشة JavaScript

أحد أكبر المكاسب من فصل توصيل CSS عن JavaScript هو المرونة. إذا فشلت حزمة JS في التحليل بسبب خطأ أو خلل في الشبكة، فإن نمط التضمين النقدي يترك المستخدم بصفحة نصف مصممة. مع طبقات CSS الطبقية من GitHub، يستمر المتصفح في تطبيق مجموعات القواعد من علامات <link> المبثوثة بغض النظر عن حالة JS. هذا مهم بشكل خاص للجماهير العالمية حيث تختلف ظروف الشبكة بشكل كبير.

Line chart showing gradual improvement in LCP, FID, and CLS over four weeks after deploying preferential CSS loading. Largest gains are seen in LCP after the first week.

مقاييس العالم الحقيقي: ما تغير للمستخدمين

شارك فريق أداء GitHub بيانات مراقبة المستخدم الحقيقي (RUM) الإجمالية قبل وبعد نشر تحميل CSS التفضيلي. تركزت التحسينات على المقاييس المرتكزة على الطلاء:- أول محتوى مرئي (FCP): تم تقليله بمقدار 300 مللي ثانية للمستخدمين ذوي الاتصالات الأبطأ، نظرًا لأن الطبقة الأساسية تستبعد تعريفات الألوان والتخطيط غير الأساسية.

  • أكبر محتوى مرئي (LCP): تحسن بنسبة 15% عبر الشريحة المئوية الخامسة والسبعين، بفضل استقرار التخطيط المبكر. تضمن طبقات التسلسل (Cascade Layers) أن الكتلة المحتوية للعناوين أو أقسام البطل يتم رسمها قبل تدفق المكونات الفرعية.
  • تغير التخطيط التراكمي (CLS): تدهور شبه معدوم. نظرًا لأن رموز الطباعة الأساسية والتباعد موجودة في الطبقة الأساسية المتزامنة، فإن النصوص والحاويات لا تعيد التدفق أبدًا عند إضافة أنماط إضافية.
15%
improvement in 75th percentile Largest Contentful Paint across all pages

ماذا يعني هذا لاستراتيجية تحميل CSS الخاصة بك

نمط GitHub ليس صندوقًا أسود مملوكًا. يمكن لأي تطبيق ويب واسع النطاق اعتماد التحميل التفضيلي مع بعض التغييرات المعمارية:

coding, programming, css, software development, computer, close up, laptop, data, display, electronics, keyboard, screen, technology, app, program, software, computer engineering, coding, coding, coding, programming, programming, software development, computer, data, software, software, software, software, software

1. تدقيق CSS الخاص بك لتحديد نطاقات الأولوية

استخدم لوحات التغطية في أدوات المطورين في المتصفح، ولكن قم بتقسيم النتائج حسب الطبقة بدلاً من الصفحة. ما هي الأنماط العالمية حقًا؟ أي منها ينتمي إلى الواجهة الثابتة؟ أي منها خاص بمسار معين؟ إذا لم تتمكن من الإجابة بسرعة، فمن المحتمل أن نظام التصميم الخاص بك يحتاج إلى تنظيم طبقات.

2. اعتماد طبقات التسلسل للتحكم في الخصوصية

@layer reset, tokens, utilities, components;

قم بتعريف ترتيب الطبقات مرة واحدة. ضع أنماط المكونات المتدفقة في طبقة components بحيث لا يمكنها أبدًا تجاوز الرموز الأساسية، بغض النظر عن وقت وصولها.

3. نقل إعلانات تحميل CSS إلى قالب الخادم

بدلاً من ورقة أنماط متجانسة أو خريطة حزم Webpack، دع كل مسار يعلن عن تبعيات CSS الخاصة به. أطر العمل مثل Next.js مع مكونات خادم React أو Astro مع التحميل الجزئي تناسب هذا النموذج بشكل طبيعي.

4. قياس مقاييس الرسم، وليس فقط حجم البايت

ورقة أنماط أصغر تتطلب تطبيق JavaScript يمكن أن تؤدي إلى FCP أسوأ من ورقة أنماط أكبر قليلاً يتم تحميلها بشكل تصريحي. قم بتحليل الأداء باستخدام Web Vitals وراقب إعادة التخطيط بعد أحداث التحميل.

300ms
reduction in First Contentful Paint for users on 4G and below connections

متى لا تستخدم تحميل CSS الطبقي

لا توجد تقنية عالمية. التحميل التفضيلي مع طبقات التسلسل يضيف تعقيدًا معماريًا لا تحتاجه المواقع الصغيرة الثابتة. إذا كانت ورقة الأنماط الخاصة بك أقل من 10 كيلوبايت، فما عليك سوى تحميلها بشكل متزامن. إذا كنت تبني موقع توثيق مع تفاعل ضئيل، فإن إنشاء CSS حرجة عبر أدوات مثل "Critical" (بواسطة Addy Osmani) يظل كافيًا.

يتألق هذا النمط عندما:

  • يحتوي نظام التصميم الخاص بك على أكثر من 15000 سطر من CSS.
  • تساهم فرق متعددة بمكونات في نفس الصفحة.
  • يتطلب الجمهور العالمي أداءً قويًا على شبكات متغيرة.
  • تقوم بالفعل بتقديم الخادم ويمكنك التحكم في ترتيب علامات <head>.

DivMagic وثورة سير عمل CSS

يسلط نهج GitHub الضوء على تحول أوسع: مطورو الواجهة الأمامية يستعيدون السيطرة على توصيل CSS. ومع ذلك، فإن فهم واستخراج CSS عالي الجودة من التطبيقات الحية غالبًا ما يظل عملية يدوية تستغرق وقتًا طويلاً. عند تحليل كيفية تنظيم منافس أو موقع مرجعي لطبقاته، يلجأ المطورون عادةً إلى أدوات المطورين في المتصفح، والنسخ واللصق اليدوي، والتنظيف الممل.

يغير DivMagic هذه المعادلة. كإضافة متصفح مصممة خصيصًا للمطورين، يلتقط DivMagic أي عنصر واجهة مستخدم من أي موقع ويب ويحوله إلى CSS وHTML نظيفين وقابلين لإعادة الاستخدام، مع الحفاظ على التخطيط والطباعة ورموز التصميم. بالنسبة للفرق التي تتبنى استراتيجيات التحميل التفضيلي، يسرع DivMagic مرحلة البحث والنماذج الأولية. بدلاً من فحص كيفية تنظيم GitHub أو قادة الأداء الآخرين لطبقات CSS يدويًا، يمكنك التقاط مكون، وإسقاطه في قاعدة التعليمات البرمجية الخاصة بك، وفهم خيارات الطبقة والخصوصية على الفور.

"أسرع CSS هو CSS الذي لا تضطر إلى كتابته من الصفر. يتيح DivMagic للمطورين التركيز على الهندسة المعمارية، وليس الاستخراج."

سواء كنت تبني نظام تصميم بتوجيهات @layer أو تدقق في قاعدة تعليمات برمجية قديمة بحثًا عن اختناقات الأداء، يسد DivMagic الفجوة بين الإلهام والتنفيذ.

Pie chart illustrating that 60% of developer time during UI research is spent on manual extraction and rewriting, while only 25% goes toward genuine architectural design, highlighting the value of tools like DivMagic.

الخلاصة: المزيد من CSS، أداء أفضل

منشور مدونة GitHub الهندسي هو درس متقن في التشكيك في أفضل الممارسات الراسخة. من خلال شحن 38% أكثر من CSS ولكن تقسيمها إلى طبقات باستخدام طبقات التسلسل والتحميل التصريحي، قلل الفريق من حظر العرض، وقلل من تبعيات JavaScript، وحسن بشكل ملحوظ مقاييس الرسم الحقيقية للمستخدم. الدرس لمطوري الواجهة الأمامية ليس "CSS مجاني"، بل أن خط أنابيب عرض المتصفح محسن للأصول التصريحية المتدفقة. عندما نترك المنصة تقوم بعملها، فإننا نشحن واجهات مستخدم أكثر ثراءً دون التضحية بالسرعة.

للمطورين المستعدين لاستكشاف التحميل التفضيلي في مشاريعهم الخاصة، ابدأ صغيرًا: حدد رموز التصميم العالمية الخاصة بك، وضعها في طبقة أساسية متزامنة، وقم بتدفق الباقي. وعندما تحتاج إلى التحرك بشكل أسرع من المرجع البصري إلى CSS جاهز للإنتاج، تضمن أدوات مثل DivMagic أنك تقضي وقتًا أقل في الاستخراج ووقتًا أطول في هندسة الأداء.

ابدأ الإنشاء باستخدام DivMagic اليوم

انضم إلى أكثر من 10000 من المطورين والمصممين وأصحاب الأعمال لنسخ التعليمات البرمجية من أي موقع ويب واستخدامها في مشاريعهم الخاصة.

Get DivMagic for 42% off

Limited time deal for 22:45