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

Next.js导入富文本编辑器时出现window/document未定义报错求助

问题原因及解决方案

核心原因

react-draft-wysiwyg 和 react-quill 这类富文本编辑器库,在模块导入阶段就会直接访问 window 或 document 等浏览器专属全局对象。如果你的Web应用基于服务端渲染(SSR)环境(比如Next.js),服务端执行代码时没有这些浏览器API,因此仅导入就会触发报错。

NoSsr组件无效的原因:它只能控制组件不在服务端渲染,但模块导入是在组件渲染之前的代码执行阶段,此时已经触发了访问浏览器对象的逻辑,所以无法解决问题。

解决方案

1. 动态导入(React 原生方案)

使用 React.lazy 和 Suspense 实现客户端懒加载,确保仅在浏览器环境下加载编辑器模块:

import React, { lazy, Suspense } from 'react';
import { EditorState } from 'draft-js';

// 仅在客户端动态导入Editor组件
const DraftEditor = lazy(() => 
  import('react-draft-wysiwyg').then(module => ({ default: module.Editor }))
);

// 渲染时用Suspense提供加载占位
export default function YourComponent() {
  const [editorState, setEditorState] = React.useState(EditorState.createEmpty());
  
  return (
    <Suspense fallback={<div>加载编辑器中...</div>}>
      <DraftEditor
        editorState={editorState}
        onEditorStateChange={setEditorState}
      />
    </Suspense>
  );
}

2. 条件导入(手动判断浏览器环境)

通过判断 window 是否存在,仅在客户端环境下导入模块:

import { EditorState } from 'draft-js';
import React from 'react';

// 仅在浏览器环境下加载Editor
let DraftEditor;
if (typeof window !== 'undefined') {
  const { Editor } = require('react-draft-wysiwyg');
  DraftEditor = Editor;
}

export default function YourComponent() {
  const [editorState, setEditorState] = React.useState(EditorState.createEmpty());
  
  return (
    <div>
      {/* 确保仅在Editor存在时渲染 */}
      {DraftEditor && (
        <DraftEditor
          editorState={editorState}
          onEditorStateChange={setEditorState}
        />
      )}
    </div>
  );
}

3. SSR框架专属方案(以Next.js为例)

使用 next/dynamic 直接禁用该模块的服务端渲染:

import dynamic from 'next/dynamic';
import { EditorState } from 'draft-js';
import React from 'react';

// 禁用服务端渲染,仅在客户端加载
const DraftEditor = dynamic(
  () => import('react-draft-wysiwyg').then(module => ({ default: module.Editor })),
  { 
    ssr: false,
    loading: () => <div>加载编辑器中...</div>
  }
);

export default function YourComponent() {
  const [editorState, setEditorState] = React.useState(EditorState.createEmpty());
  
  return (
    <DraftEditor
      editorState={editorState}
      onEditorStateChange={setEditorState}
    />
  );
}

以上方案同样适用于react-quill,只需替换对应的导入路径和组件名称即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:25:53