该软件包在水合错误期间显示一个覆盖层,提供服务器端和客户端渲染之间的明确差异。

npm install @builder.io/react-hydration-overlay
HydrationOverlay首先,将您的应用程序根部包裹在 HydrationOverlay 组件中。
import { HydrationOverlay } from "@builder.io/react-hydration-overlay"; export default function App() { return ( <HydrationOverlay> <YourApp /> </HydrationOverlay> ); }
或者,在 Next.js App Router 中,在根布局中包裹 {children}:
import { HydrationOverlay } from "@builder.io/react-hydration-overlay"; export default function RootLayout({ children }) { return ( <html lang="en"> <body> <HydrationOverlay>{children}</HydrationOverlay> </body> </html> ); }
其次,为您的框架添加插件。目前,我们支持 Next.js 和 webpack。
在 next.config.js 中:
const { withHydrationOverlay, } = require("@builder.io/react-hydration-overlay/next"); /** @type {import('next').NextConfig} */ const nextConfig = { /** 在此处添加您的配置 */ }; module.exports = withHydrationOverlay({ /** * 可选:`appRootSelector` 是您应用程序根元素的选择器。默认为 `#__next`,适用于 * 使用 pages 目录的 Next.js 应用。如果您使用的是 app 目录,应将其更改为 `main`。 */ appRootSelector: "main", })(nextConfig);
这里是一个示例(仍然使用 Next),但直接使用 webpack 助手:
const { withHydrationOverlayWebpack, } = require("@builder.io/react-hydration-overlay/webpack"); /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, webpack: (config, options) => { config = withHydrationOverlayWebpack({ appRootSelector: "#__next", isMainAppEntryPoint: (entryPointName) => !options.isServer && (entryPointName === "pages/_app" || entryPointName === "main-app"), })(config); return config; }, }; module.exports = nextConfig;
这个软件包通过比较从服务 器接收的 HTML 与客户端渲染的 HTML 来工作,这有一个重要的后果。当水合失败时,React 会重新渲染整个应用,可能会引入更多的变化。
最大的例子是 style 属性:React 会在每个属性后附加 ; 并改变空白。在更极端的例子中,它会为像 all: unset 这样的属性造成巨大的差异。
因此,这个工具会对样式更改给出误报。
hydration-overlay-initializer.js 注入到您应用的入口点。这个脚本读取来自服务器的 HTML 并存储它,然后监听水合错误并存储结果 HTML。HydrationOverlay 组件读取两个 HTML 字符串并比较它们,然后渲染覆盖层。要为其他框架添加支持,需要一个插件将 hydration-overlay-initializer.js 脚本注入到应用的入口点。更多信息请参见 next.ts 插件。欢迎提交 PR!
在进行更改的同一个 PR 中,运行:
pnpm c:add
并按照说明添加变更集。然后您可以合并您的 PR。
一旦您的 PR 被合并,changeset 机器人将打开一个包含变更集的 PR。一旦 CI 通过,您就可以合并这个 PR。这将触发一次发布。