divmagic Make design
SimpleNowLiveFunMatterSimple
अधिक CSS शिप करना: कैसे GitHub ने बंडल साइज़ घटाया और प्राथमिकता लोडिंग के साथ प्रदर्शन बढ़ाया
Blogs›सीएसएस प्रदर्शन›अधिक CSS शिप करना: कैसे GitHub ने बंडल साइज़ घटाया और प्राथमिकता लोडिंग के साथ प्रदर्शन बढ़ाया
सीएसएस प्रदर्शन

अधिक CSS शिप करना: कैसे GitHub ने बंडल साइज़ घटाया और प्राथमिकता लोडिंग के साथ प्रदर्शन बढ़ाया

पर्याप्त CSS लोड करने, जो पृष्ठ को सही ढंग से स्टाइल करे, और उस CSS को तेज़ रेंडरिंग के लिए पर्याप्त हल्का रखने के बीच का तनाव एक क्लासिक फ्रंट-एंड दुविधा है। वर्षों तक, प्रमुख सर्वोत्तम अभ्यास था "केवल क्रिटिकल को इनलाइन करें, बाकी को विलंबित करें।" उस पैटर्न का अर्थ अक्सर क्रिटिकल CSS उत्पन्न करना होता था, जो <head> में इंजेक्ट की गई ऊपर-द-फोल्ड शैलियों का एक छोटा, मैन्युअल रूप से ट्यून किया गया स्नैपशॉट होता था, जबकि मुख्य स्टाइलशीट एसिंक्रोनस रूप से लोड होती थी। GitHub की इंजीनियरिंग टीम ने इस मॉडल को गंभीरता से देखा और एक प्रतिसहज प्रश्न पूछा: क्या होगा अगर हम कम CSS नहीं, बल्कि अधिक CSS भेजें, लेकिन इसे एक ऐसी रणनीति के साथ लोड करें जो समवर्ती रेंडरिंग को अनलॉक करे?

यह पोस्ट GitHub की साइट प्रदर्शन ओवरहाल के पीछे की तकनीकी वास्तुकला को विस्तार से बताती है, एक बदलाव जिसने रेंडर-ब्लॉकिंग स्टाइलशीट को कम किया, जावास्क्रिप्ट बंडलों को छोटा किया, और वैश्विक स्तर पर वास्तविक-उपयोगकर्ता मीट्रिक्स में सुधार किया। जटिल डिज़ाइन सिस्टम, कंपोनेंट लाइब्रेरी और सुस्त कोर वेब वाइटल्स से जूझ रहे फ्रंट-एंड डेवलपर्स के लिए, GitHub का प्राथमिकता CSS लोडिंग पैटर्न पुराने "इनलाइन-फर्स्ट" सिद्धांत का एक शक्तिशाली विकल्प प्रदान करता है।

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

क्यों "कम CSS" GitHub के लिए काम करना बंद कर दिया

GitHub का UI रिपॉजिटरी, इश्यू, पुल रिक्वेस्ट, एक्शन और कोड रिव्यू टूल का एक विशाल पारिस्थितिकी तंत्र है। प्रत्येक पृष्ठ सैकड़ों अलग-अलग कंपोनेंट्स को रेंडर कर सकता है, लेकिन उनमें से सभी तुरंत ऊपर-द-फोल्ड दिखाई नहीं देते। पारंपरिक दृष्टिकोण, क्रिटिकल CSS निकालना, कई दर्द बिंदु पैदा करता था:

  • रखरखाव ओवरहेड: प्रत्येक कंपोनेंट बदलाव के लिए क्रिटिकल CSS सेट के पुन: अंशांकन की आवश्यकता होती थी। एक डिज़ाइन-सिस्टम ट्वीक अक्सर क्रिटिकल-पथ स्नैपशॉट को तोड़ देता था।
  • बिना स्टाइल वाली सामग्री का फ्लैश (FOUC): जब एसिंक स्टाइलशीट लोड हो रही थी, उपयोगकर्ताओं को आदिम, इनलाइन-स्टाइल वाले लेआउट से पूरी तरह से डिज़ाइन किए गए पृष्ठ पर एक अचानक बदलाव दिखाई देता था।
  • जावास्क्रिप्ट निर्भरता: विलंबित स्टाइलशीट आमतौर पर लोड की गई शैलियों को स्वैप करने के लिए जावास्क्रिप्ट पर निर्भर करती हैं, जिससे दृश्य रेंडरिंग स्क्रिप्ट निष्पादन से जुड़ जाती है।
  • बिल्ड जटिलता: टूलचेन को रेंडर किए गए HTML को पार्स करना, ऊपर-द-फोल्ड तत्वों के लिए सेलेक्टर निकालना, और उन्हें बिल्ड समय पर इंजेक्ट करना आवश्यक था, जो एक नाजुक पाइपलाइन थी।

GitHub के डेटा ने दिखाया कि इनलाइन-क्रिटिकल पैटर्न उनके डिज़ाइन सिस्टम की गति के साथ स्केल नहीं कर रहा था। फिर भी पूरी तरह से भोला लोडिंग, एक विशाल स्टाइलशीट वितरित करना, सबसे बड़ी सामग्री पेंट (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 लेयर्स को समानांतर में स्ट्रीम करते हैं, बिना दृश्य स्थिति को हल करने के लिए जावास्क्रिप्ट पर निर्भर हुए।

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.

स्तरीकृत स्टाइलशीट के साथ समवर्ती रेंडरिंग

<link rel="preload"> जैसे टूल के साथ पारंपरिक एसिंक CSS लोडिंग अभी भी जावास्क्रिप्ट चलने तक स्टाइलशीट आवेदन को विलंबित करती है। GitHub ने media क्वेरी और onload ट्रिक्स को <link rel="stylesheet"> स्ट्रीमिंग के साथ जोड़कर उस JS युग्मन को पूरी तरह से समाप्त कर दिया।

यहाँ उनके लोडिंग पैटर्न का एक सरलीकृत संस्करण है:

<!-- 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 पर स्वैप करता है। तीसरा टैग एक मीडिया क्वेरी का उपयोग करके कंपोनेंट शैलियों का अनुरोध करता है जो हमेशा सत्य का मूल्यांकन करती है; ब्राउज़र इसे कम प्राथमिकता के साथ लाता है लेकिन बाइट्स आते ही इसे लागू करता है। महत्वपूर्ण रूप से, इनमें से किसी को भी अंतिम दृश्य स्थिति को हल करने के लिए जावास्क्रिप्ट की आवश्यकता नहीं है, onload हैंडलर एक प्रगतिशील वृद्धि फॉलबैक है।

"हम जावास्क्रिप्ट-गेटेड रेंडरिंग मॉडल से एक घोषणात्मक CSS स्ट्रीमिंग मॉडल में चले गए। ब्राउज़र दृश्य तत्परता का ऑर्केस्ट्रेटर बन गया, हमारे JS बंडल नहीं।" - GitHub इंजीनियरिंग

बिल्ड-टाइम जटिलता से रनटाइम बुद्धिमत्ता तक

GitHub की पुरानी क्रिटिकल CSS पाइपलाइन इस तरह दिखती थी:

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

  1. सर्वर एक कंपोनेंट ट्री को HTML में रेंडर करता है।
  2. एक पोस्ट-प्रोसेसिंग चरण DOM पर चलता है और पूर्ण स्टाइलशीट के विरुद्ध प्रत्येक दृश्य सेलेक्टर का मिलान करता है।
  3. मिलान किए गए नियम निकाले जाते हैं, इनलाइन किए जाते हैं, और बाकी CSS विलंबित हो जाती है।
  4. रनटाइम पर, जावास्क्रिप्ट विलंबित स्टाइलशीट को स्वैप करता है, जिससे अक्सर रीफ्लो होता है।

प्रत्येक चरण विलंबता और परिवर्तनशीलता जोड़ता था। नया मॉडल बुद्धिमत्ता को सर्वर-साइड टेम्पलेट इंजनमें स्थानांतरित करता है। जब कोई रूट रेंडर होता है, तो यह अपनी 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

जावास्क्रिप्ट नाजुकता के बिना प्रगतिशील वृद्धि

CSS वितरण को जावास्क्रिप्ट से अलग करने का सबसे बड़ा लाभ लचीलापन है। यदि कोई JS बंडल किसी त्रुटि या नेटवर्क हिचकी के कारण पार्स करने में विफल रहता है, तो इनलाइन-क्रिटिकल पैटर्न उपयोगकर्ता को आधे-स्टाइल वाले पृष्ठ के साथ छोड़ देता है। GitHub की स्तरीकृत CSS लेयर्स के साथ, ब्राउज़र JS स्थिति की परवाह किए बिना स्ट्रीम किए गए <link> टैग से नियम सेट लागू करना जारी रखता है। यह वैश्विक दर्शकों के लिए विशेष रूप से महत्वपूर्ण है जहां नेटवर्क स्थितियाँ व्यापक रूप से भिन्न होती हैं।

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 की प्रदर्शन टीम ने प्राथमिकता CSS लोडिंग तैनात करने से पहले और बाद में एकत्रित वास्तविक उपयोगकर्ता निगरानी (RUM) डेटा साझा किया। सुधार पेंट-केंद्रित मीट्रिक्स पर केंद्रित थे:-प्रथम सामग्री पेंट (FCP): धीमे कनेक्शन वाले उपयोगकर्ताओं के लिए 300ms कम हुआ, क्योंकि कोर लेयर में गैर-आवश्यक रंग और लेआउट परिभाषाएँ शामिल नहीं हैं। -सबसे बड़ी सामग्री पेंट (LCP): 75वें प्रतिशतक में 15% सुधार हुआ, जो पहले लेआउट स्थिरता के कारण संभव हुआ। कैस्केड लेयर्स यह सुनिश्चित करती हैं कि हेडर या हीरो सेक्शन के लिए कंटेनिंग ब्लॉक को चाइल्ड कंपोनेंट्स के स्ट्रीम होने से पहले पेंट किया जाए। -संचयी लेआउट शिफ्ट (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 का ऑडिट करें

ब्राउज़र DevTools कवरेज पैनल का उपयोग करें, लेकिन परिणामों को पेज के बजाय लेयर के अनुसार विभाजित करें। कौन सी स्टाइल वास्तव में सार्वभौमिक हैं? कौन सी स्थायी क्रोम से संबंधित हैं? कौन सी रूट-विशिष्ट हैं? यदि आप इसका तुरंत उत्तर नहीं दे सकते, तो आपके डिज़ाइन सिस्टम को संभवतः लेयर स्वच्छता की आवश्यकता है।

2. विशिष्टता नियंत्रण के लिए कैस्केड लेयर्स अपनाएँ

@layer reset, tokens, utilities, components;

अपने लेयर ऑर्डर को एक बार घोषित करें। स्ट्रीम किए गए कंपोनेंट स्टाइल को components लेयर में रखें ताकि वे कभी भी बेस टोकन को ओवरराइड न कर सकें, चाहे वे कभी भी आएँ।

3. CSS लोडिंग घोषणाओं को सर्वर टेम्पलेट में ले जाएँ

एक मोनोलिथिक स्टाइलशीट या Webpack चंक मैप के बजाय, प्रत्येक रूट को अपनी CSS निर्भरताएँ घोषित करने दें। React सर्वर कंपोनेंट्स के साथ Next.js या आंशिक हाइड्रेशन के साथ Astro जैसे फ्रेमवर्क इस मॉडल में स्वाभाविक रूप से फिट होते हैं।

4. केवल बाइट आकार नहीं, बल्कि पेंट मीट्रिक मापें

एक छोटी स्टाइलशीट जिसमें JavaScript एप्लिकेशन की आवश्यकता होती है, वह थोड़ी बड़ी, घोषणात्मक रूप से लोड की गई स्टाइलशीट की तुलना में खराब FCP का कारण बन सकती है। Web Vitals के साथ प्रोफाइल करें और onload इवेंट के बाद री-लेआउट पर नज़र रखें।

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

स्तरीकृत CSS लोडिंग का उपयोग कब न करें

कोई भी तकनीक सार्वभौमिक नहीं है। कैस्केड लेयर्स के साथ प्रेफरेंशियल लोडिंग आर्किटेक्चरल जटिलता जोड़ती है जिसकी छोटी, स्थिर साइटों को आवश्यकता नहीं होती। यदि आपकी पूरी स्टाइलशीट 10KB से कम है, तो इसे सिंक्रोनस लोड करें। यदि आप न्यूनतम इंटरैक्टिविटी वाली एक दस्तावेज़ीकरण साइट बना रहे हैं, तो "Critical" (Addy Osmani द्वारा) जैसे टूल के माध्यम से क्रिटिकल CSS उत्पन्न करना पर्याप्त है।

यह पैटर्न तब चमकता है जब:

  • आपके डिज़ाइन सिस्टम में 15,000+ लाइनें CSS हों।
  • कई टीमें एक ही पेज पर कंपोनेंट्स का योगदान करती हों।
  • वैश्विक दर्शकों को परिवर्तनीय नेटवर्क पर मजबूत प्रदर्शन की आवश्यकता हो।
  • आप पहले से ही सर्वर-रेंडरिंग कर रहे हों और <head> टैग ऑर्डर को नियंत्रित कर सकते हों।

DivMagic और CSS वर्कफ़्लो क्रांति

GitHub का दृष्टिकोण एक व्यापक बदलाव को उजागर करता है: फ्रंटएंड डेवलपर्स CSS डिलीवरी पर नियंत्रण वापस ले रहे हैं। हालाँकि, लाइव एप्लिकेशन से उच्च-गुणवत्ता वाले CSS को समझना और निकालना अक्सर एक समय लेने वाली मैन्युअल प्रक्रिया बनी रहती है। जब यह विश्लेषण किया जाता है कि कोई प्रतियोगी या संदर्भ साइट अपनी लेयर्स कैसे संरचित करती है, तो डेवलपर्स आमतौर पर ब्राउज़र DevTools, मैन्युअल कॉपी-पेस्ट और थकाऊ सफाई का सहारा लेते हैं।

DivMagic इस गणना को बदल देता है। डेवलपर्स के लिए विशेष रूप से बनाए गए ब्राउज़र एक्सटेंशन के रूप में, DivMagic किसी भी वेबसाइट से किसी भी UI तत्व को कैप्चर करता है और उसे स्वच्छ, पुन: प्रयोज्य 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 मुफ़्त है", बल्कि यह है कि ब्राउज़र का रेंडरिंग पाइपलाइन घोषणात्मक, स्ट्रीम किए गए एसेट्स के लिए अनुकूलित है। जब हम प्लेटफ़ॉर्म को अपना काम करने देते हैं, तो हम गति का त्याग किए बिना समृद्ध UI भेजते हैं।

डेवलपर्स के लिए जो अपनी परियोजनाओं में प्रेफरेंशियल लोडिंग का पता लगाने के लिए तैयार हैं, छोटे से शुरू करें: अपने सार्वभौमिक डिज़ाइन टोकन की पहचान करें, उन्हें एक सिंक्रोनस कोर लेयर में रखें, और बाकी को स्ट्रीम करें। और जब आपको दृश्य संदर्भ से उत्पादन-तैयार CSS तक तेज़ी से जाने की आवश्यकता हो, तो DivMagic जैसे टूल सुनिश्चित करते हैं कि आप निष्कर्षण पर कम और प्रदर्शन इंजीनियरिंग पर अधिक समय बिताएँ।

DivMagic के साथ आज ही निर्माण शुरू करें

किसी भी वेबसाइट से कोड कॉपी करने और अपने स्वयं के प्रोजेक्ट में इसका उपयोग करने के लिए 10,000+ डेवलपर्स, डिजाइनरों और व्यवसाय मालिकों से जुड़ें।

Get DivMagic for 42% off

Limited time deal for 22:45