首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我直接访问url时,如何修复“无法读取未定义的属性'document‘”?Next.js和apexcharts

当我直接访问url时,如何修复“无法读取未定义的属性'document‘”?Next.js和apexcharts
EN

Stack Overflow用户
提问于 2018-12-22 09:09:17
回答 2查看 4.5K关注 0票数 2

我使用的是react-apexcharts:https://github.com/apexcharts/react-apexcharts

当我导入一个将库导入到页面中的组件时,当我导航到它(客户端路由)时,它工作得很好。但是,当直接使用URL访问页面时,我得到一个错误:

代码语言:javascript
复制
Cannot read property 'document' of undefined
TypeError: Cannot read property 'document' of undefined
at Object.<anonymous> (C:\Users\a\Desktop\b\b-client\node_modules\apexcharts\dist\apexcharts.min.js:1:433939)
at Object.<anonymous> (C:\Users\a\Desktop\b\b-client\node_modules\apexcharts\dist\apexcharts.min.js:1:433950)
at s (C:\Users\a\Desktop\b\b-client\node_modules\apexcharts\dist\apexcharts.min.js:1:395)
at Object.<anonymous> (C:\Users\a\Desktop\b\b-client\node_modules\apexcharts\dist\apexcharts.min.js:1:169139)
at s (C:\Users\a\Desktop\b\b-client\node_modules\apexcharts\dist\apexcharts.min.js:1:395)
at Object.<anonymous> (C:\Users\a\Desktop\b\b-client\node_modules\apexcharts\dist\apexcharts.min.js:1:456290)
at s (C:\Users\a\Desktop\b\b-client\node_modules\apexcharts\dist\apexcharts.min.js:1:395)
at C:\Users\a\Desktop\b\b-client\node_modules\apexcharts\dist\apexcharts.min.js:1:769
at C:\Users\a\Desktop\b\b-client\node_modules\apexcharts\dist\apexcharts.min.js:1:780
at C:\Users\a\Desktop\b\b-client\node_modules\apexcharts\dist\apexcharts.min.js:1:143
at Object.<anonymous> (C:\Users\a\Desktop\b\b-client\node_modules\apexcharts\dist\apexcharts.min.js:1:263)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)

值得注意的是,我使用的是next.js,它使用服务器端渲染。

代码是无关紧要的,我只是根据他们的github文档创建了示例组件:

代码语言:javascript
复制
import Chart from 'react-apexcharts'
import React, { Component } from "react";

class ChartExample extends Component {
constructor(props) {
    super(props);

    this.state = {
        options: {
            chart: {
                id: 'apexchart-example'
            },
            xaxis: {
                categories: [1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998]
            }
        },
        series: [{
            name: 'series-1',
            data: [30, 40, 45, 50, 49, 60, 70, 91]
        },
        {
            name: 'series-2',
            data: [90, 210, 105, 50, 43, 99, 333, 4]
        }]
    }
}
render() {
    return (
        <Chart options={this.state.options} series={this.state.series} type="bar" width={500} height={320} />
    )
}
}

export default ChartExample;

我会定期导入:

代码语言:javascript
复制
import ChartExample from "../../components/dashboard/ChartExample";

我该如何解决这个问题呢?我认为这是next.js服务器端呈现的一个问题

EN

回答 2

Stack Overflow用户

发布于 2019-11-16 17:58:46

解决此问题的一种方法是使用nextjs的动态导入。

代码语言:javascript
复制
import dynamic from 'next/dynamic'
const Chart = dynamic(() => import('react-apexcharts'), {ssr:false})

没有这种情况,你的服务器在第一次启动时仍然会抱怨文档,但这不会在客户端反映出来

票数 8
EN

Stack Overflow用户

发布于 2018-12-24 00:47:32

图表库在呈现期间需要一个在SSR期间不存在的窗口对象。

我建议使用https://github.com/zeit/next.js/#dynamic-import (带有选项{ssr: false})来跳过在服务器上的渲染。此外,库没有加载到服务器上,这减少了包的大小……

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53892321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档