出现此问题的原因是因为您在代码中的某个位置使用了document 全局对象,并且因为gatsby develop 是由浏览器呈现的,其中有window 和文档全局对象,但是它可以编译,当你运行gatsby build时,代码在Node服务器中编译,这里没有window或document变量,因为它们甚至还没有定义,它们是在SSR中解析的客户端变量( S服务器-Side R渲染)。
这是正在发生的事情的极端减少,您可以在Debugging HTML Builds docs找到更详细的解释。
要修复/绕过此问题,您只需在使用 document 对象的地方添加以下条件。
if(window !== "undefined"){
// your document or window manipulation
}
window 或document 在条件中可以同时使用,它们在绕过服务器端渲染方面是等效的。
如果您没有在项目中使用document,如果您的某些依赖项(第三方)正在使用它(即:画布、地图、使用 JavaScript 计算的滑块等),问题可能仍然会出现。如果这是您的情况,绕过它的方法是通过添加 null 加载程序来忽略 webpacks 捆绑:
exports.onCreateWebpackConfig = ({ stage, loaders, actions }) => {
if (stage === "build-html" || stage === "develop-html") {
actions.setWebpackConfig({
module: {
rules: [
{
test: /bad-module/,
use: loaders.null(),
},
],
},
})
}
}
其中/bad-module/ 是正则表达式 (test)(这就是为什么在斜杠之间,/)。在这种情况下,您需要将bad-module 替换为node_modules 中的依赖文件夹名称。