但是该循环引用还是循环引用 循环引用是模块加载的问题
建议使用 import()动态导入 或者require()
马赛克有分享过一个动态模块的写法
我也学习模仿了
/**
* 异步引用脚本方法
* @deprecated 一般使用require()同步加载
* @param importer import()
* @returns 动态导入的模块
*/
function requireAsync<T extends Promise<any>>(importer: T): Awaited<T> {
//获取动态导入的模块
let modules: Awaited<T> = Object.create(null);
importer.then(exports => modules = exports);
//处理异步返回
return new Proxy(modules, {
get(target: Awaited<T>, module: string) {
//获取模块
if (modules[module]) return modules[module];
//调用模块
return new Proxy(modules, {
get(target: Awaited<T>, property: string) {
if (modules[module]) return modules[module][property];
console.log(`${modules[module]}模块未完载, 调用${property}方法失败!`);
return null;
},
});
},
});
}
不过后来想了下 还不如补个require的全局声明直接用require的好
declare global {
/**
* 同步引用脚本方法
* @param module 模块加载路径
* @example require<typeof import('./Global')>('./Global').default;
* @returns 返回同步加载的模块
*/
function require<T = { default: any }>(module: string): T;
}
如果出现了循环引用的问题还是多琢磨琢磨怎么组织代码的问题 模块加载顺序就随它去吧 还是不care的好