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

Next.js集成Zego Cloud遇document is not defined错误(已用use client)

解决Next.js集成Zego Cloud时的'document is not defined'错误

即使加了'use client'还报错,核心原因是Zego SDK或相关代码在Next.js预渲染(SSR/SSG)阶段就执行了访问document的逻辑——客户端组件虽然在浏览器端会接管,但预渲染时Node.js环境里还是会跑一遍组件顶层的代码,这时候document不存在就会报错。

给你几个靠谱的解决方法:

方法1:用Next.js动态导入禁用SSR

把Zego相关的组件单独抽成一个文件,然后用dynamic导入并关闭SSR,确保这个组件只在浏览器端加载:

// 页面文件(比如page.js)
import dynamic from 'next/dynamic';

// 动态导入Zego组件,禁用SSR
const ZegoLiveComponent = dynamic(() => import('./components/ZegoLive'), {
  ssr: false,
  loading: () => <div>加载中...</div> // 可选:加载状态提示
});

export default function Home() {
  return (
    <div>
      <ZegoLiveComponent />
    </div>
  );
}

然后在ZegoLive.jsx里正常写客户端逻辑,加'use client'即可。

方法2:在组件内部延迟初始化SDK

如果不想拆分组件,就在客户端组件里用useEffect延迟加载/初始化Zego SDK,确保只在浏览器环境执行:

'use client';
import { useEffect, useState } from 'react';

export default function ZegoLive() {
  const [zegoEngine, setZegoEngine] = useState(null);

  useEffect(() => {
    // 先判断是否在浏览器环境
    if (typeof document === 'undefined') return;

    // 动态加载Zego SDK并初始化
    import('zego-express-engine-webrtc').then((ZegoExpressEngine) => {
      const engine = new ZegoExpressEngine(你的APPID, 你的服务器密钥);
      setZegoEngine(engine);
      // 这里可以继续写初始化后的逻辑,比如登录房间等
    });

    // 组件卸载时销毁实例
    return () => {
      if (zegoEngine) {
        zegoEngine.destroy();
      }
    };
  }, []);

  // SDK未初始化时显示加载状态
  if (!zegoEngine) {
    return <div>正在准备直播组件...</div>;
  }

  return (
    <div>
      {/* 这里写Zego相关的UI和逻辑 */}
    </div>
  );
}

注意点

  • 不要在'use client'文件的顶层直接导入并初始化Zego SDK,比如不要在组件函数外面写import ZegoExpressEngine from 'zego-express-engine-webrtc'然后直接new实例,这种代码会在预渲染阶段执行。
  • 如果用Zego的官方UI组件(比如ZegoUIKitPrebuilt),同样要套动态导入+ssr: false,因为这些UI组件内部可能直接访问了document。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:57:10