divmagic Make design
SimpleNowLiveFunMatterSimple
CSS Performans Paradoksu: Daha Fazla CSS Göndermek Aslında GitHub'ı Nasıl Daha Hızlı Yaptı
Blogs›CSS performansı›CSS Performans Paradoksu: Daha Fazla CSS Göndermek Aslında GitHub'ı Nasıl Daha Hızlı Yaptı
CSS performansı

CSS Performans Paradoksu: Daha Fazla CSS Göndermek Aslında GitHub'ı Nasıl Daha Hızlı Yaptı

CSS Performans Paradoksu: Daha Fazla CSS Göndermek GitHub'ı Nasıl Daha Hızlı Yaptı

Yirmi yıl boyunca, ön uç performansının altın kuralı kutsal kabul edildi: daha az CSS gönderin. Kullanılmayan stilleri budamak için Tailwind gibi atomik CSS çerçevelerini benimsedik. Stil paketlerimizi titizlikle kod bölmelerine ayırdık. Kritik oluşturma yolundaki her gereksiz baytı kaldırmak için nesiller boyu takıntılı olduk.

Sonra GitHub'ın mühendislik ekibi, geleneksel bilgeliği altüst eden bir yazı yayınladı. Yeni stratejileri daha az CSS göndermek değil, daha fazlasını daha erken göndermekti. Sonuç, etkileşim metriklerinde %60'lık çarpıcı bir iyileşme oldu. Bu bir paradoks gibi geliyor. Ancak tarayıcının oluşturma hattını anladığınızda, stratejik zafer için taktiksel teslimiyet üzerine bir başyapıt.

GitHub'ın web performansındaki en kutsal kuralı neden çiğnediğini ve Tailwind yapılandırmasının her satırını mikro yönetmeden, aynı tekniği kullanarak kendi arayüzlerinizi inanılmaz derecede hızlı hissettirmeyi nasıl başarabileceğinizi inceleyelim.

Tam Zamanında CSS'nin Gizli Maliyeti

Modern ön uç yığını, aldatıcı derecede basit bir vaat üzerine inşa edilmiştir: kullanıcıya yalnızca ihtiyaç duyduğu şeyi, tam ihtiyaç duyduğu anda gönderin. JavaScript destekli çerçeveler, dinamik içe aktarmaları ve tembel yüklemeyi mükemmelleştirdi. Ancak CSS her zaman kaba bir araç olmuştur. Bir bileşen monte edildiğinde, etkileşimli hale gelmeden önce iki kritik şey gerçekleşmelidir:

  1. Stil Hesaplama: Tarayıcı, yeni DOM düğümlerine uygulanan her CSS kuralını çözümlemelidir.
  2. Düzen (Yeniden Akış): Etkilenen her öğenin geometrisi ve konumu yeniden hesaplanmalıdır.

Tarayıcının oluşturma motoru karmaşık bir durum makinesidir. Bir kullanıcı etkileşimi sırasında CSS enjekte etmek, JavaScript yürütmesi dışında bir tarayıcının gerçekleştirebileceği en pahalı işlem olan senkron bir stil yeniden hesaplamasını zorunlu kılar. Bu işi geciktirmek, tamamen önlemekten neredeyse her zaman daha iyidir.

CSS'yi dinamik olarak yüklediğinizde, belki de kendi stil sayfasını çeken tembel yüklenen bir bileşen aracılığıyla, tarayıcıyı bu pahalı işlemleri, kullanıcının anında yanıt beklediği anda gerçekleştirmeye zorluyorsunuz. Bu, Google'ın bir sayfanın yanıt verebilirliğini ölçmek için kullandığı Temel Web Verileri'nden biri olan Interaction to Next Paint (INP) değerine doğrudan zarar verir. Cezası teorik değil. GitHub, en çok kullanılan arayüzlerinden bazılarında, tamamen tembel yüklenen CSS nedeniyle yüzlerce milisaniyelik INP gerilemeleri ölçtü.

Düzen Sarsıntısını Anlamak

İşte bir kullanıcının kendi CSS paketi olan bir modalı tetikleyen bir düğmeye tıkladığında neler olduğunun basitleştirilmiş bir görselleştirmesi:

  1. Kullanıcı tıklar → JavaScript yürütülür ve modal DOM'u monte eder
  2. Tarayıcı yeni bir <link rel="stylesheet"> veya enjekte edilmiş <style>
  3. algılar
  4. Yeni kuralları dahil etmek için tüm CSS Nesne Modeli (CSSOM) yeniden oluşturulur
  5. Stil hesaplaması küresel olarak çalışır, yalnızca modalda değil, tarayıcı izolasyonu kanıtlayamazsa tüm belge ağacında
  6. Düzen çalışır, potansiyel olarak binlerce düğümün konumlarını yeniden hesaplar
  7. Boyama ve birleştirme nihayet gerçekleşir ve kullanıcıya modalı gösterir

3-5. adımlar senkron ve engelleyicidir. Tarayıcı bu iş tamamlanana kadar modalı gösteremez. Düşük kaliteli mobil cihazlarda bu, 200ms'yi kolayca aşabilir, bu da 'kötü' bir INP puanı eşiğidir.

GitHub'ın farkındalığı derindi: daha fazla CSS'yi önceden göndermenin ağ maliyeti, daha sonra enjekte etmenin oluşturma maliyetine kıyasla önemsizdi

. Eski sistemleri ilk yüklemede yaklaşık 8KB gzip kullanıyordu. Yeni sistem, tipik bir 4G bağlantısında ek 20ms olan yaklaşık 100KB daha fazla CSS gönderiyor, ancak etkileşimler sırasında 200-400ms oluşturma işi tasarrufu sağlıyor. Matematik acımasız ve tartışılmaz.

Bar chart comparing rendering pipeline timings: dynamic CSS injection incurs 300ms of style recalculation versus 20ms for pre-shipped global CSS.

Gizli Silah: CSS Kapsama

Körü körüne daha fazla CSS göndermek bir felaket olurdu. Binlerce kural içeren 150KB'lık bir stil sayfası gönderirseniz, bileşen durumu değişiklikleriyle tetiklenen küçük stil yeniden hesaplamaları bile onlarca milisaniye sürebilir. GitHub'ın stratejisinin anahtarı, büyük ölçüde az kullanılan bir CSS özelliğidir: contain

.

technology, computer, code, javascript, developer, programming, programmer, jquery, css, html, website, technology, technology, computer, code, code, code, code, code, javascript, javascript, javascript, developer, programming, programming, programming, programming, programmer, html, website, website, website

contain özelliği, tarayıcıya bir alt ağaç için düzen, stil ve boyama işinin kapsamının tam olarak ne olduğunu söyler. GitHub, büyük UI bölümlerini contain: layout style

ile işaretleyerek kendi belgeleri içinde aşılmaz izolasyon sınırları oluşturdu. Tarayıcı artık, kapsanan bir kenar çubuğu içindeki stilleri yeniden hesaplamanın ana içerik alanını asla etkilemeyeceğini ve bunun tersinin de geçerli olduğunu mutlak kesinlikle bilir.

Contain Özelliği Kopya Kağıdı

İşte her kapsama değerinin tarayıcıya ne garanti ettiğinin bir dökümü:
  • layout :
  • Bu öğenin iç düzeninin atalar veya kardeşler üzerinde sıfır etkisi vardır. Tarayıcı pahalı bir küresel yeniden akışı atlayabilir.
  • style :
  • Sayaçlar ve alıntılar bu alt ağaçtan kaçmaz. Daha da önemlisi, stil yeniden hesaplamasının patlama yarıçapını sınırlar.
  • paint :
  • Alt öğeler bu öğenin sınırları dışında görüntülenmez. Tarayıcı agresif bir şekilde kırpabilir ve diğer alanlar için boyamayı atlayabilir.
  • size :
  • Öğenin boyutu alt öğelerine bağlı değildir. Alt öğeler değişirse tarayıcı düzen geçişlerini tamamen atlayabilir.

contain: layout style kombinasyonu, GitHub'ın performans cezalarına maruz kalmadan 150KB'lık monolitik bir stil sayfası göndermesini sağladı. Stil yeniden hesaplamasının maliyeti artık etkileşimin gerçekleştiği kapsanan alt ağaçla sınırlıdır, tüm belgeyle değil, bu da her yeniden hesaplamayı yüzlerce kat daha ucuz hale getirir.

Bu zarif bir tersine çevirme yaratır. Tarayıcıya daha fazla

bildirimsel bilgi vererek, daha büyük bir küresel kural kümesiyle bile tüm sistemi daha verimli hale getirirsiniz. Bu, çöp toplayıcıya tüm yığını taramaya zorlamak yerine kesin nesne sahiplik grafikleri söylemekle aynı CSS karşılığıdır.

Uygulamaya Koymak: Bir React Örneği

Bu yeniden düzenlemenin tipik bir React uygulamasında nasıl işlediğini görelim. Yoğun şekilde stillendirilmiş bir kenar çubuğu, bir ana içerik alanı ve etkileşim üzerine açılan bir detay paneli olan bir pano hayal edin.

/* ÖNCE: Kapsama yok. Kenar çubuğundaki bir stil değişikliği 5000 DOM düğümünün küresel yeniden hesaplamasını zorlar */ .sidebar { width: 280px; background: var(--color-bg-secondary); }

.content { flex: 1; overflow-y: auto; }

/* SONRA: Sert kapsama, düzen ve stil çalışmasını kapsamlandırır */ .sidebar { width: 280px; background: var(--color-bg-secondary); contain: layout style; }

.content { flex: 1; overflow-y: auto; contain: layout style; }

[[PROTECTED_114]]React bileşeninde, kenar çubuğunun CSS modülünü dinamik olarak içe aktarmak isteyebilirsiniz. Kapsam öncesi dönem yaklaşımı, stilleri ve bileşenleri birlikte tembel yüklerdi:

// ANTI-PATTERN: Tembel CSS, INP artışlarına neden olur
const Sidebar = React.lazy(() => \{
  import('./Sidebar.module.css'); 
  return import('./Sidebar');
\});

Bunun yerine, CSS'i baştan itibaren global olarak gönderin. Tek bir giriş noktası stil sayfası veya statik bir dosyaya çıkarılan global bir CSS-in-JS yaklaşımı kullanın. Yalnızca JavaScript mantığını tembel yükleyin. CSS zaten ayrıştırılmış, önbelleğe alınmış ve en önemlisi, kapsam sınırlarının arkasına alınmıştır, bu nedenle tarayıcının işleme motoru beklenmedik bir iş yapmaz.

Ödünleşim açıktır: sayfanızın başlangıç stil sayfası daha büyüktür, ancak sonraki her etkileşimde INP puanlarınız düşer. GitHub'ın içgörüsünün özü budur.

Tüm "Daha Fazla CSS" Eşit Yaratılmamıştır

GitHub'ın yaklaşımı belirli bir kısıtlama nedeniyle işe yarar: uygulamaları, kullanıcı etkileşimlerinin daha önce global stil yeniden hesaplamasına neden olan DOM mutasyonlarını tetiklediği, CSS açısından zengin, devasa bir SPA'dır. Bu teknik, her öğeden display: none 'ı kaldırmak ve bir megabayt şişkinlik göndermek için genel bir onay değildir.

website, code, html, coding, programming, data, webpage, information, seo, site, web, computer, development, technology, internet, website, code, code, code, html, html, coding, coding, coding, coding, coding, programming, programming, seo, seo, seo, seo

Başarı için kritik koşullar şunlardır:

  • Sayfanız birden çok bağımsız UI paneli veya widget barındırıyor
  • Etkileşimler önemli DOM değişikliklerine neden oluyor (modal, panel, rota değişiklikleri)
  • Kapsama için net görsel ve işlevsel sınırlar belirleyebiliyorsunuz
  • CSS'iniz derleme adımında düzgün bir şekilde tree-shake edilmiş ve küçültülmüş

Çoğunlukla statik içeriğe sahip bir pazarlama sitesi veya belge oluşturuyorsanız, daha fazla CSS göndermek işe yaramaz çünkü ortadan kaldırılacak maliyetli etkileşim kaynaklı yeniden hesaplamalar yoktur. Ancak gösterge paneli ağırlıklı uygulamalar, yönetim panelleri ve işbirliği araçları için – ciddi web uygulamalarının temel dayanağı – bu bir oyun değiştiricidir.

Line chart showing a sharp drop in GitHub's INP scores after deploying CSS containment and global stylesheets.

DivMagic Bu Yeniden Düzenlemeyi Nasıl Hızlandırır

Böyle bir performans yeniden düzenlemesindeki gizli zaman kayıplarından biri, global olarak gönderilecek doğru CSS'i belirlemek ve çıkarmaktır. Geliştiriciler genellikle temiz izolasyon sınırları olmayan, dağınık, organik olarak büyümüş kod tabanlarını devralır. Kendinizi düzinelerce öğeyi incelerken, tam hesaplanmış stilleri ararken ve bir bileşenin ihtiyaç duyduğu kritik kural alt kümesini manuel olarak yeniden oluştururken bulursunuz.

Bir UI bölümünün ihtiyaç duyduğu CSS'i satır satır manuel olarak tersine mühendislik yapmak, bir kapsama stratejisi benimsemenin en büyük darboğazıdır. Bir saatlik mimari değişikliğini bir haftalık kazıya dönüştürür.

İşte bu noktada DivMagic gibi araçlar iş akışını temelden değiştirir. DivMagic, kendi hazırlık ortamınız da dahil olmak üzere herhangi bir web sitesindeki herhangi bir karmaşık UI'yi işaret etmenize ve o bileşenin kullandığı tam CSS kurallarını anında kopyalamanıza olanak tanır. 14 seviye özgüllük boyunca basamaklı stil çözümlemesini izlemek yerine, temiz, kopyalanabilir CSS olarak tam, hesaplanmış kural kümesini elde edersiniz.

Bir kapsama yeniden düzenlemesi için iş akışı şu hale gelir:

  1. Kenar çubuğunuzun, detay panelinizin veya widget'ınızın tam, hesaplanmış CSS'ini yakalamak için DivMagic'i kullanın.
  2. Bunu global paketinizdeki özel bir widget-panel.css dosyasına yapıştırın.
  3. Bu widget'ın kök öğesine contain: layout style ekleyin.
  4. Bileşeninizin tembel yükleme mantığından eski dinamik CSS içe aktarmasını kaldırın.
  5. Statik CSS'i gönderin. Karlı çıkın.

Bu, körü körüne gönderme korkusunu ortadan kaldırır. Global stil sayfanıza hangi kuralların girdiğini tam olarak bilirsiniz çünkü çıktıyı denetlemişsinizdir. Uzun süredir ölü bir özellikten gelen kullanılmayan seçiciler kritik CSS'inize girmez. Özgüllük savaşları yanlışlıkla iç içe geçmiş bir düğme stilini geçersiz kılmaz. Görsel testlerinizin size gösterdiği şeyi tam olarak gönderirsiniz.

Etkiyi Ölçmek: Lighthouse Skorunun Ötesinde

Yaygın bir hata, bu değişikliği dağıtmak ve yeşil bir Lighthouse skoruyla kutlamaktır. Lighthouse laboratuvar testleri, etkileşimle tetiklenen stil yeniden hesaplamasını kaldırmanın kümülatif faydasını genellikle yakalayamayan tek zaman noktası ölçümleridir. Saha verileriniölçmelisiniz.

website, web design, development, code, programming, marketing, office, business, agency, website, website, web design, web design, web design, web design, web design, agency

GitHub, CSS stratejilerini dağıttıktan sonra yalnızca yerel bir denetim yapmakla kalmadı, gerçek kullanıcı izleme (RUM) panolarını ve Chrome Kullanıcı Deneyimi Raporu'nu (CrUX) cerrahi bir hassasiyetle izledi. Hareket eden metrikler:

  • Sonraki Boyamaya Etkileşim (INP): Anahtar sayfalarda 250-300ms'den (iyileştirilmesi gerekiyor) 50-80ms'ye (iyi) düştü.
  • İlk Girdi Gecikmesi (FID): Pek hareket etmedi, çünkü FID, CSS'in engelleyebileceği tam etkileşim yaşam döngüsünü yakalamaz.
  • Stil Yeniden Hesaplama Çalışma Süresi (Chrome DevTools Performans Paneli): Etkileşim ağırlıklı izlemelerde %90'ın üzerinde azaldı.

Bu, modern web performansı için çok önemli bir ilkeyi pekiştiriyor: ilk yüklemeyi optimize etmek artık yeterli değildir. Kullanıcılar uygulamanızın hızını, tıklamalarına, dokunmalarına ve kaydırmalarına nasıl yanıt verdiğine göre değerlendirir. INP, sonunda bu gerçeği yakalayan metriktir ve CSS kapsamının doğrudan iyileştirdiği metriktir.

Horizontal bar chart showing that extracting precise component styles consumes the largest portion of a developer's performance optimization time.

Kendi Uygulamanızı Etkileşim Zamanlamalı CSS Sorunları İçin Denetleme

İşte GitHub'ın stratejisinin kendi çalışmanız için geçerli olup olmadığını görmek için bugün çalıştırabileceğiniz adım adım bir süreç:

1. Yavaş Simüle Edilmiş Bir Mobil Cihazda Performans İzlemesi Çalıştırın

Chrome DevTools'u açın, CPU kısıtlamasını "6x yavaşlatma" olarak ayarlayın ve kaydı başlatın. Birkaç önemli etkileşim gerçekleştirin: bir menü açma, bir modal tetikleme, sekmeler arasında gezinme. Kaydı durdurun ve alev grafiğinde uzun "Stili Yeniden Hesapla" görevlerini arayın.

2. Düzen Kayması Bölgeleri İçin "İşleme" Panelini Kontrol Edin

DevTools'ta "Düzen Kayması Bölgeleri"ni etkinleştirin ve etkileşiminiz sırasında neyin yanıp söndüğünü izleyin. Küçük bir menü açıldığında sayfanın geniş alanları yeniden düzenleniyorsa, kapsam eksikliğiniz var demektir.

3. Tembel Yüklenen CSS İçe Aktarmalarınızı Denetleyin

Kod tabanınızda CSS modülleri döndüren dinamik import() çağrılarını veya bileşen montajında <style> etiketleri enjekte eden desen kitaplıklarını arayın. Bunların her biri, global paket artı kapsama işlemi için bir adaydır.

4. Doğal Kapsama Sınırlarını Belirleyin

Bileşen ağacınızı yürüyün. Kenar çubuğunuz, ana içeriğiniz, başlığınız ve altbilginiz etrafında, hiçbir zaman görsel olarak örtüşmeyecek veya birbirlerinin iç geometrisine bağımlı olmayacak şekilde kutular çizebilir misiniz? Bu kutular contain: layout stylealmalıdır.

Bu Tekniğin Ne Zaman Kullanılmaması Gerektiği

Hiçbir performans tavsiyesi evrensel değildir. İşte GitHub'ın yaklaşımının ters tepebileceği senaryolar:

  • Gerçekten büyük, megabaytlarca stil sayfaları: CSS'iniz optimize edilmemiş temalar nedeniyle 1MB+ ise, önce şişkinliği düzeltin, ardından containment'i değerlendirin.
  • Tek bir devasa kaydırma kapsayıcısına sahip sayfalar: Ana içerik kaydırıcısına containment uygulamak, position: fixed ve yapışkan başlıkları bozabilir, eğer size containment değerine dikkat etmezseniz.
  • Çok az istemci tarafı etkileşimi olan sunucu tarafında oluşturulan uygulamalar: Maliyetli etkileşim kaynaklı DOM değişiklikleri yoksa, sadece bayt eklemiş olursunuz.

Containment bir neşterdir, balyoz değil. Uygulamanızın durum bilgisini barındıran panellere ve widget'lara cerrahi bir hassasiyetle uygulayın, tüm düzeninize contain: strictile bomba yağdırmayın.

Sonuç: En İyi Bayt, Diğer 1000 Baytın Çalışmasını Engelleyen Bayttır

GitHub'ın performans çalışması, sektörümüzün 'daha küçük her zaman daha iyidir' takıntısının bizi çalışma zamanının gerçek fiziğine karşı kör edebileceğini hatırlatıyor. 300 milisaniyelik bir stil yeniden hesaplamasını ortadan kaldıran bir kilobayt CSS bir vergi değil, zaman tasarrufunda %15,000 getirisi olan bir yatırımdır.

INP ve Core Web Vitals çağı, performansı bütünsel olarak, bir sayfanın tüm yaşam döngüsü boyunca düşünmemizi gerektiriyor. Bu ışıkta, daha fazla CSS göndermek sapkınlık değildir. Rasyonel, kanıta dayalı ve en önemlisi, uygulamaları kullanan insanlar için inanılmaz hızlı hissettiriyor.

Bir sonraki adımınız somut bir deney: kendi uygulamanızda yoğun kullanılan bir modal veya panel seçin. Tahmin yürütmeden size tam, hesaplanmış kural kümesini veren bir araç kullanarak CSS'sini çıkarın, DivMagic bunun için idealdir. Bu CSS'yi global paketinize taşıyın. Containment ekleyin. INP'yi ölçün. Tahmin ediyorum ki, GitHub'ın da bulduğu gibi, bazen en hızlı yol biraz daha fazla ağırlık taşımaktır.

DivMagic ile Oluşturmaya Bugün Başlayın

Herhangi bir web sitesinden kod kopyalayıp kendi projelerinde kullanmak için 10.000'den fazla geliştiriciye, tasarımcıya ve işletme sahibine katılın.

Get DivMagic for 42% off

Limited time deal for 22:45