如何在不阻塞主线程的情况下运行代码(Google/Doubleclick Ads)

dta*_*tar 7 javascript

有没有办法在不阻塞主线程的情况下运行 Google Ads 代码?Google Pagespeed Insights 向我显示了一个警告“减少第三方代码的影响”第三方代码阻止了主线程...

Third-Party                   Size         Main-Thread Blocking Time
Google/Doubleclick Ads        193 KB       253 ms
Run Code Online (Sandbox Code Playgroud)

我在页脚的页面末尾放置了一个脚本。

<script data-ad-client="ca-pub-xxx" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
Run Code Online (Sandbox Code Playgroud)

我试图添加“data-aload data-original=...”但它没有帮助。也许使用 requestAnimationFrame() 或 setTimeOut() 是一个正确的选择,但我不知道如何实现它。

Dim*_*kov 4

您可以动态添加脚本。注意,无需添加,async因为浏览器默认认为所有动态脚本都是异步的

const loadScript = (src, id, callback) => {
    const script = document.createElement('script');
    script.src = src; // URL for the third-party library being loaded.
    script.id = id; // e.g., googleMaps or stripe
    script.defer = true; // make sure that browser will run script after page loaded
    document.body.appendChild(script);

    script.onload = () => {
      if (callback) callback(); // conditional callback
    };
};
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用“setAttribute”。`script.setAttribute('data-ad-client', 'value')` https://developer.mozilla.org/en-US/docs/Web/API/Element/setAttribute (3认同)
  • 对于现在遇到这个答案的任何人...谷歌说不要使用`script.onload`,因为代码在文件之间分割,所以这不是知道所有脚本已加载的可靠方法。请参阅 https://developers.google.com/publisher-tag/common_implementation_mistakes#scenario-1:-relying-on-gpt.js-script-tag-listeners (2认同)