【问题标题】:ReferenceError: ResizeObserver is not defined with nivo and NextJSReferenceError: ResizeObserver 没有用 nivo 和 NextJS 定义
【发布时间】:2022-04-28 15:21:45
【问题描述】:

我想将 nivo 与 Next 一起使用,但当我加载包含使用 nivo 制作的饼图的页面时,我收到此错误:ReferenceError: ResizeObserver is not defined

我的Pie.js 组件:

import { ResponsivePie } from "@nivo/pie";

export const data = [
  {
    id: "c",
    label: "c",
    value: 80,
    color: "hsl(8, 70%, 50%)",
  },
  {
    id: "lisp",
    label: "lisp",
    value: 188,
    color: "hsl(122, 70%, 50%)",
  },

  {
    id: "go",
    label: "go",
    value: 161,
    color: "hsl(111, 70%, 50%)",
  },
];

export default function MyPie({ data }) {

    return (
        <ResponsivePie
            data={data}
            margin={{ top: 40, right: 80, bottom: 80, left: 80 }}
            innerRadius={0.5}
            padAngle={0.7}
            cornerRadius={3}
            activeOuterRadiusOffset={8}
            borderWidth={1}
            borderColor={{ from: "color", modifiers: [["darker", 0.2]] }}
            arcLinkLabelsSkipAngle={10}
            arcLinkLabelsTextColor="#333333"
            arcLinkLabelsThickness={2}
            arcLinkLabelsColor={{ from: "color" }}
            arcLabelsSkipAngle={10}
            arcLabelsTextColor={{ from: "color", modifiers: [["darker", 2]] }}
            defs={[
            {
                id: "dots",
                type: "patternDots",
                background: "inherit",
                color: "rgba(255, 255, 255, 0.3)",
                size: 4,
                padding: 1,
                stagger: true,
            },
            {
                id: "lines",
                type: "patternLines",
                background: "inherit",
                color: "rgba(255, 255, 255, 0.3)",
                rotation: -45,
                lineWidth: 6,
                spacing: 10,
            },
            ]}
        />
    )
};

我的chart.js 页面:

import MyPie, { data } from "../components/Pie";

import homeStyles from "../styles/Home.module.css";

function Chart() {
  return (
    <div className={homeStyles.divchart}>
      <MyPie data={data}/>
    </div>
  );
};
export default Chart;

此错误仅在使用 ResponsivePie 而不是 Pie 时出现。我也尝试让它与 React 项目一起使用,但虽然我没有收到此错误,但似乎没有显示任何内容。

编辑:

经过一番调查,@nivo/core 0.79.0 依赖似乎有问题。我们应该在 GitHub 存储库上打开一个问题。我做了一些更改以检查它是否是由我的 Next.js 版本引起的,但该错误仅发生在 @nivo/core 0.79.0 中。

【问题讨论】:

    标签: reactjs next.js nivo-react resize-observer


    【解决方案1】:

    事实证明,这是 0.79.0 版本中引入的错误的结果,该错误已在 https://github.com/plouc/nivo/pull/1886 中修复。

    您应该将@nivo/core 更新为0.79.1


    看起来@nivo/pie 与 Next.js 服务器端渲染不兼容,因为它使用了 Web API (ResizeObserver)。

    为避免在服务器上导入MyPie(以及随后的ResponsivePie),您可以仅在客户端使用next/dynamicssr: false 动态导入它。

    import dynamic from "next/dynamic";
    import { data } from "../components/Pie";
    import homeStyles from "../styles/Home.module.css";
    
    const MyPie = dynamic(() => import("../components/Pie"), {
        ssr: false
    })
    
    function Chart() {
        return (
            <div className={homeStyles.divchart}>
                <MyPie data={data}/>
            </div>
        );
    };
    
    export default Chart;
    

    【讨论】:

    • 但它可以在 0.78.0 上运行,根据这个库的创建者的说法,它完全符合服务器端的要求。每种类型的图表(条形图、饼图、折线图等)都会发生错误。然后我会怀疑最后一个@nivo/core 版本中存在错误,除非旧版本中没有使用resizeObserver,我不相信
    • 那么您很可能是正确的,这可能是0.79.0 中引入的错误。可能与此未发布的修复有关:github.com/plouc/nivo/pull/1886.
    • 就是这样,我去了 discord 服务器,他告诉我他正在修复
    【解决方案2】:

    很可能代码正在服务器端 (SSR) 上运行,而 ResizeObserver 在那里不存在。您应该尝试确保您的代码仅在客户端执行。

    我很难告诉你怎么做,因为我不知道你的设置是什么。如果定义了ResizeObserver,您可能只需添加一个检查以仅运行该部分代码。

    我希望这至少可以为您指明正确的方向。

    【讨论】:

    • 据我所知,我的页面是 CSR,我没有使用任何 getServerProps()getStaticProps() 功能。我尝试运行一个新的 Next 项目并安装@nivo/core@nivo/pie,但错误一直显示,而我按照所有步骤进行操作(除了安装“nivo”,因为我信任官方文档并且它在npm i nivo 时不起作用)描述这里:learnjsx.com/category/4/posts/nextjs-nivo
    • 其实问题是随机出现的
    • 所以我做了一个观察:我运行服务器并使用Pie 而不是ResponsivePie,一旦页面加载,我将代码更改为ResponsivePie,它显示了饼图,但如果我刷新页面,我得到了错误。我无法解释这个......
    猜你喜欢
    • 2021-10-11
    • 2021-04-11
    • 2021-10-08
    • 2021-03-30
    • 2022-01-11
    • 2020-09-18
    • 1970-01-01
    • 2019-08-07
    • 2016-01-02
    相关资源
    最近更新 更多