Skip to main content

Kilian Valkhof

创建使设计师和开发人员做得更好的工具. Polypane.rocks和叠加设计| @kilianvalkhof | https://kilianvalkhof.com/

4 最小阅读· 2019年10月12日

Speed up your time to interactive by delaying third party scripts

盖茨比(Gatsby)做了很多事情,以使网站尽快可见. 但是,使网站可见并不是唯一有趣的指标. 还有其他一些问题,如果您不注意的话,很容易花费比所需时间更长的时间. 即使您的网站仍然感觉很快.

本文关注的指标是" 交互时间 ",这是所有初始脚本运行所花费的时间. 这个原因特别有趣,原因有两个:

  • 当您在台式机上使用网站时,它并不是超级引人注目
  • 异步加载的脚本计入该数字(即使它们是异步的,它们仍会在页面加载后按顺序加载)
  • 这是Google业绩排名中非常重要的一部分. 由于受到用户的影响,它比" 第一个有意义的颜料 "重要5倍,例如,当屏幕上出现某些东西时. 5次!

这些因素可能意味着您的网站在某些情况下感觉很快,但是Google会因为速度慢而给您罚款.

要大致了解您的网站得分,您可以在Chrome开发人员工具中使用"灯塔",方法是转到"审核"标签,或者转到web.dev . Lighthouse将以多种不同的指标测试您的网站,例如可访问性,SEO(搜索引擎优化)和最佳做法,但我们感兴趣的是"性能".

The performance metric

尽管其他指标也很重要,但本文的范围还是有关性能的. 默认情况下,Gatsby网站会很容易在90年代(满分100分)获得一个分数,但是当您向页面中添加更多脚本(尤其是第三方脚本)时,评分会迅速降低.

Harry from marketingexamples.com linked me to a recent post of his on SEO performance that mentioned the “Time to interactive” scoring and I decided to take another look at my website for Polypane. I had checked it in the past and it had a good (90+) score, but I was pretty shocked when it came back and suddenly had a score of 63!

在查看性能数据时,该站点的第一笔有意义的绘画花了一点点时间,但互动时间为11秒 . kes!

原因是我最近切换到了Segment (使用gatsby-plugin-segment-js )并通过该工具加载其他脚本,例如支持聊天和分析. 这些脚本全部计入了我的"互动时间".

SEO性能文章中包含来自ToDesktop的 Dave的提示,该提示也有类似的问题. 他的提示:直到用户滚动后才加载脚本,并设置一些超时以防止滚动jank .

通过添加超时,您的"互动时间"不会考虑这些脚本. 无论如何,用户都不会在页面的第一秒内使用您的支持小部件,因此它对每个人都适用.任何方面都有其不利之处:随着打开您网站的人的出现, 跳出率将越来越不准确,请勿滚动和离开永远不会显示在您的分析中.

为了提高自己网站的性能等级,我分叉了gatsby-plugin-segment-js存储库并开始工作.

Updating gatsby-plugin-segment-js

该解决方案的工作方式如下:

  • 等待用户滚动
  • 进行setTimeout 1秒
  • 将呼叫包装在requestIdleCallback中 (如果有)
  • 然后加载脚本

如市场营销示例博客文章中所述,添加滚动超时很快完成. 但是,在Gatsby中,将加载所有后续页面而不会刷新页面. 这意味着人们可能会点击浏览您的网站,从不滚动,也永远不会加载该插件. 为了使该技术适用于Gatsby,该脚本还需要加载onRouteChange.

这导致了一系列有趣的要求:

  • 脚本应该只加载一次
  • 它们应在滚动操作后或页面更新后加载
  • 为了防止出现问题,在实际发生加载之前会有一段时间的延迟

由于此时间延迟,您可能会加载新页面,开始倒数计时,并且在此倒数计时期间,您还会滚动. 当时,脚本尚未加载,因此滚动事件侦听器也会触发新的加载.

要解决此问题,我向Gatsby插件添加了两个锁:

  • segmentSnippetLoaded ,默认为false ,并在加载后设置为true .
  • segmentSnippetLoading ,仅在调用load函数和完成函数之间才为true .

然后,在scrollonRouteChange ,仅当segmentSnippetLoaded不为真时才调用load函数,而在load函数中,仅当segmentSnippetLoading不为真时才继续. 这样可以防止在第一次加载脚本后完全调用该函数. 如果该函数被调用两次,但我们仍处于倒计时时间,则不会发生任何事情.

在自己的网站上实现此目标后,我的性能得分从63激增至94,并且互动时间减少了60%以上. 几行代码相当不错.

当前有一个PR打开,正在为gatsby-plugin-segment-js添加delayLoad选项以启用此功能. 或者,您可以从我的fork中构建它.

In closing

如果您在具有良好互联网连接的笔记本电脑或台式机上工作,那么"互动时间"不如"在屏幕上看到东西之前的时间"那么引人注目,但是它可能会对您的性能评级和互动性产生重大影响,并且因为其中,您的SEO. 将第三方脚本添加到页面时,您应该格外小心,最好的方法是运行Google Lighthouse. 如果您发现您的盖茨比(Gatsby)网站的性能得分不佳,请确保检查"互动时间"值. 如果该值很高,请仅在用户与您的网站进行交互之后尝试加载脚本.

与标签的性能 搜索引擎优化View all Tags

喜欢这篇文章吗? 在您的收件箱中接收下一个!

Docs
Tutorials
Plugins
Blog
Showcase

by  ICOPY.SITE