React useSSR hook
Checks if the code is running on the browser or the server.
- Create a custom hook that returns an appropriate object.
- Use
typeof
,Window
,Window.document
andDocument.createElement()
to check if the code is running on the browser. - Use the
useState()
hook to define theinBrowser
state variable. - Use the
useEffect()
hook to update theinBrowser
state variable and clean up at the end. - Use the
useMemo()
hook to memoize the return values of the custom hook.
const isDOMavailable = !!( typeof window !== 'undefined' && window.document && window.document.createElement ); const useSSR = () => { const [inBrowser, setInBrowser] = React.useState(isDOMavailable); React.useEffect(() => { setInBrowser(isDOMavailable); return () => { setInBrowser(false); }; }, []); const useSSRObject = React.useMemo( () => ({ isBrowser: inBrowser, isServer: !inBrowser, canUseWorkers: typeof Worker !== 'undefined', canUseEventListeners: inBrowser && !!window.addEventListener, canUseViewport: inBrowser && !!window.screen }), [inBrowser] ); return React.useMemo( () => Object.assign(Object.values(useSSRObject), useSSRObject), [inBrowser] ); }; const SSRChecker = props => { let { isBrowser, isServer } = useSSR(); return <p>{isBrowser ? 'Running on browser' : 'Running on server'}</p>; }; ReactDOM.createRoot(document.getElementById('root')).render( <SSRChecker /> );