Join the AI Workshop to learn more about AI and how it can be applied to web development. Next cohort February 1st, 2026
The AI-first Web Development BOOTCAMP cohort starts February 24th, 2026. 10 weeks of intensive training and hands-on projects.
The error ReferenceError: document is not defined occurs when you try to access the document object in an environment where it doesn’t exist.
Why it happens
The document object is provided by the browser. It’s part of the DOM (Document Object Model) API and represents the web page.
This object is not available in:
- Node.js
- Server-side rendering (SSR) environments
- Server components in frameworks like Next.js
You’re essentially running frontend code in a backend environment.
Fixing in Node.js
In Node.js, there’s no workaround - you must find where document is being used and reconsider why you’re accessing it.
If you need DOM manipulation in Node.js, consider using libraries like:
jsdomfor simulating a DOM environmentcheeriofor parsing and manipulating HTML
Fixing in Next.js
In Next.js, your code might run in both situations:
- Client-side (frontend) when navigating to a page using a link
- Server-side when using
getServerSideProps()or server components
The fix is to wrap browser-specific code in a conditional:
if (typeof window !== 'undefined') {
// Here `window` is available, so `window.document` (or simply `document`) is available too
}
Using useEffect in React
In React components, you can also use useEffect to ensure code only runs on the client:
import { useEffect } from 'react'
function MyComponent() {
useEffect(() => {
// This only runs in the browser
document.title = 'My Page'
}, [])
return <div>Hello</div>
}
Dynamic imports
For components that rely heavily on browser APIs, use dynamic imports with ssr: false:
import dynamic from 'next/dynamic'
const ClientOnlyComponent = dynamic(
() => import('../components/ClientComponent'),
{ ssr: false }
)
This prevents the component from being rendered on the server.