javascript - Next.js 中动态导入模块的单例对象

标签 javascript next.js

我试图在我的 Next.js 应用程序中拥有动态导入模块的 Singleton 实例。但是,我当前的实现似乎每次调用 getInstance 时都会初始化一个新实例。

这是 gui.js 中的实现:

let dynamicallyImportPackage = async () => {
    let GUI;

    await import('three/examples/jsm/libs/dat.gui.module.js')

    .then(module => {
        GUI = module.GUI
    })
    .catch(e => console.log(e))

    return GUI;
}

let GUI = (function () {
    let instance;

    return {
        getInstance: async () => {
            if (!instance) {
                let GUIModule = await dynamicallyImportPackage();
                instance = new GUIModule();
            }

            return instance;
        }
    };
})();

export default GUI;

我使用 GUI.getInstance().then(g => { ... }) 在 ES6 类函数中调用它

我通常会使用 React Context API 或 Redux 来实现这种共享状态,但对于这种情况,我需要它纯粹在 ES6 JS 中而不是 React 中。

最佳答案

您需要缓存 promise ,而不是实例,否则它将在第一个仍在加载且尚未分配 instance 变量时尝试再次导入模块(并实例化另一个实例) .

async function createInstance() {
    const module = await import('three/examples/jsm/libs/dat.gui.module.js')

    const { GUI } = module;

    return new GUI();
}

let instancePromise = null;

export default function getInstance() {
    if (!instancePromise) {
        instancePromise = createInstance()
        // .catch(e => {
        //    console.log(e); return ???;
        //    instancePromise = null; throw e;
        // });
    }
    return instancePromise;
}

关于javascript - Next.js 中动态导入模块的单例对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65484251/

相关文章:

javascript - 未捕获的语法错误 : Unexpected token in JSON at position 0

reactjs - 使用 Next.js 在构建时运行脚本

reactjs - 无法从静态文件夹加载图像

javascript - 如何在 next.js 中设置端口

javascript - 我需要一种方法来打破这个循环或者一种替代方法来做到这一点

javascript - 带去抖功能的 useEffect

javascript - html,JS搜索字段列表

javascript - 如何使用 jquery/javascript 更改/编辑标签的值?

node.js - 为什么 AWS amplify 无法识别更新的 Node 版本?

javascript - 在下一个 js react 项目中添加 favicon