如何在 Next.js 中使用带有命名导出的动态导入?

IT技术 reactjs next.js
2021-05-03 02:39:29

我有这个react组件。它对我来说很好用。

import { Widget } from 'rasa-webchat';

function CustomWidget(){
    return (
        <Widget
        initPayload={"payload"}
        socketPath={"/socket.io/"}
        customData={{"language": "en"}}
        />
    )
}
export default CustomWidget;

但是当我尝试在我的 next.js 网站上使用它时,它无法正常工作。

它给了我一个窗口未定义错误。

我想我通过使用动态导入器解决了这个特定的错误:

import dynamic from "next/dynamic";

const webchat = dynamic(
  () => {
    return import('rasa-webchat');
  },
  { ssr: false }
);

但是现在我无法弄清楚如何实际使用包中的小部件组件。

import { Widget } from 'rasa-webchat'出于某种原因,我可以这样做还是只是与 next.js 不兼容?如果可能,我该怎么做?

2个回答

Nextjs 是一个框架,允许您构建静态和服务器端渲染的应用程序。因此,它在后台使用 Nodesj,而 nodejs 中未定义窗口。在 react ssr 框架中访问窗口的唯一方法是 useEffect 钩子。您的动态导入解决方案是正确的,因为您正在客户端获取文件。我希望这是有道理的。

祝你有美好的一天

命名导出的语法略有不同。您可以将小部件与动态导入一起使用,如下所示:

import dynamic from 'next/dynamic';

const Widget = dynamic(
    () => import('rasa-webchat').then((mod) => mod.Widget),
    { ssr: false }
);

function CustomWidget(){
    return (
        <Widget
            initPayload={"payload"}
            socketPath={"/socket.io/"}
            customData={{"language": "en"}}
        />
    )
}

export default CustomWidget;

有关更多详细信息,请查看 Next.js动态导入文档