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

如何强制Gatsby在报错时完成构建?解决SSR中window未定义问题

解决Gatsby构建时"window is not defined"的方案

1. 延迟第三方依赖的加载

如果错误来自第三方包,不要在组件顶部直接import,改用动态导入+浏览器环境判断,确保只在客户端加载依赖:

import React, { useEffect, useState } from 'react';

const MyComponent = () => {
  const [TargetModule, setTargetModule] = useState(null);

  useEffect(() => {
    import('存在问题的第三方包').then(mod => {
      setTargetModule(mod.default || mod);
    });
  }, []);

  if (!TargetModule) return <div>加载中...</div>;

  return <TargetModule />;
};

export default MyComponent;

2. 全局Mock window对象

在项目根目录创建gatsby-ssr.js,给SSR过程添加window的模拟对象,避免报错:

exports.onRenderBody = ({ setPreBodyComponents }) => {
  setPreBodyComponents([
    <script
      dangerouslySetInnerHTML={{
        __html: `
          if (typeof window === 'undefined') {
            global.window = {};
            // 按需补充需要mock的属性,比如document、navigator等
            window.document = { createElement: () => ({}) };
            window.navigator = { userAgent: 'ssr' };
          }
        `,
      }}
    />,
  ]);
};

3. 修正Webpack Null Loader配置

之前的配置可能没匹配到正确的依赖包名,将/filler-module/替换为实际出问题的依赖包名称,并且仅在build-html阶段生效:

exports.onCreateWebpackConfig = ({ actions, loaders, stage }) => {
  if (stage === 'build-html') {
    actions.setWebpackConfig({
      module: {
        rules: [
          {
            test: /实际有问题的依赖包名/,
            use: loaders.null(),
          },
        ],
      },
    });
  }
};

4. 使用官方推荐的代码分割工具

安装@loadable/component插件,自动处理SSR与客户端的加载差异:

npm install @loadable/component

在组件中引入使用:

import loadable from '@loadable/component';

const LoadableTarget = loadable(() => import('存在问题的第三方包'), {
  fallback: <div>加载中...</div>,
});

const MyComponent = () => <LoadableTarget />;

export default MyComponent;

关于强制跳过检查

Gatsby没有官方的强制跳过SSR检查的选项,强行跳过会导致页面渲染异常(如空白、功能失效),不建议这么做。优先通过上述方案解决根本问题,保证SSR与客户端渲染的一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:22:11