生产环境和开发环境下,Gatsby中Webpack进程/浏览器的区别。

3

我一直在使用Gatsby仓库,注意到有时候甚至总是在调用window时,我的部署会失败并出现以下错误:

4:57:03 AM: failed Building static HTML for pages - 1.305s
4:57:03 AM: error "window" is not available during server side rendering.
4:57:03 AM: 
4:57:03 AM:   21 | }
4:57:03 AM:   22 | else {
4:57:03 AM: > 23 |     _btoa = btoa.bind(window);
4:57:03 AM:      | ^
4:57:03 AM:   24 |     helpers = function (url) {
4:57:03 AM:   25 |         return new URL(url);
4:57:03 AM:   26 |     };
4:57:03 AM: 
4:57:03 AM:   WebpackError: ReferenceError: window is not defined
4:57:03 AM:   
4:57:03 AM:   - helpers.js:23 
4:57:03 AM:     [gatsby-starter-default]/[web3-providers-ws]/lib/helpers.js:23:1
4:57:03 AM:   
4:57:03 AM:   - bootstrap:19 
4:57:03 AM:     gatsby-starter-default/webpack/bootstrap:19:1
4:57:03 AM:   
4:57:03 AM:   - index.js:24 
4:57:03 AM:     [gatsby-starter-default]/[web3-providers-ws]/lib/index.js:24:15
4:57:03 AM:   
4:57:03 AM:   - bootstrap:19 
4:57:03 AM:     gatsby-starter-default/webpack/bootstrap:19:1
4:57:03 AM:   
4:57:03 AM:   - index.js:44 
4:57:03 AM:     [gatsby-starter-default]/[web3-core-requestmanager]/lib/index.js:44:24
4:57:03 AM:   
4:57:03 AM:   - bootstrap:19 
4:57:03 AM:     gatsby-starter-default/webpack/bootstrap:19:1
4:57:03 AM:   
4:57:03 AM:   - index.js:22 
4:57:03 AM:     [gatsby-starter-default]/[web3-core]/lib/index.js:22:24
4:57:03 AM:   
4:57:03 AM:   - bootstrap:19 
4:57:03 AM:     gatsby-starter-default/webpack/bootstrap:19:1
4:57:03 AM:   
4:57:03 AM:   - index.js:29 
4:57:03 AM:     [gatsby-starter-default]/[web3]/lib/index.js:29:12
4:57:03 AM:   
4:57:03 AM:   - bootstrap:19 
4:57:03 AM:     gatsby-starter-default/webpack/bootstrap:19:1
4:57:03 AM:   
4:57:03 AM:   - bootstrap:19 
4:57:03 AM:     gatsby-starter-default/webpack/bootstrap:19:1
4:57:03 AM:   
4:57:03 AM:   - bootstrap:19 
4:57:03 AM:     gatsby-starter-default/webpack/bootstrap:19:1
4:57:03 AM:   
4:57:03 AM:   - bootstrap:19 
4:57:03 AM:     gatsby-starter-default/webpack/bootstrap:19:1

通过在我的gatsby-node.js文件中删除底部的进程/浏览器,似乎可以解决这个问题,当前文件如下:

const webpack = require("webpack");

exports.onCreateWebpackConfig = ({ stage, loaders, actions }) => {
    if(stage === "build-htmnl") {
        actions.setWebpackConfig({
            plugins: [
                new webpack.ProvidePlugin({
                    process: 'process/browser',
                }),
            ],
        })
    }
    actions.setWebpackConfig({
        plugins: [
            new webpack.ProvidePlugin({
                Buffer: [require.resolve("buffer/"), "Buffer"],
                process: 'process/browser',
            }),
        ],
        resolve: {
            fallback: {
                "crypto": false,
                "stream": require.resolve("stream-browserify"),
                "assert": false,
                "util": false,
                "http": false,
                "https": false,
                "os": false
            },
        },
    })
}

但是,一旦我这样做了,似乎会使我的useEffect不正确执行,也会使我附加到按钮上的onClick事件函数失效。我收到的错误信息如下:Uncaught (in promise) ReferenceError: process is not defined
有没有更简单的方法来解决这个问题?我对webpack和Gatsby之间的交互并不太熟悉。我想这可能只是一个条件判断,判断应用程序是处于开发状态还是生产状态。
1个回答

2
正如您在添加自定义webpack配置文档中所见,stage值可以通过以下方式进行变异:

  • develop:运行gatsby develop命令时。具有热重新加载和CSS注入到页面的配置。

  • develop-html:与develop相同,但在渲染HTML组件时,babel配置中不包含react-hmre。

  • build-javascript:生产JavaScript和CSS构建。创建路由JavaScript捆绑包以及JavaScript和CSS的公共块。

  • build-html:生成生产构建静态HTML页面

因此,是的,正如您所指出的,添加一个简单的条件应该可以设置process/browse,例如:

if(stage === "develop"){
  // gatsby develop stuff
}

1
再次感谢!看起来我只需要将 if (stage === "build-html") 更改为 if (stage === "build-html" || stage === "develop") 就可以解决我的问题了。 - Sabnock66

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接