You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextJs页面刷新时出现ReferenceError: document is not defined错误求助

解决react-quill刷新时出现ReferenceError: document is not defined的问题

问题原因

react-quill依赖浏览器环境的document对象,若你的项目采用服务端渲染(SSR)或静态生成(SSG)模式,服务端执行代码时不存在document,初始化组件时就会触发该错误。你之前添加的window判断仅用于打印日志,并未阻止服务端渲染ReactQuill组件,因此无法解决问题。

解决方案

方案1:动态导入+客户端挂载判断

通过useEffect标记客户端环境,配合React的lazy和Suspense实现组件懒加载,确保仅在客户端渲染编辑器:

import React, { useState, useEffect, lazy, Suspense } from 'react'

const ReactQuill = lazy(() => import('react-quill'))
import 'react-quill/dist/quill.snow.css'

const RichTextEditor = () => {
  const [body, setBody] = useState('')
  const [isClient, setIsClient] = useState(false)

  useEffect(() => {
    setIsClient(true)
  }, [])

  const handleBodyChange = (value) => {
    setBody(value)
  }

  if (!isClient) {
    return <div>加载编辑器中...</div>
  }

  return (
    <Suspense fallback={<div>加载编辑器中...</div>}>
      <ReactQuill value={body} onChange={handleBodyChange} />
    </Suspense>
  )
}

export default RichTextEditor;

方案2:Next.js专属动态导入(若使用Next.js)

利用Next.js的dynamic函数关闭SSR,直接在客户端加载组件:

import React, { useState } from 'react'
import dynamic from 'next/dynamic'

const ReactQuill = dynamic(() => import('react-quill'), {
  ssr: false,
  loading: () => <div>加载编辑器中...</div>
})
import 'react-quill/dist/quill.snow.css'

const RichTextEditor = () => {
  const [body, setBody] = useState('')

  const handleBodyChange = (value) => {
    setBody(value)
  }

  return <ReactQuill value={body} onChange={handleBodyChange} />
}

export default RichTextEditor;

方案3:条件导入组件

仅在客户端环境下导入react-quill,避免服务端执行相关代码:

import React, { useState } from 'react'

let ReactQuill;
if (typeof window !== 'undefined') {
  ReactQuill = require('react-quill').default;
  require('react-quill/dist/quill.snow.css');
}

const RichTextEditor = () => {
  const [body, setBody] = useState('')

  const handleBodyChange = (value) => {
    setBody(value)
  }

  if (!ReactQuill) {
    return <div>加载中...</div>
  }

  return <ReactQuill value={body} onChange={handleBodyChange} />
}

export default RichTextEditor;

内容的提问来源于stack exchange,提问作者judith herlambang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:40:28