【问题标题】:Next JS dynamic import for named export命名导出的下一个 JS 动态导入
【发布时间】:2021-07-09 22:44:20
【问题描述】:

我正在学习下一个js。我想调用https://www.npmjs.com/package/encrypt-storage的函数getItem

使用下面的代码,但我得到TypeError: EncryptStorage.getItem is not a function

import dynamic from 'next/dynamic';
const EncryptStorage = dynamic(() => import('encrypt-storage').then((mod) => mod.EncryptStorage(process.env.NEXT_PUBLIC_SKK)), { ssr: false });
console.log(EncryptStorage.getItem('aa'));

请帮我整理一下。

【问题讨论】:

    标签: javascript reactjs webpack next.js


    【解决方案1】:

    tl;dr:您需要使用await import(...) 而不是dynamic(() => import(...)),因为后者用于组件。

    加长版

    这让我很困惑,而且文档并没有直接声明您不能使用 dynamic(...) 导入模块,只是说它应该用于导入组件:

    也可以使用动态导入来导入 React 组件,但在这种情况下,我们将它与 next/dynamic 结合使用,以确保它像任何其他 React 组件一样工作。

    确实,从维护者那里查看this comment,您不能使用dynamic(...) 导入模块,只能导入组件。

    鉴于此,这里有一个可能的解决方案:

    另外,请注意.getItem(...) 是一个需要在EncryptStorage实例 上调用的方法。

        // Needs to be ran in an `async` context or environment that supports top-level `await`s
        const EncryptStorage = (await import("encrypt-storage")).default;
        const encryptStorage = EncryptStorage(process.env.NEXT_PUBLIC_SKK);
        console.log(encryptStorage.getItem("aa"));
    

    还有,这是sandbox with a full working example

    【讨论】:

    • 非常感谢......你救了我的命!但是 .default 需要什么?导入后?
    • 使用.default 可确保您从模块导入默认导出。这在技术上不是必需的(如果你看at the sourceEncryptStorage 是默认导出)但是,我认为这是一个好习惯。 Javascript Info 对动态导入有很好的了解,如果您仍然好奇的话!
    • 如果我能早点找到你的答案,我的头上就会多出几缕头发
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2019-06-16
    • 2016-04-23
    • 2021-12-28
    • 2019-10-31
    • 2021-09-03
    • 1970-01-01
    相关资源
    最近更新 更多