【问题标题】:Largest Contentful Paint increased dramatically when using LazyLoad使用 LazyLoad 时最大的 Contentful Paint 显着增加
【发布时间】:2020-09-18 21:14:40
【问题描述】:

我的一个网站的 LCP 非常糟糕,4.6。我意识到如果没有主动延迟加载我的图像,LCP 是 2.0 。 TCB 也通过使用延迟加载而增加。所以我想这一定是我的 JS 技能不好,所以可以给我一个提示吗?

我的实际代码:

let lazyImages = [...document.querySelectorAll('img[data-src],iframe[data-src],div[data-bg],header[data-bg]')];
let inAdvance = 300;

function lazyLoad() {
   lazyImages.forEach(image => {
       if ( !image.classList.contains( 'lazyloaded' ) && !image.classList.contains( 'none' ) && image.getBoundingClientRect().top <= window.innerHeight + inAdvance && image.getBoundingClientRect().bottom >= 0) {
           if( image.hasAttribute( 'data-src' ) ){
               image.src = image.dataset.src;
           }

           if( image.hasAttribute( 'data-bg' ) ){
               image.setAttribute( 'style', 'background-image:url( ' + image.dataset.bg + ' );' );
           }

           image.classList.add('lazyloaded');
           //image.onload = () => image.classList.add('lazyloaded');
       }
   })
}

window.addEventListener( 'scroll', lazyLoad, {passive: true} );
window.addEventListener( 'resize', lazyLoad, {passive: true} );
window.addEventListener( 'slick', lazyLoad, {passive: true} );

我已经尝试过用观察者替换,但是 tcb 或 lcp 没有任何改进。

【问题讨论】:

  • HI Viewer 欢迎来到 SO!您能否也分享一下您正在使用的延迟加载库和相关的 HTML 代码?谢谢
  • 什么是 TCB?使用了一段时间的灯塔,但不认识任何适合的术语?一旦您解释该术语只是为了检查它是否不相关,我会弹出一个答案,但本质上您的 LCP 时间是屏幕上出现最大油漆的时间。如果您在加载所有 JS 后延迟加载,则加载在此过程中开始较晚,因此您的 LCP 时间较晚。如果您删除延迟加载导致 LCP 加载较早的图像,那么您的时间会得到改善。仅供参考,您应该延迟加载任何“首屏”出现的内容,而是优化图像等。
  • @LaurentC 上面的代码是我的lazyload - 代码。它是我修改以满足我的需要的 google-devs 的 sn-p。它延迟加载图像和 iframe。此外,您还可以为 div 和 header-elemts 的 backgroundimages 设置延迟加载。我在我的 JS 末尾用lazyLoad(); 调用它我的 HTML 标记看起来像这样:&lt;img data-src="path to file" src="path to placeholder"/&gt;
  • @GrahamRitchie THX 为您解释,抱歉,我的意思是 TBT(总阻塞时间),而不是 TBC - 我的错。嗯,当我在我的加载周期中加载我的首屏内容时,LCP 会增加......是的,这听起来很合乎逻辑。我将从所有元素中删除lazyLoading 并试一试,但我认为应该可以完成这项工作。谢谢,我会报告结果:)
  • @Viewer 让我知道您的进展情况,我还在回答中添加了一些一般提示,说明您的 TBT 受到影响的原因,尽管它们可能不是原因,但没有看到页面。试一试,让我知道你的进展情况。

标签: javascript lazy-loading pagespeed google-pagespeed


【解决方案1】:

为什么在移除延迟加载后我的最大内容绘制 (LCP) 时间会有所改善?

这往往是一个实施问题。

LCP 测量最大的油漆出现在页面上的时间。如果您使用延迟加载并且图像在“首屏”可见(不滚动)并且它们是页面上最大的绘制,那么它们将被报告为 LCP。如果只显示图像的顶部,也可能出现这种情况。

现在,如果您延迟加载它们并且您的 JavaScript 在页面加载顺序中加载较晚,这意味着图像将稍后下载,从而增加您的 LCP 时间。

修复步骤

  1. 不要延迟加载出现在“首屏”的图片,只需使用标准 &lt;img&gt;&lt;picture&gt; 元素。

  2. 就是这样!延迟加载页面加载时看不见的所有内容,因为性能提升是值得的(以及提高带宽使用率等)。

为什么我的总阻塞时间 (TBT) 会受到影响?

TBT 正在 CPU 上寻找“安静时间”,以确定页面上的主要工作何时完成。

测试还做的是将页面滚动到底部。

因此,您的函数可能会被快速连续调用多次并导致 CPU 出现瓶颈(请记住,CPU 对移动评分应用了 4 倍的减速,以模拟 CPU 功能较弱的现实世界移动设备。 )

可能的原因/可能的解决方案

因为您将事件侦听器设置为在 'scroll' 上触发,所以它会被触发多次,我假设您在页面上有多个图像。

您可以做的一件事是更改您的实际功能,这样就不必每次都执行那么多循环。

即设置图像src 或背景style 后,从lazyImages 列表中删除该项目。这样可以减少页面滚动时需要检查的项目数量,从而提高性能。

还只需检查slick 滑块导致您的函数被调用的频率,因为这也可能导致性能问题。

上述方法可能无法解决您的 TBT,但无论如何都是很好的做法。

【讨论】:

  • THX - 你太棒了。我已经开始删除首屏元素的所有lazyLoading,LCP 立即变得更好。在下一步中,我将了解您的其他提示:)
  • 很高兴能帮上忙!
猜你喜欢
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
相关资源
最近更新 更多