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

React(JSX)集成ACE编辑器报错:ReferenceError: window is not defined

解决react-ace集成时"window is not defined"错误

核心原因

react-ace依赖浏览器环境的window对象初始化编辑器实例,若组件在服务端渲染(SSR)或DOM未完成挂载时就执行初始化逻辑,就会触发该错误。以下是具体解决方案:


方案1:动态导入+禁用SSR(适配Next.js等SSR框架)

通过React的lazy和Suspense实现组件懒加载,同时将ace的资源文件放在useEffect中加载,确保仅在浏览器环境执行:

import React, { useState, useEffect, lazy, Suspense } from "react";
const AceEditor = lazy(() => import("react-ace"));

const AceEditorTest = () => {
  const [search, setSearch] = useState('');

  useEffect(() => {
    // 按需加载ace的语言模式、主题和扩展工具
    import("ace-builds/src-noconflict/mode-java");
    import("ace-builds/src-noconflict/theme-github");
    import("ace-builds/src-noconflict/ext-language_tools");
  }, []);

  // 修正onChange回调:react-ace直接返回编辑器内容,而非事件对象
  function onChange(newValue) {
    setSearch(newValue);
    console.log("change", newValue);
  }

  return (
    <Suspense fallback={<div>加载编辑器中...</div>}>
      <AceEditor
        mode="java"
        theme="github"
        onChange={onChange}
        name="UNIQUE_ID_OF_DIV"
        editorProps={{ $blockScrolling: true }}
      />
    </Suspense>
  );
}
export default AceEditorTest;

方案2:检查浏览器环境后渲染(非SSR项目)

如果是纯客户端渲染项目,可通过判断window是否存在,延迟编辑器的渲染时机:

import React, { useState, useEffect } from "react";

const AceEditorTest = () => {
  const [isBrowser, setIsBrowser] = useState(false);
  const [search, setSearch] = useState('');

  useEffect(() => {
    // 确认当前处于浏览器环境
    setIsBrowser(true);
    // 加载ace资源
    import("ace-builds/src-noconflict/mode-java");
    import("ace-builds/src-noconflict/theme-github");
    import("ace-builds/src-noconflict/ext-language_tools");
  }, []);

  function onChange(newValue) {
    setSearch(newValue);
    console.log("change", newValue);
  }

  // 未进入浏览器环境时显示加载占位
  if (!isBrowser) {
    return <div>加载中...</div>;
  }

  // 动态导入AceEditor组件
  const AceEditor = require("react-ace").default;
  return (
    <AceEditor
      mode="java"
      theme="github"
      onChange={onChange}
      name="UNIQUE_ID_OF_DIV"
      editorProps={{ $blockScrolling: true }}
    />
  );
}
export default AceEditorTest;

额外修正:原代码的小问题

原onChange函数中使用e.target.value是错误的——react-ace的onChange回调直接返回编辑器的内容字符串,而非事件对象;同时原代码中newValue未定义,需修正为回调参数的变量名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:45:36