Overlay for hydration errors with explicit diff between renders
Hydration Overlay 🕵️
This package displays an overlay during Hydration Errors, providing an explicit diff between the server-side and client-side renders.
Installation
npm install @builder.io/react-hydration-overlay
Usage
HydrationOverlay
First, wrap the root of your app in the HydrationOverlay
component.
import { HydrationOverlay } from "@builder.io/react-hydration-overlay";
const App = () => {
return (
<HydrationOverlay>
<YourApp />
</HydrationOverlay>
);
};
Plugin
Second, add the plugin for your framework. Currently, we only support Next.js.
Next.js
in next.config.js
:
const {
withHydrationOverlay,
} = require("@builder.io/react-hydration-overlay/next");
/** @type {import('next').NextConfig} */
const nextConfig = {
/** your config here */
};
module.exports = withHydrationOverlay({
/**
* Optional: `appRootSelector` is the selector for the root element of your app. By default, it is `#__next` which works
* for Next.js apps with pages directory. If you are using the app directory, you should change this to `main`.
*/
appRootSelector: "main",
})(nextConfig);
Notes
- This package is currently in beta. Please report any issues you find!
- This package is not intended for production use. We highly recommend you remove this package from your production builds.
Caveats
This package works by comparing the HTML received from the server with the HTML rendered by the client, which has one improtant consequence. React re-renders the entire app when hydration fails, potentially introducing even more changes.
The biggest example is style
attributes: React appends ;
to each one and alters the whitespace. In more extreme examples, it causes enormous diffs for properties like all: unset
.
Therefore, this tool will give you false positives for style changes.
How It Works
- The plugin injects
hydration-overlay-initializer.js
into your app’s entry point. This script reads the HTML from the server and stores it, and then listens for hydration errors and stores the resulting HTML then. - The
HydrationOverlay
component reads both HTML strings and compares them, and renders the overlay.
Support
To add support for other frameworks, what is needed is a plugin that injects the hydration-overlay-initializer.js
script into the app’s entry point. See next-plugin.ts for more information. PRs welcome!
- Next.js
- Remix
- Vite SSR