加载具有完美 Core Web Vitals 的聊天小部件

加载不影响 PageSpeed 和 Core Web Vitals 的聊天小部件

Arjen Karel Core Web Vitals Consultant
Arjen Karel - linkedin
Last update: 2026-02-07

如何正确加载聊天小部件!

我已经反复说过了。有些脚本比其他脚本更重要。在互联网的历史上,从来没有人因为聊天小部件没有在页面加载的前500毫秒内加载而感到烦恼。那个页面还是空白的时间段。

在页面的主要内容还没有开始加载之前就加载聊天小部件,这不合理对吧?不,更合理的做法是先加载最重要的部分(你的 logo、主图、样式表、字体,也许还有一些处理导航和转化的超级重要的脚本)

不幸的是,大多数网站并不是这样做的。我每天都看到不重要的脚本(如聊天脚本)在页面加载开始时以最高优先级加载。

在这篇文章中,我将解释如何正确加载聊天脚本,以及这如何影响 Largest Contentful Paint Interaction to Next Paint 等重要指标。

背景:聊天小部件是如何工作的

聊天小部件通常通过在页面上加载一个小脚本来工作。该脚本会加载一些样式并在页面上注入一个 iframe。iframe 是网页中的一个小型隔离网页。这个 iframe 会处理与客户聊天所需的一切。

聊天小部件如何影响 Core Web Vitals?

聊天小部件通过以下几种方式影响 Core Web Vitals

1. 它们通过争夺早期网络资源来影响 First Contentful Paint 和 Largest Contentful Paint。

2. 它们通过阻塞主线程以及有时在交互后缓慢更新来影响 Interaction to Next Paint。

3. 当它们在页面上渲染不正确时,可能导致布局偏移

聊天小部件导致的 Largest Contentful Paint 问题

当聊天小部件争夺网络资源时,会影响 Core Web Vitals。JavaScript 通常比图片更早排队下载。这意味着,在最坏的情况下(当聊天脚本是渲染阻塞的),浏览器必须等待聊天脚本下载并执行完毕后,才能继续处理其他任何内容。

即使聊天脚本被延迟加载,它仍然可能通过几种方式影响绘制指标。首先让我解释延迟脚本的作用。浏览器可以并行下载延迟脚本,并且浏览器可以继续渲染直到 DomContentLoaded 事件。之后它会执行脚本。问题在于,对于回访用户来说,LCP 元素可能还没有在 DomContentLoaded 事件时加载完成,但(已缓存的)聊天脚本会执行,从而导致 LCP 指标延迟。

聊天小部件导致的 Interaction to Next Paint (INP) 问题

聊天小部件会通过两种方式影响 Interaction to Next Paint。第一种方式是在聊天小部件执行脚本或检查更新时短暂阻塞主线程。这就是事物运作的方式。你"添加到页面"的每样东西都会使页面稍微变慢。 

第二种方式是由于糟糕的编码(相信我,有一些编码很差的聊天小部件)。说到聊天小部件,"更流行"并不意味着"编码更好"。当糟糕的代码需要很长时间来更新展示时,你就会自动遇到 INP 问题。我想一些聊天提供商需要提升他们的水平。这部分不幸不在我的控制范围内。如果你选择了一个"编码很差"的聊天小部件,我没有办法让那些代码变得更好。 

聊天小部件导致的 Layout Shift (CLS) 问题

有时聊天小部件会导致布局偏移。在检查聊天小部件相关的布局偏移时,我通常会查看3个常见原因。

  • 每次聊天加载时都会发生的布局偏移
  • 延迟"聊天打开"时发生的布局偏移
  • 加载聊天历史记录(回访聊天用户)时发生的布局偏移

如何修复聊天脚本导致的 Core Web Vitals 问题

幸运的是,最大限度地减少聊天小部件对绘制指标(LCP 和 FCP)以及 Interaction to Next Paint (INP) 某些方面的影响是相当容易的。在我的开场白中,我告诉过你脚本有其适当的时间和位置。对于聊天脚本来说,那不是"立即且不惜一切代价"。我喜欢在load 事件之后加载聊天脚本,当页面不响应用户输入时,我还喜欢绕过预加载扫描器以避免网络竞争。 

那么我们该怎么做呢?我们使用load 事件,因为当 load 事件触发时,LCP 元素已经绘制在页面上了(除非你用 JavaScript 懒加载了它)。我们使用 requestIdleCallback 来等待浏览器不响应用户输入的空闲时刻。我们使用 JavaScript 注入聊天脚本,以确保预加载扫描器不会立即识别脚本 src 并触发早期下载(这正是我们想要避免的!)

<script>
<script>

修复聊天小部件导致的 Cumulative Layout Shift 问题

聊天小部件通常会导致小的布局偏移。这不一定是大问题。但有时聊天小部件渲染得很差。幸运的是,我们也可以(在某种程度上)通过在小部件完成渲染之前隐藏糟糕的渲染来修复这个问题。

要做到这一点,我们需要阅读聊天小部件的文档(有很多不同的聊天提供商,它们的工作方式都略有不同)。在文档中查找在聊天渲染不同阶段被调用的回调函数。由于我不知道你使用的是哪个聊天小部件,为了说明这个机制,我们暂时使用 chat.ready() 函数。

现在通过一些巧妙的样式,我们可以使用 CSS opacity 属性来隐藏和显示聊天。首先,我们添加一些类来默认隐藏聊天小部件(更改描述符以匹配你的聊天小部件)。然后在 chat.ready() 回调中,我们将 'showchat' 添加到 body 的 classlist 中,以激活第二行 CSS 来再次显示聊天。
<style>
/*hide chat widget by default*/
.chatwidget{opacity:0}
/*show chat widget after .showchat body class*/
body.showchat .chatwidget {opacity:1}
<style>
<script>
chat.ready(function(){
  document.documentElement.classList.add('showchat');})
<script>

就是这样!祝你加速聊天小部件顺利

Compare your segments.

Is iOS slower than Android? Is the checkout route failing INP? Filter by device, route, and connection type.

Analyze Segments >>

  • Device filtering
  • Route Analysis
  • Connection Types
加载具有完美 Core Web Vitals 的聊天小部件Core Web Vitals 加载具有完美 Core Web Vitals 的聊天小部件