Gatsby 盖茨比制造错误“;“未定义文档”;仅在Netlify上

Gatsby 盖茨比制造错误“;“未定义文档”;仅在Netlify上,gatsby,netlify,Gatsby,Netlify,当我在Netlify上构建时,我在404页面上收到一个文档未定义构建错误,但该构建在我的本地计算机上成功运行。我也没有在我的页面中引用任何文档或窗口对象 我已尝试删除404页,但相同的错误出现在列表的下一页 这是我的404页 import React from "react"; import styled from "styled-components"; import AniLink from "gatsby-plugin-transition-link/AniLink"; const Co

当我在Netlify上构建时,我在404页面上收到一个文档未定义构建错误,但该构建在我的本地计算机上成功运行。我也没有在我的页面中引用任何文档或窗口对象

我已尝试删除404页,但相同的错误出现在列表的下一页

这是我的404页

import React from "react";
import styled from "styled-components";
import AniLink from "gatsby-plugin-transition-link/AniLink";

const Container = styled.div`
  width: 100vw;
  height: 100vh;
  margin: 0;
  padding: 0;
  background: black;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  z-index: 800;
  color: white;
`;

const Heading = styled.h1`
  font-family: "URWAccidalia";
  font-size: 50px;
  color: white;
  text-align: center;
  z-index: 805;
`;

const HomeButton = styled(AniLink)`
  font-family: "URWAccidalia";
  font-size: 30px;
  color: white;
  text-align: center;
  margin-top: 50px;
  z-index: 806;
  background: none;
  border: none;
  text-decoration: none;
  opacity: 1;
`;

const ErrorPage = () => {
  return (
    <Container>
      <Heading>Page Not Found</Heading>
      <HomeButton fade to="/">
        Go Back to Home
      </HomeButton>
    </Container>
  );
};

export default ErrorPage;
简短回答:Gatsby在构建时预先渲染组件,以静态方式为其服务(模拟服务器端渲染)。确保仅在安装组件(客户端)时访问浏览器上下文变量,如
文档
。您可以使用useState和useEffect挂钩的组合来实现这一点

盖茨比试图构建静态服务的页面,但它缺少构建时的
文档
全局变量,该变量仅在浏览器上下文中可用

在您的情况下,我认为问题可能是由AniLink组件在构建时触发的,因为它使用
文档
变量,如您所见。尝试延迟AniLink或父组件的实例化

例如:

const ErrorPage = () => {
  const [canRender, setCanRender] = useState(false);

  useEffect(() => setCanRender(true));

  return (
    <Container>
      {
        canRender ?
          <div>
            <Heading>Page Not Found</Heading>
            <HomeButton fade to="/">
              Go Back to Home
            </HomeButton>
          </div>
        : null
    }
    </Container>
  );
}
您可以通过以下更改解决问题:

const Page = () => 

  const [hasNavTag, setHasNavTag] = useState(false);

  useEffect(() => setHasNavTag(document.querySelector('nav') != null) );

  return (
    <div>
      { 
        hasNavTag
          ? `This is page has a nav tag`
          : `This page doesn't have a nav tag` 
      }
    </div>
  );
}

const Page=()=>
const[hasNavTag,setHasNavTag]=useState(false);
useffect(()=>setHasNavTag(document.querySelector('nav')!=null));
返回(
{ 
hasNavTag
“这是一个有导航标签的页面`
:`此页面没有导航标记`
}
);
}
迟做总比不做好:)

const Page = () => {
  return (
    <div>
      { 
        document.querySelector('nav')
          ? `This is page has a nav tag`
          : `This page doesn't have a nav tag` 
      }
    </div>
  );
}

const Page = () => 

  const [hasNavTag, setHasNavTag] = useState(false);

  useEffect(() => setHasNavTag(document.querySelector('nav') != null) );

  return (
    <div>
      { 
        hasNavTag
          ? `This is page has a nav tag`
          : `This page doesn't have a nav tag` 
      }
    </div>
  );
}