Vite配置SSR时如何正确处理客户端和服务器端的模块分离?
我在用 Vite 搭建 SSR 项目时,发现有些模块只能在客户端运行(比如用到 window 对象),但构建时服务端也会尝试打包这些代码,导致报错。我试过用 import.meta.env.SSR 判断环境,但似乎在构建阶段就出错了。
比如下面这段代码,在服务端渲染时就会报 ReferenceError: window is not defined:
export function useClientOnlyHook() {
if (import.meta.env.SSR) return;
const width = window.innerWidth; // 服务端没有 window
return width;
}
或者更简单——用Vue/React的话,把这类逻辑放
onMounted或useEffect里,SSR自动不会执行:根本原因就是Vite构建时会把所有import都打包进去,你得让那些"危险import"变成运行时才加载的动态import,build阶段就找不到window了。