NextJS警告的原因是什么:“服务器传来的额外属性:data-new-gr-c-s-check-loaded...”

112
我在我的NextJS应用程序中收到以下警告:
警告:来自服务器的额外属性:data-new-gr-c-s-check-loaded,data-gr-ext-installed,cz-shortcut-listen,data-lt-installed。
我不知道为什么会发生这种情况,对此有何解释?
13个回答

266
这通常是由于扩展程序在浏览器上执行与用户界面交互的代码时,传递了这些额外的属性,从而导致服务器端渲染和客户端渲染之间出现不匹配。
类似于Grammarly、ColorZilla和LanguageTool的扩展程序因此成为此警告的原因,因此您需要找出哪个扩展程序正在执行此操作,然后将其禁用/配置为不在您通常用于开发的端口上运行。这是解决此警告的直接方法,因为在开发中始终建议避免使用扩展程序。
如果你检查开发者工具中的应用程序纯HTML部分的Elements部分,你可以找到那些额外的属性。

enter image description here

通常使用缩写,例如在这里,“lt”代表“LanguageTool”,“gr”代表“Grammaly”,以及“cz”代表“ColorZilla”。这可以帮助检测扩展名。

好知道:

您可以通过在RootLayout的开头<body>标签中将suppressHydrationWarning设置为true来抑制水合警告。

export default RootLayout({ children }) {
  return (
   <html lang="en">
      <body suppressHydrationWarning={true}>
        {children}
      </body>
    </html>
  )
}

有时候,如果在那里添加了属性,你必须将它放在开头的 <html> 标签中。
<html lang="en" suppressHydrationWarning={true}>

suppresshydrationwarning 只能在一层深度上起作用,所以如果你把它放在 <html> 元素中,它不会抑制 <body> 元素的 hydration 警告,因为它在更深的层级上,这很好!因为我们不想抑制位于更深层级的服务器组件的水合警告。


1
我添加了这个属性,它可以正常工作。然后我删除了很久以前没有使用的扩展和属性,也一样可以正常工作。谢谢你的回答,它帮助我清理了我的浏览器: https://www.youtube.com/watch?v=wgrmB8M0sgU&t=214s&pp=ygUKbWFuIGRyYXdlcg%3D%3D - Aakash
@douglasrcjames 这不是一个错误,而是一个警告,它不会对任何东西造成伤害。更推荐的做法是在开发时禁用扩展。 - Ahmed Sbai
@Moayad.AlMoghrabi 实际上,在开发模式下禁用扩展程序更好,第二个解决方案只是一种替代方法。 - Ahmed Sbai
@Pagenotfound 我更新了我的回答,在文档中提到 suppressHydrationWarning 只能在一层深度起作用,所以如果你将其放在 body 元素中,它不应该影响位于更深层级的服务器组件。 - undefined
1
<body suppressHydrationWarning={true}> 运行良好 - xgqfrms
显示剩余13条评论

55
禁用Grammarly扩展程序解决了我的问题。

对我来说一样,谢谢。 - Radomir Mijovic
有点奇怪,禁用了Grammarly和ColorZilla扩展后问题就解决了。 - undefined
我在使用Grammarly时遇到了问题,如果有人使用其他的语法检查工具,也需要将其禁用以修复错误。 - undefined

23
禁用ColorZilla扩展程序解决了我的问题。

很好,这也是我的问题所在。 - mawburn
1
刚刚禁用了ColorZilla,问题解决了。谢谢! - undefined
刚刚禁用了ColorZilla,问题解决了。谢谢! - Renan Coelho

19
Chrome发布了一个新功能,可以禁用特定URL的扩展程序,这非常棒,因为这个警告似乎只是开发环境的问题。只需在Chrome浏览器中输入chrome://flags/#extensions-menu-access-control来启用此标志,并重新启动Chrome。
重新启动后,您可以点击浏览器右上角的扩展图标,同时浏览http://localhost:3000 URL,以关闭该URL(仅限该URL)的扩展程序!不需要上面提到的suppressHydrationWarning={true}属性。

enter image description here


1
太棒了 - 非常感谢 - undefined
1
这太棒了,如果你在Chrome上进行开发,这是最佳选择。这也是一个非常实用的Chrome小贴士 - 谢谢你的分享。 - undefined

9
停止使用ColorZilla和Grammarly扩展程序来解决我的问题。

enter image description here


5

此警告信息表明 Next.js 从服务器接收到的 HTML 元素上有一些额外的属性,它不认识这些属性。

这些属性是由各种浏览器扩展程序、插件或工具栏添加到页面的 HTML 中的。

在您的情况下,属性 data-new-gr-c-s-check-loaded,data-gr-ext-installed 和 cz-shortcut-listen 可能是一个或多个安装在浏览器中的浏览器扩展添加的。Next.js 不认识这些属性,因此会发出警告。

要消除警告,您可以使用元素上的 dangerouslySetInnerHTML 属性来过滤掉 next.js 不认识的 data-* 属性。

<div 
    dangerouslySetInnerHTML = {{
        __html: htmlString.replace(
            / data-(?!react[\w-]+=)[\w-]+="[^"]*"/g,
            ''
        ),
    }}
/>

4
我应该如何设置dangerouslySetInnerHTML?我是不是应该在 layout.tsx(_app.tsx)中的 <body> 标签上这样做?由于我真的不知道浏览器扩展可以注入这些属性到哪里,那我应该用什么替换 htmlString 呢? - Carven

4
在我的情况下,禁用Grammarly和ColorZilla扩展解决了这个问题。

3

1. 禁用扩展

您在JavaScript控制台中看到的警告消息,具体来说:

警告:来自服务器的额外属性:cz-shortcut-listen...

与服务器发送的一些属性相关,您的代码可能无法正确处理或预期。这个警告通常不是关键问题,不会阻止您的应用程序运行,但是为了确保代码保持干净和可维护,解决这个问题是一个好习惯。

临时禁用浏览器扩展,除了开发所需的扩展之外。浏览器扩展有时会干扰Web应用程序的行为,包括修改网络请求的内容或向HTML元素中注入额外的属性。

或者

2. 阻止水合

<body>的开标签中添加suppressHydrationWarning={true}

示例:<body className={inter.className} suppressHydrationWarning={true}> 您的代码</body>

Example


1
有许多用于CSS测量和编辑的Google扩展程序。其中大部分都会产生错误。
因此,在禁用页面的测量扩展程序后,错误消失了。

1
我在浏览器中使用的1688.com插件遇到了问题。断开连接后问题得到解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接