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

执行npm run build生成静态页面时出现window未定义错误

Next.js npm run build 静态页面生成错误:ReferenceError: window is not defined

错误日志

ReferenceError: window is not defined
at 99869 (/Users/admin/Desktop/raff/raff-frontend/.next/server/chunks/7450.js:1:2175763)
at t (/Users/admin/Desktop/raff/raff-frontend/.next/server/webpack-runtime.js:1:143)
at 97450 (/Users/admin/Desktop/raff/raff-frontend/.next/server/chunks/7450.js:1:2619858)
at t (/Users/admin/Desktop/raff/raff-frontend/.next/server/webpack-runtime.js:1:143)
at 92540 (/Users/admin/Desktop/raff/raff-frontend/.next/server/chunks/5644.js:1:61698)
at t (/Users/admin/Desktop/raff/raff-frontend/.next/server/webpack-runtime.js:1:143)
at 49814 (/Users/admin/Desktop/raff/raff-frontend/.next/server/chunks/5644.js:1:10198)
at Object.t [as require] (/Users/admin/Desktop/raff/raff-frontend/.next/server/webpack-runtime.js:1:143)
at require (/Users/admin/Desktop/raff/raff-frontend/node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js:16:18490)
at I (/Users/admin/Desktop/raff/raff-frontend/node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js:12:94362)
✓ Generating static pages (33/33)

出错页面路径

  • /login
  • /login2
  • /login3
  • /agreements
  • /calendar
  • /chat
  • /home-empty-states
  • /integrations
  • /
  • /settings/company-settings
  • /settings/general-settings
  • /settings/integrations
  • /settings/notification-settings
  • /settings/privacy-security
  • /settings/profile-settings
  • /teams

解决方法

这个错误是因为Next.js在服务端渲染/静态生成阶段访问了仅浏览器环境存在的window对象,以下是具体修复方式:

1. 直接判断window是否存在

修改代码中直接访问window的逻辑,先判断是否处于浏览器环境:

// 错误写法
const screenWidth = window.innerWidth;

// 正确写法
let screenWidth = 0;
if (typeof window !== 'undefined') {
  screenWidth = window.innerWidth;
}

2. 用useEffect延迟执行客户端逻辑

在React组件中,使用useEffect确保代码仅在客户端渲染时执行:

import { useEffect } from 'react';

function LayoutComponent() {
  useEffect(() => {
    // 这里可安全访问window
    document.title = `当前窗口高度: ${window.innerHeight}`;
  }, []);

  return <div>页面内容</div>;
}

export default LayoutComponent;

3. 标记组件为客户端组件(App Router)

如果使用Next.js App Router,在依赖window的组件顶部添加'use client'指令,强制组件在客户端渲染:

'use client';

import { useState, useEffect } from 'react';

export default function UserProfile() {
  const [theme, setTheme] = useState('light');

  useEffect(() => {
    // 从localStorage读取主题,依赖window对象
    const savedTheme = window.localStorage.getItem('theme');
    if (savedTheme) setTheme(savedTheme);
  }, []);

  return <div>当前主题: {theme}</div>;
}

4. 动态导入第三方依赖并禁用SSR

如果错误由第三方库导致,用Next.js的dynamic导入并关闭SSR:

import dynamic from 'next/dynamic';

// 禁用SSR加载依赖window的第三方组件
const ChartComponent = dynamic(() => import('react-chartjs-2'), {
  ssr: false,
  loading: () => <p>图表加载中...</p>
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 03:49:56