将 mapbox-gl-geocoder 添加到 gatsby.js 时 gatsby 构建失败

gatsby build fails when adding mapbox-gl-geocoder to gatsby.js

我有一个带有 mapbox-gl 的 gatsby.js 应用程序,在我尝试包含 mapbox-gl-geocoder 添加搜索功能的包。

我使用 npm 安装它如下:

npm install mapbox/mapbox-gl-geocoder --save

然后,将其添加到 React 组件中:

import '@mapbox/mapbox-gl-geocoder/lib/mapbox-gl-geocoder.css';
import MapboxGeocoder from '@mapbox/mapbox-gl-geocoder';

并在 useEffect 挂钩内:

  map.addControl(
      new MapboxGeocoder({
        accessToken: mapboxgl.accessToken,
        zoom: 20,
        placeholder: 'Enter City',
        mapboxgl: mapboxgl
      }), 'top-left'
    );

在本地,当我 运行 gatsby develop 它正常工作,但是当我用 Netlify 部署它时,我收到以下错误:

:24:21 PM: error Generating SSR bundle failed
1:24:21 PM: Can't resolve 'electron' in '/opt/build/repo/node_modules/@mapbox/mapbox-sdk/node_modules/got'
1:24:21 PM: If you're trying to use a package make sure that 'electron' is installed. If you're trying to use a local file make sure that the path is correct.

似乎 mapbox-gl-geocoder 依赖于@mapbox/mapbox-sdk 而 mapbox-sdk 依赖于以某种方式需要电子?

我在 got npm 页面中唯一能读到的关于电子的内容如下:

Electron support has been removed
The Electron net module is not consistent with the Node.js http module. See #899 for more info.

无论如何,我尝试用 npm 安装 electron 以查看错误是否消失,并且构建开始失败并出现新错误,表明 window 对象不可用。

10:35:45 AM: error "window" is not available during server side rendering.

通过谷歌搜索这个错误让我找到了一些关于不在 gatsby-node.js 中加载包的答案,但这也没有帮助。

在 Gatsby 中处理使用 window 的第三方模块时,您需要将 null 加载器添加到其自己的 webpack 配置中,以避免在 SSR 期间进行转译( S服务器-SideR渲染)。这是因为 gatsby develop 出现在浏览器中,而 gatsby build 出现在 Node 服务器中,显然没有 window or other global objects.

exports.onCreateWebpackConfig = ({ stage, loaders, actions }) => {
  if (stage === "build-html") {
    actions.setWebpackConfig({
      module: {
        rules: [
          {
            test: /@mapbox/,
            use: loaders.null(),
          },
        ],
      },
    })
  }
}

请记住,test 值是一个正则表达式,将匹配 node_modules 下的文件夹,因此请确保 /@mapbox/ 是正确的名称。

使用 patch-package 可能有效,但请记住,您正在添加另一个包,另一个可能会影响性能的捆绑文件。建议的代码段是构建应用程序时发生的内置解决方案。