window 坑

服务端组件在 Node 环境执行,没有 window。如果在服务端组件里直接写 window.innerWidth,会在构建/服务端渲染时直接抛 ReferenceError: window is not defined,导致 build 失败。

❌ 错误写法(服务端组件里直接读 window):

// 服务端组件(默认)
export default function Page() {
  return <div>{window.innerWidth}</div> // 构建期就报错
}

正确做法:把读 window 的逻辑放进客户端组件,用 useEffect 包住(只在浏览器执行)。下面两个客户端组件对比:

⚠️ 渲染期读 window(会 mismatch)

window.innerWidth = undefined

打开浏览器 Console,会看到 hydration 警告:服务端渲染的undefined 和客户端渲染的真实值不一致。

✅ useEffect 里读 window(正确)

window.innerWidth = 加载中…

服务端先渲染"加载中…",浏览器水合后 useEffect 执行,才读出真实宽度。无 mismatch。