Büyük DOM boyutlarının etkileşimi ne ölçüde etkilediği ve bu konuda neler yapılabileceği

Büyük DOM boyutları, etkileşimi sandığınızdan daha fazla etkiler. Bu rehberde, bu durumun nedeni ve neler yapabileceğiniz açıklanmaktadır.

Web sayfası oluşturduğunuzda bu sayfanın Belge Nesne Modeli (DOM) olacağı kesindir. DOM, sayfanızın HTML yapısını temsil eder ve JavaScript ile CSS'nin sayfanın yapısına ve içeriğine erişmesini sağlar.

Ancak sorun, DOM'un boyutunun tarayıcının bir sayfayı hızlı ve verimli şekilde oluşturma yeteneğini etkilemesidir. Genel olarak, bir DOM ne kadar büyükse o sayfanın ilk oluşturulması ve daha sonra sayfa yaşam döngüsünde oluşturmanın güncellenmesi o kadar maliyetli olur.

Bu durum, DOM'u değiştiren veya güncelleyen etkileşimlerin, sayfanın hızlı yanıt verme özelliğini etkileyen pahalı bir düzen çalışmasını tetiklediği çok büyük DOM'lara sahip sayfalarda sorunlu hale gelir. Maliyetli düzen çalışması, sayfanın Sonraki Boyamayla Etkileşim (INP) değerini etkileyebilir. Sayfanın kullanıcı etkileşimlerine hızlı yanıt vermesini istiyorsanız DOM boyutlarınızın yalnızca gerektiği kadar büyük olduğundan emin olmanız önemlidir.

Bir sayfanın DOM'u ne zaman çok büyük olur?

Lighthouse'a göre, bir sayfanın DOM boyutu 1.400 düğümü aştığında aşırı büyük olur. Lighthouse, bir sayfanın DOM'u 800 düğümü aştığında uyarı vermeye başlar. Örneğin, aşağıdaki HTML'yi ele alalım:

<ul>
  <li>List item one.</li>
  <li>List item two.</li>
  <li>List item three.</li>
</ul>

Yukarıdaki kodda dört DOM öğesi vardır: <ul> öğesi ve üç <li> alt öğesi. Web sayfanızda neredeyse kesinlikle bundan çok daha fazla düğüm olacaktır. Bu nedenle, bir sayfanın DOM'unu olabildiğince küçülttükten sonra oluşturma işlemini optimize etmek için kullanabileceğiniz diğer stratejilerin yanı sıra DOM boyutlarını kontrol altında tutmak için neler yapabileceğinizi anlamanız önemlidir.

Büyük DOM'lar sayfa performansını nasıl etkiler?

Büyük DOM'lar, sayfa performansını birkaç şekilde etkiler:

  1. Sayfanın ilk oluşturma işlemi sırasında. Bir sayfaya CSS uygulandığında, DOM'a benzer bir yapı olan CSS Nesne Modeli (CSSOM) oluşturulur. CSS seçiciler özelleştikçe CSSOM daha karmaşık hale gelir ve web sayfasını ekrana çizmek için gereken düzen, stil, birleştirme ve boyama işlemlerini çalıştırmak daha fazla zaman alır. Bu ek çalışma, sayfa yükleme sırasında erken gerçekleşen etkileşimlerin etkileşim gecikmesini artırır.
  2. Etkileşimler, DOM'u öğe ekleme veya silme yoluyla ya da DOM içeriklerini ve stillerini değiştirerek değiştirdiğinde bu güncellemenin oluşturulması için gereken çalışma çok maliyetli düzen, stil, birleştirme ve boyama çalışmasına neden olabilir. Sayfanın ilk oluşturulmasında olduğu gibi, CSS seçici özgüllüğündeki artış, bir etkileşim sonucunda HTML öğeleri DOM'a eklendiğinde oluşturma işine katkıda bulunabilir.
  3. JavaScript, DOM'a sorgu gönderdiğinde DOM öğelerine yapılan referanslar bellekte depolanır. Örneğin, bir sayfadaki tüm <div> öğelerini seçmek için document.querySelectorAll işlevini çağırırsanız sonuç çok sayıda DOM öğesi döndürdüğünde bellek maliyeti önemli ölçüde artabilir.
Chrome Geliştirici Araçları&#39;nın performans panelinde aşırı oluşturma çalışmasından kaynaklanan uzun bir görevin ekran görüntüsü. Uzun görevin çağrı yığını, sayfa stillerinin yeniden hesaplanması ve ön boyama için önemli ölçüde zaman harcandığını gösteriyor.
Chrome Geliştirici Araçları'ndaki performans profil oluşturucuda gösterilen uzun bir görev. Gösterilen uzun görev, JavaScript aracılığıyla DOM öğelerinin büyük bir DOM'a eklenmesinden kaynaklanmaktadır.

Bunların tümü etkileşimi etkileyebilir ancak yukarıdaki listede ikinci sırada yer alan öğe özellikle önemlidir. Bir etkileşim DOM'da değişikliğe neden olursa sayfada kötü bir INP'ye katkıda bulunabilecek çok fazla iş başlatabilir.

DOM boyutunu nasıl ölçerim?

DOM boyutunu birkaç şekilde ölçebilirsiniz. İlk yöntemde Lighthouse kullanılır. Denetim gerçekleştirdiğinizde, mevcut sayfanın DOM'uyla ilgili istatistikler "Teşhis" başlığı altındaki "Aşırı büyük bir DOM boyutundan kaçının" denetiminde yer alır. Bu bölümde, toplam DOM öğesi sayısını, en fazla alt öğe içeren DOM öğesini ve en derin DOM öğesini görebilirsiniz.

Daha basit bir yöntem, herhangi bir büyük tarayıcıdaki geliştirici araçlarında JavaScript konsolunu kullanmayı içerir. DOM'daki toplam HTML öğesi sayısını almak için sayfa yüklendikten sonra konsolda aşağıdaki kodu kullanabilirsiniz:

document.querySelectorAll('*').length;

DOM boyutunun gerçek zamanlı olarak güncellendiğini görmek istiyorsanız performans izleme aracını da kullanabilirsiniz. Bu aracı kullanarak, düzen ve stil işlemleriyle (diğer performans unsurlarıyla birlikte) mevcut DOM boyutunu ilişkilendirebilirsiniz.

Chrome Geliştirici Araçları&#39;ndaki performans izleyicinin ekran görüntüsü. Solda, sayfanın kullanım süresi boyunca sürekli olarak izlenebilecek çeşitli sayfa performansı unsurları yer alır. Ekran görüntüsünde, DOM düğümlerinin sayısı, saniye başına düzen sayısı ve bölüm başına stil yeniden hesaplama sayısı etkin bir şekilde izleniyor.
Chrome Geliştirici Araçları'ndaki performans monitörü. Bu görünümde, sayfanın mevcut DOM düğümü sayısı, saniyede gerçekleştirilen düzen işlemleri ve stil yeniden hesaplamalarıyla birlikte grafik olarak gösterilir.

DOM'un boyutu, Lighthouse DOM boyutu uyarı eşiğine yaklaşıyorsa veya eşiği tamamen aşıyorsa bir sonraki adım, sayfanızın kullanıcı etkileşimlerine yanıt verme özelliğini iyileştirmek için DOM'un boyutunu nasıl küçülteceğinizi bulmaktır. Böylece web sitenizin INP'si iyileşebilir.

Bir etkileşimden etkilenen DOM öğelerinin sayısını nasıl ölçebilirim?

Laboratuvarda, sayfanın DOM'unun boyutuyla ilgili olabileceğinden şüphelendiğiniz yavaş bir etkileşimin profilini oluşturuyorsanız profildeki "Stili Yeniden Hesapla" etiketli herhangi bir etkinliği seçerek kaç DOM öğesinin etkilendiğini öğrenebilir ve alt paneldeki bağlamsal verileri inceleyebilirsiniz.

Chrome Geliştirici Araçları&#39;nın performans panelinde seçilen stil yeniden hesaplama etkinliğinin ekran görüntüsü. En üstteki etkileşim izinde bir tıklama etkileşimi gösteriliyor ve işin büyük bir kısmı stil yeniden hesaplama ve ön boyama işiyle geçiyor. En altta, seçilen etkinlikle ilgili daha fazla ayrıntı gösteren bir panel bulunur. Bu panelde, 2.547 DOM öğesinin etkilendiği bildirilir.
Stil yeniden hesaplama çalışması sonucunda DOM'da etkilenen öğelerin sayısını gözlemleme. Etkileşimler parçasındaki etkileşimin gölgeli kısmının, etkileşim süresinin 200 milisaniyeden uzun olan kısmını temsil ettiğini unutmayın. Bu süre, INP için belirlenen "iyi" eşiğidir.

Yukarıdaki ekran görüntüsünde, seçildiğinde çalışmanın stilinin yeniden hesaplanmasının etkilenen öğelerin sayısını gösterdiğini görebilirsiniz. Yukarıdaki ekran görüntüsünde, DOM boyutunun çok sayıda DOM öğesi içeren bir sayfada oluşturma çalışması üzerindeki etkisinin uç bir örneği gösterilse de bu teşhis bilgileri, DOM boyutunun bir etkileşime yanıt olarak bir sonraki karenin boyanmasının ne kadar süreceğini sınırlayan bir faktör olup olmadığını belirlemek için her durumda yararlıdır.

DOM boyutunu nasıl küçültebilirim?

DOM boyutunu azaltmanın temel yolu, web sitenizin HTML'sinde gereksiz işaretleme olup olmadığını denetlemenin yanı sıra DOM derinliğini azaltmaktır. DOM'unuzun gereksiz yere derin olabileceğine dair bir işaret, tarayıcınızın geliştirici araçlarının Öğeler sekmesinde şu şekilde bir işaretleme görmenizdir:

<div>
  <div>
    <div>
      <div>
        <!-- Contents -->
      </div>
    </div>
  </div>
</div>

Bu tür kalıplar gördüğünüzde, DOM yapınızı düzleştirerek bunları basitleştirebilirsiniz. Bu şekilde, DOM öğelerinin sayısı azalır ve sayfa stillerini basitleştirme fırsatı elde edersiniz.

DOM derinliği, kullandığınız çerçevelerin bir belirtisi de olabilir. Özellikle JSX'e dayalı olanlar gibi bileşen tabanlı çerçeveler, birden fazla bileşeni bir üst kapsayıcıya yerleştirmenizi gerektirir.

Ancak birçok çerçeve, parçalar olarak bilinenleri kullanarak bileşenleri iç içe yerleştirmekten kaçınmanıza olanak tanır. Parçaları özellik olarak sunan bileşen tabanlı çerçeveler aşağıdakileri içerir ancak bunlarla sınırlı değildir:

Seçtiğiniz çerçevede parçalar kullanarak DOM derinliğini azaltabilirsiniz. DOM yapısını düzleştirmenin stil oluşturma üzerindeki etkisinden endişeleniyorsanız flexbox veya grid gibi daha modern (ve daha hızlı) düzen modlarını kullanmaktan yararlanabilirsiniz.

Değerlendirilebilecek diğer stratejiler

DOM ağacınızı düzleştirmek ve DOM'unuzu mümkün olduğunca küçük tutmak için gereksiz HTML öğelerini kaldırmak için çok çaba harcasanız bile, DOM yine de oldukça büyük olabilir ve kullanıcı etkileşimlerine yanıt olarak değiştiği için çok fazla oluşturma çalışması başlatabilir. Bu durumda, oluşturma çalışmasını sınırlamak için göz önünde bulundurabileceğiniz başka stratejiler de vardır.

Toplama yaklaşımını değerlendirin

Sayfanızın büyük bir bölümü, ilk oluşturulduğunda kullanıcıya görünmeyebilir. Bu, başlangıçta DOM'un bu kısımlarını atlayarak HTML'yi geç yüklemek için bir fırsat olabilir. Ancak kullanıcı, sayfanın başlangıçta gizli olan kısımlarını gerektiren bölümleriyle etkileşime girdiğinde bu kısımları ekleyebilirsiniz.

Bu yaklaşım, hem ilk yükleme sırasında hem de sonrasında faydalıdır. İlk sayfa yüklemesinde, başlangıçta daha az oluşturma işlemi yaparsınız. Bu da ilk HTML yükünüzün daha hafif olacağı ve daha hızlı oluşturulacağı anlamına gelir. Bu sayede, söz konusu kritik dönemdeki etkileşimler, ana iş parçacığının dikkati için daha az rekabetle çalışabilir.

Sayfanın yüklenirken başlangıçta gizlenen birçok bölümü varsa yeniden oluşturma işlemini tetikleyen diğer etkileşimleri de hızlandırabilir. Ancak diğer etkileşimler DOM'a daha fazla şey ekledikçe, sayfa yaşam döngüsü boyunca DOM büyüdüğünden oluşturma çalışması da artar.

Zaman içinde DOM'a ekleme yapmak zor olabilir ve bunun kendi dezavantajları vardır. Bu yolu izliyorsanız kullanıcı etkileşimine yanıt olarak sayfaya eklemeyi planladığınız HTML'yi dolduracak verileri almak için ağ istekleri gönderiyor olabilirsiniz. Devam eden ağ istekleri INP'ye dahil edilmese de algılanan gecikmeyi artırabilir. Mümkünse kullanıcıların bir şeylerin olduğunu anlaması için yükleme animasyonu veya verilerin getirildiğini gösteren başka bir gösterge gösterin.

CSS seçici karmaşıklığını sınırlayın

Tarayıcı, CSS'nizdeki seçicileri ayrıştırırken bu seçicilerin geçerli düzene nasıl ve uygulanıp uygulanmadığını anlamak için DOM ağacını geçmek zorundadır. Bu seçiciler ne kadar karmaşıksa tarayıcının hem sayfanın ilk oluşturma işlemini gerçekleştirmek hem de sayfa bir etkileşim sonucunda değişirse stilin yeniden hesaplanması ve düzenleme işlemleri için o kadar çok çalışması gerekir.

content-visibility özelliğini kullanma

CSS, ekran dışındaki DOM öğelerini geç işleme almak için etkili bir yöntem olan content-visibility özelliğini sunar. Öğeler, görüntü alanına yaklaştıkça isteğe bağlı olarak oluşturulur. content-visibility, yalnızca ilk sayfa oluşturma işleminde önemli miktarda oluşturma çalışmasını ortadan kaldırmakla kalmaz, aynı zamanda sayfa DOM'u bir kullanıcı etkileşimi sonucunda değiştiğinde ekran dışı öğeler için oluşturma çalışmasını da atlar.

Sonuç

DOM boyutunuzu yalnızca kesinlikle gerekli olan öğelerle sınırlamak, web sitenizin INP'sini optimize etmenin iyi bir yoludur. Bunu yaparak DOM güncellendiğinde tarayıcının düzen ve oluşturma işlemlerini gerçekleştirmesi için gereken süreyi azaltabilirsiniz. DOM boyutunu anlamlı bir şekilde küçültemeseniz bile, oluşturma işlemini bir DOM alt ağacında izole etmek için kullanabileceğiniz bazı teknikler vardır. Örneğin, CSS kapsama ve content-visibility CSS özelliği.

Nasıl yaparsanız yapın, oluşturma çalışmasının en aza indirildiği bir ortam oluşturmak ve sayfanızın etkileşimlere yanıt olarak yaptığı oluşturma çalışmasının miktarını azaltmak, web sitenizin kullanıcılarla etkileşim kurarken daha hızlı yanıt vermesini sağlar. Bu, web sitenizin etkileşimle ilişkili gecikme süresinin daha düşük olacağı ve daha iyi bir kullanıcı deneyimi sunacağı anlamına gelir.