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

在Next.js应用中使用emoji-mart时出现ReferenceError: window未定义错误

解决Next.js中使用emoji-mart出现window is not defined的问题

问题原因

Next.js默认采用服务端渲染(SSR),服务端执行代码时不存在浏览器环境的window对象,但emoji-mart包的初始化逻辑直接依赖window,因此触发该错误。

解决方案

方法1:使用Next.js动态导入(推荐)

通过next/dynamic动态导入emoji-mart组件,并禁用服务端渲染,确保组件仅在客户端加载:

import dynamic from 'next/dynamic';

// 动态导入Picker组件,关闭SSR
const Picker = dynamic(() => import('emoji-mart').then(mod => mod.Picker), {
  ssr: false,
});

export default function EmojiPicker() {
  return <Picker />;
}

方法2:组件内判断客户端环境

直接导入组件后,通过useEffect确认处于客户端环境再渲染:

import { useState, useEffect } from 'react';
import { Picker } from 'emoji-mart';

export default function EmojiPicker() {
  const [isClient, setIsClient] = useState(false);

  useEffect(() => {
    // 组件挂载后标记为客户端环境
    setIsClient(true);
  }, []);

  // 仅在客户端渲染Picker
  return isClient ? <Picker /> : null;
}

方法3:修改webpack配置(不推荐)

若上述方法不适用,可在next.config.js中配置fallback,但可能影响整体性能:

/** @type {import('next').NextConfig} */
const nextConfig = {
  webpack: config => {
    config.resolve.fallback = {
      ...config.resolve.fallback,
      window: false,
    };
    return config;
  },
};

module.exports = nextConfig;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:10:35