Alandaki yavaş etkileşimleri bulma

Web sitenizin alan verilerindeki yavaş etkileşimleri nasıl bulacağınızı öğrenerek Interaction to Next Paint metriğini iyileştirme fırsatlarını keşfedebilirsiniz.

Saha verileri, gerçek kullanıcıların web sitenizi nasıl deneyimlediğini gösteren verilerdir. Yalnızca laboratuvar verilerinde bulamayacağınız sorunları ortaya çıkarır. Interaction to Next Paint (INP) söz konusu olduğunda, alan verileri yavaş etkileşimleri belirlemek için gereklidir ve bunları düzeltmenize yardımcı olacak önemli ipuçları sağlar.

Bu kılavuzda, web sitenizin INP ile ilgili sorunları olup olmadığını görmek için Chrome Kullanıcı Deneyimi Raporu'ndaki (CrUX) alan verilerini kullanarak web sitenizin INP'sini nasıl hızlı bir şekilde değerlendireceğinizi öğreneceksiniz. Ardından, web sitenizdeki yavaş etkileşimlerle ilgili alan verilerini toplamak ve yorumlamak için web-vitals JavaScript kitaplığının ilişkilendirme derlemesini ve işlenmesi uzun süren animasyon çerçeveleri API'den (LoAF) sağladığı yeni analizleri nasıl kullanacağınızı öğreneceksiniz.

Web sitenizin INP'sini değerlendirmek için CrUX ile başlayın

Web sitenizin kullanıcılarından alan verileri toplamıyorsanız CrUX iyi bir başlangıç noktası olabilir. CrUX, telemetri verilerini göndermeyi seçen gerçek Chrome kullanıcılarından alan verileri toplar.

CrUX verileri, aradığınız bilgilerin kapsamına bağlı olarak çeşitli alanlarda gösterilir. CrUX, INP ve diğer Core Web Vitals ile ilgili verileri şu kaynaklar için sağlayabilir:

  • PageSpeed Insights'ı kullanarak tek tek sayfalar ve tüm kaynaklar.
  • Sayfa türleri. Örneğin, birçok e-ticaret web sitesinde ürün ayrıntıları sayfası ve ürün listeleme sayfası türleri bulunur. Benzersiz sayfa türleri için CrUX verilerini Search Console'da bulabilirsiniz.

Başlangıç olarak web sitenizin URL'sini PageSpeed Insights'a girebilirsiniz. URL'yi girdikten sonra, varsa URL'nin alan verileri INP dahil olmak üzere birden fazla metrik için gösterilir. Mobil ve masaüstü boyutları için INP değerlerinizi kontrol etmek üzere açma/kapatma düğmelerini de kullanabilirsiniz.

PageSpeed Insights'ta CrUX tarafından gösterilen alan verileri. Bu veriler, üç Core Web Vitals metriğinde LCP, INP, CLS'yi, teşhis metrikleri olarak TTFB, FCP'yi ve desteği sonlandırılmış bir Core Web Vitals metriği olarak FID'yi gösterir.
PageSpeed Insights'ta görüldüğü gibi CrUX verilerinin okunması. Bu örnekte, söz konusu web sayfasının INP'sinin iyileştirilmesi gerekiyor.

Bu veriler, bir sorun olup olmadığını gösterdiği için faydalıdır. Ancak CrUX, sorunlara neyin neden olduğunu söyleyemez. Bu soruyu yanıtlamanıza yardımcı olmak için web sitenizin kullanıcılarından kendi alan verilerinizi toplamanıza yardımcı olacak birçok Gerçek Kullanıcı İzleme (RUM) çözümü mevcuttur. Bu seçeneklerden biri, web-vitals JavaScript kitaplığını kullanarak bu alan verilerini kendiniz toplamanızdır.

web-vitals JavaScript kitaplığıyla alan verilerini toplama

web-vitals JavaScript kitaplığı, web sitenizin kullanıcılarından alan verileri toplamak için web sitenize yükleyebileceğiniz bir komut dosyasıdır. Bu kitaplığı, destekleyen tarayıcılarda INP dahil olmak üzere çeşitli metrikleri kaydetmek için kullanabilirsiniz.

Browser Support

  • Chrome: 96.
  • Edge: 96.
  • Firefox: 144.
  • Safari: 26.2.

Source

web-vitals kitaplığının standart derlemesi, sahadaki kullanıcılardan temel INP verilerini almak için kullanılabilir:

import {onINP} from 'web-vitals';

onINP(({name, value, rating}) => {
  console.log(name);    // 'INP'
  console.log(value);   // 512
  console.log(rating);  // 'poor'
});

Kullanıcılarınızdan gelen alan verilerinizi analiz etmek için bu verileri bir yere göndermeniz gerekir:

import {onINP} from 'web-vitals';

onINP(({name, value, rating}) => {
  // Prepare JSON to be sent for collection. Note that
  // you can add anything else you'd want to collect here:
  const body = JSON.stringify({name, value, rating});

  // Use `sendBeacon` to send data to an analytics endpoint.
  // For Google Analytics, see https://github.com/GoogleChrome/web-vitals#send-the-results-to-google-analytics.
  navigator.sendBeacon('/analytics', body);
});

Ancak bu veriler tek başına CrUX'ten daha fazla bilgi vermez. web-vitals kitaplığının ilişkilendirme derlemesi bu noktada devreye girer.

web-vitals kitaplığının ilişkilendirme derlemesiyle daha fazlasını yapın

Web-vitals kitaplığının ilişkilendirme derlemesi, web sitenizin INP'sini etkileyen sorunlu etkileşimleri daha iyi gidermenize yardımcı olmak için sahadaki kullanıcılardan alabileceğiniz ek verileri gösterir. Bu verilere, kitaplığın onINP() yönteminde gösterilen attribution nesnesi üzerinden erişilebilir:

import {onINP} from 'web-vitals/attribution';

onINP(({name, value, rating, attribution}) => {
  console.log(name);         // 'INP'
  console.log(value);        // 56
  console.log(rating);       // 'good'
  console.log(attribution);  // Attribution data object
});
web-vitals kitaplığındaki konsol günlüklerinin görünümü. Bu örnekteki konsolda metriğin adı (INP), INP değeri (56), bu değerin INP eşikleri içindeki yeri (iyi) ve ilişkilendirme nesnesinde gösterilen çeşitli bilgiler (Long Animation Frames API'deki girişler dahil) gösterilir.
web-vitals kitaplığındaki verilerin konsolda nasıl göründüğü.

İlişkilendirme derlemesi, sayfanın INP'sinin yanı sıra, etkileşimin hangi bölümüne odaklanmanız gerektiği de dahil olmak üzere yavaş etkileşimlerin nedenlerini anlamanıza yardımcı olacak birçok veri sağlar. Bu rapor, aşağıdaki gibi önemli soruları yanıtlamanıza yardımcı olabilir:

  • "Kullanıcı, sayfa yüklenirken sayfayla etkileşim kurdu mu?"
  • "Etkileşimin etkinlik işleyicileri uzun süre çalıştı mı?"
  • "Etkileşim etkinlik işleyici kodunun başlatılması gecikti mi? Öyleyse o sırada ana iş parçacığında başka neler oluyordu?"
  • "Etkileşim, sonraki karenin boyanmasını geciktiren çok sayıda oluşturma işlemine neden oldu mu?"

Aşağıdaki tabloda, kitaplıktan alabileceğiniz ve web sitenizdeki yavaş etkileşimlerin üst düzey nedenlerinden bazılarını anlamanıza yardımcı olabilecek temel ilişkilendirme verilerinden bazıları gösterilmektedir:

attribution nesne anahtarı Veriler
interactionTarget Sayfanın INP değerini oluşturan öğeyi işaret eden bir CSS seçici (ör. button#save).
interactionType Etkileşimin türü (tıklama, dokunma veya klavye girişi).
inputDelay* Etkileşimin giriş gecikmesi.
processingDuration* Kullanıcı etkileşimine yanıt olarak ilk etkinlik işleyicinin çalışmaya başlamasından tüm etkinlik işleyici işlemlerinin tamamlanmasına kadar geçen süre.
presentationDelay* Etkileşimin sunum gecikmesi, etkinlik işleyicilerin bittiği andan bir sonraki karenin boyandığı ana kadar geçen süredir.
longAnimationFrameEntries* Etkileşimle ilişkili LoAF'deki girişler. Daha fazla bilgi için sonraki bölüme bakın.
*4. sürümdeki yenilikler

web-vitals kitaplığının 4. sürümünden itibaren, INP aşama dökümleri (giriş gecikmesi, işleme süresi ve sunum gecikmesi) ve işlenmesi uzun süren animasyon çerçevesi API'si (LoAF) ile sağladığı veriler aracılığıyla sorunlu etkileşimler hakkında daha ayrıntılı bilgi edinebilirsiniz.

İşlenmesi Uzun Süren Animasyon Çerçeveleri API'si (LoAF)

Browser Support

  • Chrome: 123.
  • Edge: 123.
  • Firefox: not supported.
  • Safari: not supported.

Source

Saha verilerini kullanarak etkileşimlerde hata ayıklamak zor bir iştir. Ancak LoAF'tan elde edilen veriler sayesinde, yavaş etkileşimlerin nedenleri hakkında daha iyi analizler elde etmek artık mümkün. LoAF, kesin nedenleri ve daha da önemlisi, sorunun kaynağının web sitenizin kodunda nerede olduğunu belirlemek için kullanabileceğiniz bir dizi ayrıntılı zamanlama ve diğer verileri gösterir.

web-vitals kitaplığının ilişkilendirme derlemesi, attribution nesnesinin longAnimationFrameEntries anahtarı altında bir LoAF girişleri dizisi gösterir. Aşağıdaki tabloda, her LoAF girişinde bulabileceğiniz birkaç önemli veri parçası listelenmiştir:

LoAF giriş nesnesi anahtarı Veriler
duration İşlenmesi uzun süren animasyon çerçevesinin, düzenin tamamlanmasına kadar geçen ancak boyama ve birleştirme işlemlerini hariç tutan süresi.
blockingDuration Uzun süren görevler nedeniyle tarayıcının hızlı yanıt veremediği karedeki toplam süre. Bu engelleme süresi, JavaScript çalıştıran uzun süren görevlerin yanı sıra karedeki sonraki uzun süren oluşturma görevlerini de içerebilir.
firstUIEventTimestamp Etkinliğin kare sırasında sıraya alındığı zaman damgası. Bir etkileşimin giriş gecikmesinin başlangıcını belirlemek için kullanışlıdır.
startTime Karenin başlangıç zaman damgası.
renderStart Kare için oluşturma çalışmasının başladığı zaman. Bu, tüm requestAnimationFrame geri çağırmalarını (ve varsa ResizeObserver geri çağırmalarını) içerir ancak stil/düzen çalışması başlamadan önce gerçekleşebilir.
styleAndLayoutStart Çerçevede stil/düzen çalışması gerçekleştiğinde. Mevcut diğer zaman damgalarını hesaba katarken stil/düzen çalışmasının uzunluğunu belirlemede yararlı olabilir.
scripts Sayfanın INP'sine katkıda bulunan komut dosyası ilişkilendirme bilgilerini içeren öğeler dizisi.
LoAF modeline göre işlenmesi uzun süren animasyon çerçevesinin görselleştirmesi.
LoAF API'ye göre işlenmesi uzun süren animasyon çerçevesinin zamanlamalarını gösteren diyagram (blockingDuration hariç).

Tüm bu bilgiler, bir etkileşimin neden yavaş olduğu hakkında size çok şey söyleyebilir. Ancak LoAF girişlerinin gösterdiği scripts dizisi özellikle ilgi çekici olmalıdır:

Komut dosyası ilişkilendirme nesnesi anahtarı Veriler
invoker Çağıran. Bu, bir sonraki satırda açıklanan çağırıcı türüne göre değişebilir. Çağırıcı örnekleri 'IMG#id.onload', 'Window.requestAnimationFrame' veya 'Response.json.then' gibi değerler olabilir.
invokerType Çağıranın türü. 'user-callback', 'event-listener', 'resolve-promise', 'reject-promise', 'classic-script' veya 'module-script' olabilir.
sourceURL İşlenmesi uzun süren animasyon çerçevesinin kaynaklandığı komut dosyasının URL'si.
sourceCharPosition sourceURL ile tanımlanan komut dosyasındaki karakter konumu.
sourceFunctionName Tanımlanan komut dosyasındaki işlevin adı.

Bu dizideki her giriş, bu tabloda gösterilen verileri içerir. Bu veriler, yavaş etkileşimden sorumlu olan komut dosyası ve bu komut dosyasının nasıl sorumlu olduğu hakkında bilgi verir.

Yavaş etkileşimlerin yaygın nedenlerini ölçme ve belirleme

Bu bilgileri nasıl kullanabileceğiniz hakkında fikir vermek için bu kılavuzda, yavaş etkileşimlerin ardındaki bazı nedenleri belirlemek üzere web-vitals kitaplığında gösterilen LoAF verilerini nasıl kullanabileceğiniz açıklanmaktadır.

Uzun işleme süreleri

Bir etkileşimin işlenme süresi, etkileşimin kayıtlı etkinlik işleyici geri çağırmalarının tamamlanması için gereken süreyi ve bunlar arasında gerçekleşebilecek diğer her şeyi ifade eder. Uzun süren işlemler, web-vitals kitaplığı tarafından gösterilir:

import {onINP} from 'web-vitals/attribution';

onINP(({name, value, attribution}) => {
  const {processingDuration} = attribution; // 512.5
});

Yavaş bir etkileşimin arkasındaki temel nedenin, etkinlik işleyici kodunuzun çalışmasının çok uzun sürmesi olduğunu düşünmek doğaldır ancak bu her zaman geçerli değildir. Sorunun bu olduğunu doğruladıktan sonra LoAF verileriyle daha ayrıntılı inceleme yapabilirsiniz:

import {onINP} from 'web-vitals/attribution';

onINP(({name, value, attribution}) => {
  const {processingDuration} = attribution; // 512.5

  // Get the longest script from LoAF covering `processingDuration`:
  const loaf = attribution.longAnimationFrameEntries.at(-1);
  const script = loaf?.scripts.toSorted((a, b) => b.duration - a.duration)[0];

  if (script) {
    // Get attribution for the long-running event handler:
    const {invokerType} = script;        // 'event-listener'
    const {invoker} = script;            // 'BUTTON#update.onclick'
    const {sourceURL} = script;          // 'https://example.com/app.js'
    const {sourceCharPosition} = script; // 83
    const {sourceFunctionName} = script; // 'update'
  }
});

Yukarıdaki kod snippet'inde görebileceğiniz gibi, yüksek işlem süresi değerlerine sahip bir etkileşimin kesin nedenini bulmak için LoAF verileriyle çalışabilirsiniz. Bu nedenler arasında şunlar yer alır:

  • Öğe ve kayıtlı etkinlik işleyicisi.
  • Uzun süren etkinlik işleyici kodunu içeren komut dosyası ve bu dosyadaki karakter konumu.
  • İşlevin adı.

Bu tür veriler paha biçilmezdir. Yüksek işlem süresi değerlerinden tam olarak hangi etkileşimin veya etkinlik işleyicilerinin sorumlu olduğunu bulmak için artık uğraşmanız gerekmez. Ayrıca, üçüncü taraf komut dosyaları genellikle kendi etkinlik işleyicilerini kaydedebildiğinden, sorumlu olanın sizin kodunuz olup olmadığını belirleyebilirsiniz. Kontrol ettiğiniz kod için uzun süren görevleri optimize etme konusunu incelemeniz gerekir.

Uzun giriş gecikmeleri

Uzun süre çalışan etkinlik işleyiciler yaygın olsa da etkileşimin dikkate alınması gereken başka bölümleri de vardır. Bir bölüm, işleme süresinden önce gerçekleşir ve giriş gecikmesi olarak bilinir. Bu, kullanıcının etkileşimi başlattığı andan etkinlik işleyici geri çağırmalarının çalışmaya başladığı ana kadar geçen süredir ve ana iş parçacığı başka bir görevi işlerken gerçekleşir. web-vitals kitaplığının ilişkilendirme derlemesi, bir etkileşim için giriş gecikmesinin süresini size söyleyebilir:

import {onINP} from 'web-vitals/attribution';

onINP(({name, value, attribution}) => {
  const {inputDelay} = attribution; // 125.59439536
});

Bazı etkileşimlerde yüksek giriş gecikmeleri olduğunu fark ederseniz etkileşim sırasında sayfada uzun giriş gecikmesine neden olan durumu belirlemeniz gerekir. Bu durum genellikle etkileşimin sayfa yüklenirken mi yoksa yüklendikten sonra mı gerçekleştiğiyle ilgilidir.

Sayfa yüklenirken mi?

Ana iş parçacığı genellikle sayfa yüklenirken en yoğun halindedir. Bu süre zarfında her türlü görev sıraya alınır ve işlenir. Tüm bu işlemler gerçekleşirken kullanıcı sayfayla etkileşim kurmaya çalışırsa etkileşim gecikebilir. Çok fazla JavaScript yükleyen sayfalar, komut dosyalarını derleyip değerlendirme ve sayfayı kullanıcı etkileşimlerine hazır hale getiren işlevleri yürütme işlemlerini başlatabilir. Bu işlem, kullanıcı bu etkinlik gerçekleşirken etkileşimde bulunursa engel olabilir. Web sitenizin kullanıcıları için durumun böyle olup olmadığını öğrenebilirsiniz:

import {onINP} from 'web-vitals/attribution';

onINP(({name, value, attribution}) => {
  const {inputDelay} = attribution; // 125.59439536

  // Get the longest script from the first LoAF entry:
  const loaf = attribution.longAnimationFrameEntries[0];
  const script = loaf?.scripts.toSorted((a, b) => b.duration - a.duration)[0];

  if (script) {
    // Invoker types can describe if script eval blocked the main thread:
    const {invokerType} = script;    // 'classic-script' | 'module-script'
    const {sourceLocation} = script; // 'https://example.com/app.js'
  }
});

Bu verileri sahada kaydediyorsanız ve yüksek giriş gecikmeleri ile 'classic-script' veya 'module-script' çağırıcı türleri görüyorsanız sitenizdeki komut dosyalarının değerlendirilmesinin uzun sürdüğünü ve ana iş parçacığını etkileşimleri geciktirecek kadar uzun süre engellediğini söyleyebiliriz. Komut dosyalarınızı daha küçük paketlere bölerek, başlangıçta kullanılmayan kodun daha sonra yüklenmesini sağlayarak ve sitenizi tamamen kaldırabileceğiniz kullanılmayan kodlar açısından denetleyerek bu engelleme süresini azaltabilirsiniz.

Sayfa yüklendikten sonra mı?

Giriş gecikmeleri genellikle sayfa yüklenirken meydana gelse de sayfa yüklendikten sonra tamamen farklı bir nedenden dolayı da meydana gelebilir. Sayfa yüklendikten sonra giriş gecikmelerinin yaygın nedenleri, daha önceki bir setInterval çağrısı nedeniyle düzenli olarak çalışan kodlar veya daha önce çalıştırılmak üzere sıraya alınmış ve hâlâ işlenmekte olan etkinlik geri çağırmaları olabilir.

import {onINP} from 'web-vitals/attribution';

onINP(({name, value, attribution}) => {
  const {inputDelay} = attribution; // 125.59439536

  // Get the longest script from the first LoAF entry:
  const loaf = attribution.longAnimationFrameEntries[0];
  const script = loaf?.scripts.toSorted((a, b) => b.duration - a.duration)[0];

  if (script) {
    const {invokerType} = script;        // 'user-callback'
    const {sourceURL} = script;          // 'https://example.com/app.js'
    const {sourceCharPosition} = script; // 83
    const {sourceFunctionName} = script; // 'update'
  }
});

Yüksek işleme süresi değerleriyle ilgili sorunları gidermede olduğu gibi, daha önce bahsedilen nedenlerden kaynaklanan yüksek giriş gecikmeleri, size ayrıntılı komut dosyası ilişkilendirme verileri sağlar. Ancak farklı olan, çağırıcı türünün etkileşimi geciktiren işin niteliğine göre değişmesidir:

  • 'user-callback', engelleyici görevin setInterval, setTimeout, hatta requestAnimationFrame tarafından oluşturulduğunu gösterir.
  • 'event-listener', engelleme görevinin sıraya alınmış ve hâlâ işlenmekte olan daha önceki bir girişten kaynaklandığını gösterir.
  • 'resolve-promise' ve 'reject-promise', engelleme görevinin daha önce başlatılan ve kullanıcının sayfayla etkileşim kurmaya çalıştığı sırada çözülen veya reddedilen, etkileşimi geciktiren eşzamansız bir çalışmadan kaynaklandığı anlamına gelir.

Her durumda, komut dosyası ilişkilendirme verileri size nereden bakmaya başlayacağınız ve giriş gecikmesinin kendi kodunuzdan mı yoksa üçüncü taraf komut dosyasından mı kaynaklandığı konusunda fikir verir.

Uzun sunum gecikmeleri

Sunu gecikmeleri, bir etkileşimin son aşamasıdır ve etkileşimin etkinlik işleyicileri tamamlandığında başlar ve bir sonraki karenin boyandığı noktaya kadar devam eder. Bunlar, bir etkileşim nedeniyle etkinlik işleyicideki çalışma, kullanıcı arayüzünün görsel durumunu değiştirdiğinde gerçekleşir. web-vitals kitaplığı, işleme süreleri ve giriş gecikmelerinde olduğu gibi bir etkileşim için sunum gecikmesinin ne kadar olduğunu size söyleyebilir:

import {onINP} from 'web-vitals/attribution';

onINP(({name, value, attribution}) => {
  const {presentationDelay} = attribution; // 113.32307691
});

Bu verileri kaydeder ve web sitenizin INP'sine katkıda bulunan etkileşimler için yüksek sunum gecikmeleri görürseniz bunun çeşitli nedenleri olabilir. Dikkat etmeniz gereken birkaç neden aşağıda verilmiştir.

Maliyetli stil ve düzen çalışmaları

Uzun sunum gecikmeleri, karmaşık CSS seçiciler ve büyük DOM boyutları gibi çeşitli nedenlerden kaynaklanan maliyetli stil yeniden hesaplama ve düzen çalışmaları olabilir. Bu çalışmanın süresini, web-vitals kitaplığında gösterilen LoAF zamanlamalarıyla ölçebilirsiniz:

import {onINP} from 'web-vitals/attribution';

onINP(({name, value, attribution}) => {
  const {presentationDelay} = attribution; // 113.32307691

  // Get the longest script from the last LoAF entry:
  const loaf = attribution.longAnimationFrameEntries.at(-1);
  const script = loaf?.scripts.toSorted((a, b) => b.duration - a.duration)[0];

  // Get necessary timings:
  const {startTime} = loaf; // 2120.5
  const {duration} = loaf;  // 1002

  // Figure out the ending timestamp of the frame (approximate):
  const endTime = startTime + duration; // 3122.5

  // Get the start timestamp of the frame's style/layout work:
  const {styleAndLayoutStart} = loaf; // 3011.17692309

  // Calculate the total style/layout duration:
  const styleLayoutDuration = endTime - styleAndLayoutStart; // 111.32307691

  if (script) {
    // Get attribution for the event handler that triggered
    // the long-running style and layout operation:
    const {invokerType} = script;        // 'event-listener'
    const {invoker} = script;            // 'BUTTON#update.onclick'
    const {sourceURL} = script;          // 'https://example.com/app.js'
    const {sourceCharPosition} = script; // 83
    const {sourceFunctionName} = script; // 'update'
  }
});

LoAF, bir kare için stil ve düzen çalışmasının süresini değil, ne zaman başladığını gösterir. Bu başlangıç zaman damgasıyla, LoAF'taki diğer verileri kullanarak karenin bitiş zamanını belirleyip stil ve düzen çalışmasının başlangıç zaman damgasını bundan çıkararak bu çalışmanın doğru süresini hesaplayabilirsiniz.

Uzun süren requestAnimationFrame geri çağırmaları

Uzun sunum gecikmelerinin olası nedenlerinden biri, requestAnimationFrame geri çağırmada aşırı çalışma yapılmasıdır. Bu geri çağırmanın içeriği, etkinlik işleyiciler çalışmayı tamamladıktan sonra ancak stil yeniden hesaplama ve düzen çalışmasından hemen önce yürütülür.

Bu geri çağırmaların tamamlanması, içlerinde yapılan iş karmaşıksa uzun sürebilir. Yüksek sunum gecikmesi değerlerinin requestAnimationFrame ile yaptığınız çalışmalardan kaynaklandığından şüpheleniyorsanız bu senaryoları belirlemek için web-vitals kitaplığı tarafından sunulan LoAF verilerini kullanabilirsiniz:

onINP(({name, value, attribution}) => {
  const {presentationDelay} = attribution; // 543.1999999880791

  // Get the longest script from the last LoAF entry:
  const loaf = attribution.longAnimationFrameEntries.at(-1);
  const script = loaf?.scripts.toSorted((a, b) => b.duration - a.duration)[0];

  // Get the render start time and when style and layout began:
  const {renderStart} = loaf;         // 2489
  const {styleAndLayoutStart} = loaf; // 2989.5999999940395

  // Calculate the `requestAnimationFrame` callback's duration:
  const rafDuration = styleAndLayoutStart - renderStart; // 500.59999999403954

  if (script) {
    // Get attribution for the event handler that triggered
    // the long-running requestAnimationFrame callback:
    const {invokerType} = script;        // 'user-callback'
    const {invoker} = script;            // 'FrameRequestCallback'
    const {sourceURL} = script;          // 'https://example.com/app.js'
    const {sourceCharPosition} = script; // 83
    const {sourceFunctionName} = script; // 'update'
  }
});

Sunum gecikme süresinin önemli bir kısmının requestAnimationFrame geri çağırmada harcandığını görürseniz bu geri çağırmalarda yaptığınız işin, kullanıcı arayüzünde gerçek bir güncellemeyle sonuçlanan işlerle sınırlı olduğundan emin olun. DOM'a dokunmayan veya stilleri güncellemeyen diğer tüm çalışmalar, bir sonraki karenin boyanmasını gereksiz yere geciktirir. Bu nedenle dikkatli olun.

Sonuç

Saha verileri, sahadaki gerçek kullanıcılar için hangi etkileşimlerin sorunlu olduğunu anlamak için yararlanabileceğiniz en iyi bilgi kaynağıdır. web-vitals JavaScript kitaplığı (veya bir RUM sağlayıcısı) gibi alan verisi toplama araçlarını kullanarak hangi etkileşimlerin en sorunlu olduğu konusunda daha emin olabilir, ardından sorunlu etkileşimleri laboratuvarda yeniden oluşturma ve düzeltme aşamasına geçebilirsiniz.