使用 react-d3-tree 进行服务器端渲染的 NextJS 问题

Posted

技术标签:

【中文标题】使用 react-d3-tree 进行服务器端渲染的 NextJS 问题【英文标题】:NextJS issue with server side rendering with react-d3-tree 【发布时间】:2020-11-06 17:25:56 【问题描述】:

首先,我查看了react-d3-tree github 上的问题编号40 和95 我在 *** 上看不到任何对我有帮助的东西。我正在尝试实现 parseJSON 方法,这样我就可以从项目文件夹中获取自己的 JSON 文件,然后生成树形图。

让我们从我一开始所做的开始。我复制粘贴了在崩溃前工作了 2 秒的示例代码。原因?服务器端渲染。太好了,所以我找到了this from NextJS,它允许我禁用某些组件的 s-s-r。嘿,现在示例代码正在运行。让我们试试example code where they use external data!不,它找不到 parseJSON 方法。我不知道该怎么办,找不到任何东西来解决这个问题。我正在尝试导入这个与 s-s-r 有问题的函数,但因为它不是一个组件,所以我无法使用动态导入它,而且我无法正常导入,因为它会导致“未定义窗口”错误因为s-s-r。 以下是我主要的两个文件。

DynamicComponent.js [版本 1]

import dynamic from 'next/dynamic';

const Tree = dynamic(
  () => import('react-d3-tree'),
   s-s-r: false ,
);

export default Tree;

DynamicComponent.js [版本 2]

import dynamic from 'next/dynamic';

export const Tree = dynamic(
  () => import('react-d3-tree'),
   s-s-r: false ,
);

export const treeUtil = dynamic(
  () => import('react-d3-tree/src/util'),
   s-s-r: false ,
);

图表/index.js

import React from 'react';
import  Tree, treeUtil  from '../DynamicComponent';

const myTreeData = require('../fakeData.json');

class Diagram extends React.PureComponent 
  constructor() 
    super();

    this.state = 
      data: undefined,
    ;
  

  componentWillMount() 
    treeUtil.parseJSON(myTreeData)
      .then((data) => 
        this.setState( data );
      );
  

  render() 
    return (
      <div
        id="treeWrapper"
        style= width: '50em', height: '20em' 
      >
        <Tree data=this.state.data />
      </div>
    );
  


export default Diagram;

我在第 1 版中遇到的错误

ReferenceError: treeUtil is not defined

我在第 2 版中遇到的错误

TypeError: _DynamicComponent__WEBPACK_IMPORTED_MODULE_1__.treeUtil.parseJSON is not a function

请 ***,你是我唯一的希望。

【问题讨论】:

【参考方案1】:

我在 Cytoscape 中遇到了同样的问题,这是一个类似的库(但专门用于图形网络可视化)。这需要大量的尝试和错误,但解决方案是:

    动态导入组件 删除导入 JSON 并将其内联到 js 文件中。出于某种愚蠢的原因,这对我有用,而且是神奇的解决方法。 (您的 JSON 文件有多大?)在更糟糕的情况下尝试复制并粘贴到组件本身。

为你的组件试试这个:

// convert fakeData.json to fakeData.js
export default ...fake data here ;

import React from 'react';
import dynamic from 'next/dynamic'
import myTreeData from 'fakeData';

const Tree = dynamic(
  () => import('./dynamicComponent'),
    s-s-r: false 
);

// you can also delineate a loading component;


// converted to hooks for '21
 const Diagram = () => 
 
   const [data,setData] = useState();


  useEffect(() => 
    treeUtil.parseJSON(myTreeData)
      .then((data) => 
        setData(data);
      )
  ,[treeUtil,myTreeData,setData]);


    return (
      <div
        id="treeWrapper"
        style= width: '50em', height: '20em' 
      >
        <Tree data=data />
      </div>
    );
  

export default Diagram;

【讨论】:

【参考方案2】:

我猜treeUtil 不是一个react 组件,所以你不能使用dynamic 来导入它。正常导入就可以了。

import dynamic from 'next/dynamic';

export const Tree = dynamic(
  () => import('react-d3-tree'),
   s-s-r: false ,
);

export  default as treeUtil  from 'react-d3-tree/src/util';

【讨论】:

似乎不起作用,似乎是语法问题。我收到了这个错误:语法错误:意外的令牌,预期的“;”在“=”符号处。 对不起,我打错了。改成export default as treeUtil from 'react-d3-tree/src/util' 怎么样?

以上是关于使用 react-d3-tree 进行服务器端渲染的 NextJS 问题的主要内容,如果未能解决你的问题,请参考以下文章

如果你有 apollo react 钩子从后端获取数据,你如何使用 nextjs 进行服务器端渲染?

使用 redux 和 react 进行异步服务器端渲染

使用 react-router-relay 和 react-rails 进行服务器端渲染

使用 PHP 进行 React.js 服务器端渲染

如何在 React/redux 中进行服务器端渲染?

仅使用 Nuxt 进行服务器端渲染一页