There are some fundamental ideas that you need to understand before learning about hydration.
CSR, or client-side rendering
Client-side rendering uses JavaScript to render all pages directly in the browser. It is evident that the page loading would be delayed and result in a poor user experience when the browser rather than a server handles all data retrieval.
The ideal example of a client-side rendering library is ReactJS.
SSR, or server-side rendering
JavaScript pages are rendered using server-side rendering, which uses the servers’ request-response process. Since the servers are responsible for data retrieval, the user experience is good. But why?
As a result, while JavaScript is loading in the background, the server in SSR initially loads HTML content to give the user at least some content on the webpage. With CSR, that is not the case. CSR always starts with a blank page; the markup isn’t shown until after loading JavaScript. Remember that this only applies to the initial rendering of the React tree from the DOM or the initial render.
After the DOM has been rendered once, it is simpler to maintain the DOM modifications with CSR because doing so is much faster and more effective than making server requests for each DOM change. Small applications might not notice the difference, but as applications grow and have more state changes, using CSR after the entire React tree has been rendered becomes more advantageous.
What does hydration mean?
Hydration is the process of attaching React to HTML that has previously been rendered in a server context. Our React application has already been rendered on the server, and we are now hydrating the JavaScript bundle on the client for improved user experience and SEO.
Rendering vs. hydration differences
Rendering (Client-Side Rendering):
import React from 'react'; import ReactDOM from 'react-dom'; const App = () => ( <div> <h1>Hello, React!</h1> </div> ); ReactDOM.render(<App />, document.getElementById('root'));
Hydration (Server-Side Rendering):
Node:
./server.js
// On the server (Node.js) import React from 'react'; import ReactDOMServer from 'react-dom/server'; const App = () => ( <div> <h1>Hello, React on the Server!</h1> </div> ); const html = ReactDOMServer.renderToString(<App />); // Send `html` to the client as part of your server response.
React:
./index.js
// On the client import { hydrateRoot } from "react-dom/client"; import App from "./App"; const App = () => ( <div> <h1>Hello, React on the Client!</h1> </div> ); hydrateRoot(document.getElementById('root'),<App/>);
The hydrateRoot() API’s parameters are domNode, reactNode, and? options.
domNode: A DOM element was displayed as the tree’s root element.
reactNode: The React node used to render the current HTML is called reactNode. It is an object with options for the React root and often consists of JSX files like App.js and other settings. We won’t investigate it too deeply at this time.
Things to keep in mind
- When hydrating, hydrateRoot() will compare the displayed content with the server-rendered content and alert you if there are any discrepancies.
- HydrateRoot () is only permitted if the HTML content is not displayed. Use createRoot() in this situation.
- Your entire React project will likely have just one call to hydrateRoot().
Returns
render and unmount are the two methods on an object that createRoot() returns.
Let’s now examine these techniques.
root.render(reactNode)
In the hydrated React DOM tree, it is invoked to update or interact with React component.
const root = hydrateRoot(domNode, reactNode, ?options)
root.unmount()
It is used to destroy the React tree. No parameters are required for this technique.
root.unmount();
There won’t be any calls to unmount() in a React-only app.
Root.unmount() is particularly beneficial when the root’s DOM node or any of its ancestors are removed; by invoking this function, we can halt the removal of all items inside that are connected to it. By executing the unmount() method, we are instructing React to stop deleting React nodes once we have eliminated all unnecessary ones.
Calling unmount() typically unmounts every root node and removes React from the root DOM node, along with any state managers and event handlers.
You cannot call root.render() again after using root.unmount() since it will throw an error saying Cannot update an unmounted root.
Use hydrating HTML generated by a server
import {hydrateRoot} from "react-dom/client"; hydrateRoot(document.getElementById('root'),<App/>); //App.js import React from "react"; import { Counter } from "./Counter.js"; export default function App() { return( <> <h1> React Hydration </h1> <Counter/ > </> )} // index.js import React from "react"; import { hydrateRoot } from "react-dom/client"; import App from ".App.js"; hydrateRoot( document.getElementById('root'), <App/> );
// Counter.js
import React, { useState } from "react"; export const Counter = () => { const [count, setCount] = useState(0); return ( <button onClick={() => setCount(count + 1)}> Total Clicks: <strong>{count}</strong> times </button> ); };
Hydrating a whole document
Apps built entirely with React can render the entire document as JSX, allowing for simultaneous hydration.
Pass the document as a React node to hydrate it in its entirety.
import { hydrateRoot} from "react-dom/client"; import { App } from hydrateRoot(document, <App/>);
Eliminating hydration mismatch mistakes that cannot be avoided
You can turn off the hydration mismatch alert if one element’s attribute or text content (such as a timestamp) naturally differs between the server and the client.
Add suppressHydrationWarning=true to an element to turn off hydration warnings.
Handling various client- and server-side content
You can use two-pass rendering if you need to render something differently on the server and the client purposely. A state variable like isClient, which you can set to true in an Effect, can be read by components that render distinct content on the client.
Conclusion
In conclusion, hydration in React is an essential procedure that ensures fluid rendering and interactivity for React applications rendered on the server. It enhances performance and user experience by swiftly converting the server-rendered HTML into a fully complete React app on the client side.
Consult a React app expert to make the best possible use of React and ensure your web application is adequately hydrated. These skilled professionals can maximize your software’s functionality, maintainability, and user interface, ensuring your project’s success.
Frequently Asked Questions (FAQs)
1. What distinguishes React’s render and hydrate functions?
However, hydrate() is used to hydrate a container whose HTML contents were produced by ReactDOMServer. It is the same as render(). React will make an effort to integrate event listeners with the current markup.
2. Why do we utilize React’s render () function?
The function intends to display the provided HTML code inside the specified HTML element. We can read props and state in the render() method and deliver our JSX code to the app’s main component.
3. How do render and return in React differ from one another?
The render method configures the lifetime and initial states of the child component. A value is given back via the return method. You construct a new component using the render method. Reusing an existing component requires the use of the return method.