ReactDOM Overview
ReactDOM is the entry point for React applications in web browsers. It provides methods for rendering React components to the DOM, managing root instances, and server-side rendering.Package Structure
ReactDOM is split into several entry points based on usage:Client APIs
createRoot()- Create a root for client-side renderinghydrateRoot()- Hydrate server-rendered content
Shared APIs
flushSync()- Force synchronous updatescreatePortal()- Render children into a different DOM nodeprefetchDNS(),preconnect(),preload(),preloadModule()- Resource preloadingpreinit(),preinitModule()- Resource initializationuseFormState(),useFormStatus()- Form handling hooksrequestFormReset()- Programmatically reset forms
Server APIs
renderToString()- Legacy synchronous server renderingrenderToStaticMarkup()- Render to static HTML without React attributesrenderToPipeableStream()- Modern streaming server rendering (Node.js)renderToReadableStream()- Modern streaming server rendering (Web Streams)
Client vs Server Rendering
Client-Side Rendering (CSR)
Render React components directly in the browser:- Simple setup
- Dynamic interactivity from the start
- No server required after initial load
- Slower initial page load
- Poor SEO without additional tooling
- Blank page while JavaScript loads
Server-Side Rendering (SSR)
Render React components to HTML on the server, then hydrate on the client: Server:- Faster perceived load time
- Better SEO
- Content visible before JavaScript loads
- More complex setup
- Requires server infrastructure
- Hydration mismatches can cause issues
Static Site Generation (SSG)
Pre-render pages at build time:- Fastest possible load times
- Can be served from CDN
- No server required
- Must rebuild for content changes
- Not suitable for dynamic content
- No React interactivity (unless you hydrate)
Rendering Modes
Concurrent Mode (Default)
React 18+ uses concurrent rendering by default withcreateRoot():
- Interruptible rendering
- Automatic batching
- Transitions
- Suspense for data fetching
Legacy Mode (React 17 and earlier)
Version Information
All ReactDOM packages export aversion string:
Browser Compatibility
ReactDOM requires the following browser features:- ES6 Features: Map, Set, Promise
- Modern DOM APIs: Element, Document, DocumentFragment
- Event System: addEventListener, removeEventListener
Polyfills
For older browsers, include polyfills before React:Environment Detection
ReactDOM automatically detects the environment:- Browser: Full client-side features
- Node.js: Server rendering capabilities
- Web Workers: Limited functionality
- Edge Runtime: Optimized for edge computing
API Reference
Explore detailed documentation for each API:createRoot
Create a root for rendering React components
hydrateRoot
Hydrate server-rendered HTML with React
renderToString
Legacy server rendering to string
renderToStaticMarkup
Render to static HTML without React
findDOMNode
Find DOM node (deprecated)
flushSync
Force synchronous updates
Migration Guide
From React 17 to React 18+
Before (React 17):Server Rendering Migration
Before:Best Practices
- Use createRoot for new apps - Enables concurrent features
- Prefer streaming SSR - Better performance than renderToString
- Handle hydration errors - Use onRecoverableError callback
- Avoid findDOMNode - Use refs instead
- Minimize flushSync usage - Hurts performance
- Clean up on unmount - Call root.unmount() when done