ReferenceError: ResizeObserver is not defined:Gatsby with nivo

ReferenceError: ResizeObserver is not defined:Gatsby with nivo

我使用@nivo/pie 和 "gatsby": "^3.13.0"。 但是当我构建 gatsby 时出现错误。 WebpackError: ReferenceError: ResizeObserver is not defined Nivo 的版本是“@nivo/pie”:“^0.79.1”。 我不知道要解决它。如果您能给我一些建议,我将不胜感激。

这里是使用 nivo 饼图的 React 代码。

PieChart.tsx

import React from 'react'
import { ResponsivePie } from '@nivo/pie'

const PieChart: React.FC = ({ data }) => {
  return (
    <>
      <div>
        <ResponsivePie
            data={data}
            margin={{ top: 30, right: 80, bottom: 70, left: 80 }}
            borderColor={{
                from: 'color',
                modifiers: [
                    [
                        'darker',
                        0.2,
                    ],
                ],
            }}
            arcLabelsTextColor={{
                from: 'color',
                modifiers: [
                    [
                        'darker',
                        2,
                    ],
                ],
            }}
            fill={[
                {
                    match: {
                        id: 'ruby',
                    },
                    id: 'dots',
                },
            ]}
            legends={[
              {
                  anchor: 'bottom-right',
                  direction: 'column',
                  justify: false,
                  translateX: 0,
                  translateY: -1,
              },
          ]}
          />
      </div>
    </>
  )
}

export default PieChart

============================================= ======================

我可以在更新 gatsby-node.js 后修复它。但是我得到了另一个错误 WebpackError: Minified React error #130;。我可以通过这个最终代码修复它。没有构建错误。

PieChart.tsx

import React from 'react'
import { ResponsivePie } from '@nivo/pie'

const PieChart: React.FC = ({ data }) => {
  return (
    <>
        {typeof window !== 'undefined' && ResponsivePie &&
        <ResponsivePie
            data={data}
            ...  
        />}
    </>
  )
}

export default PieChart

谢谢。

尝试在 Gatsby 的 SSR 上使用空加载器。在你的 gatsby-node.js:

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

通常这种问题(gatsby develop OK vs gatsby build KO)与webpack在服务器上的捆绑有关(Server-Side Rendering),尤其是在像图表模块那样处理 third-party dependencies that interact with the window or other global objects(例如 document)时。发生这种情况是因为当您 运行 gatsby build 您的代码由节点服务器解释时,那里还没有 window 可用。另一方面,gatsby develop 是由浏览器解释的,那里有

使用这种方法,您将向 webpack 添加虚拟加载程序 (null) 以加载对 client-side 的依赖,其中 window 可用。

请记住 test: /@nivo\/pie/ 是测试 node_modules 文件夹的正则表达式(这就是斜杠之间的原因 /),因此请确保 /@nivo\/pie/ 是一个有效路径。