Skip to content

NextJS extra attributes 警告

问题说明

在 NextJS 应用开发过程中,控制台可能会显示以下警告信息:"Warning: Extra attributes from the server: data-new-gr-c-s-check-loaded,data-gr-ext-installed,cz-shortcut-listen,data-lt-installed"

控制台警告截图示例

这个警告表示 NextJS 在**服务端渲染(SSR)客户端渲染(CSR)**之间存在属性不一致的情况。当浏览器添加了额外属性而服务器没有提供这些属性时,React 的水合过程会检测到不一致并发出警告。

根本原因

这些 data-* 属性的来源通常是浏览器扩展插件

  • cz-*: ColorZilla 颜色取色器插件
  • gr-*: Grammarly 语法检查插件
  • lt-*: LanguageTool 语法纠错插件
  • data-new-gr-c-s-check-loaded: 同上

这些插件会在页面加载时注入自定义属性,导致 SSR 渲染结果和 CSR 渲染结果之间的差异。

解决方案

禁用冲突的浏览器扩展

最直接的解决方法是识别并禁用造成问题的浏览器扩展:

  1. 打开 Chrome 扩展管理页面:chrome://extensions/
  2. 逐个禁用可疑扩展(特别是语法检查和 UI 增强类插件)
  3. 刷新 NextJS 开发页面
  4. 观察哪个扩展禁用后警告消失

常见问题扩展:

  • ColorZilla (产生 cz-* 属性)
  • Grammarly (产生 gr-* 属性)
  • LanguageTool (产生 lt-* 属性)
  • 其它 UI/设计测量类扩展

在无痕模式下运行

无痕模式默认禁用所有扩展,可快速验证是否是扩展问题:

typescript
// 通过命令行启动无痕模式
npx cross-env BROWSER='chrome --incognito' next dev

禁用扩展对 localhost 的访问

Chrome 支持禁用特定网站的扩展(推荐方案):

  1. 访问 chrome://flags/#extensions-menu-access-control
  2. 启用该实验性功能
  3. 重启 Chrome
  4. 访问 localhost:3000
  5. 点击扩展图标 → 选择 "此网站上关闭"

扩展控制示意图

使用官方 API 忽略警告

若要针对性的忽略这些警告(不建议全局使用):

jsx
// app/layout.js
import { Inter } from "next/font/google";

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

慎用 suppressHydrationWarning

此解决方案只在开发阶段推荐使用。生产环境中出现该警告意味着存在真实的水合问题。

特定框架配置解法 (GSAP 案例)

当使用 GSAP 动画库时可能出现类似问题[^1]:

ts
// useIsomorphicLayoutEffect.ts
import { useLayoutEffect, useEffect } from "react";

const useIsomorphicLayoutEffect = 
  typeof window !== "undefined" ? useLayoutEffect : useEffect;

export default useIsomorphicLayoutEffect;
tsx
// components/RegisterComponent.tsx
"use client";

import gsap from "gsap";
import { ScrollTrigger } from "gsap/dist/ScrollTrigger";
import useIsomorphicLayoutEffect from "./useIsomorphicLayoutEffect";

gsap.registerPlugin(ScrollTrigger); // 注册所需插件

function MyComponent() {
  useIsomorphicLayoutEffect(() => {
    // GSAP初始化代码
  }, []);
  
  return /* ... */
}

补充说明

为什么需要关注此警告?

  1. 性能影响:频繁的水合警告可能影响页面加载性能
  2. DOM 不一致:可能引发 UI 渲染异常
  3. 调试干扰:会掩盖其他重要警告

高级排查技巧

当禁用扩展无效时,请检查:

  1. 是否在多个布局文件中重复定义了 <html><body>
  2. UI 库是否有特殊配置需求(如 MUI 的主题配置)
  3. 检查页面元素属性是否有不匹配的 style 属性
html
<!-- 元素检查示例 -->
<html data-lt-installed="true" ...> <!-- 扩展注入的属性 -->

总结

解决方式推荐指数适用场景
禁用浏览器扩展⭐⭐⭐⭐⭐所有开发环境
无痕模式运行⭐⭐⭐⭐快速验证问题来源
限制扩展访问⭐⭐⭐⭐需要保留扩展功能
suppressHydrationWarning⭐⭐临时开发解决方案
GSAP 特殊配置⭐⭐使用特定动画库时

大多数情况下,此警告是由于浏览器扩展对开发环境的干扰造成的,生产环境中通常不会出现。最佳实践是开发时保持浏览器的纯净状态,特别是进行 NextJS 的 SSR/CSR 调试时。

[^1]: GSAP 解决方案参考其官方社区反馈:https://gsap.com/community/forums/topic/35440-warning-extra-attributes-from-the-server-style/?do=findComment&comment=190094