解决方案及原理
- 分离公共部分:将A和B相互依赖的部分提取到一个新的模块C中。这样A和B都依赖C,避免了直接的循环依赖。原理是通过打破A和B之间的直接依赖关系,将依赖转移到一个独立的模块,从而消除循环。
- 延迟初始化:在模块中使用函数来延迟初始化依赖,而不是在模块顶层直接引用。当实际需要使用依赖时才去获取,这样可以避免模块加载时的循环依赖问题。原理是利用JavaScript的函数作用域和延迟执行机制,在模块初始化时不立即解析依赖,而是在调用相关函数时才去获取。
代码示例
- 分离公共部分
// common.ts
export const sharedVariable = 'This is a shared variable';
// moduleA.ts
import { sharedVariable } from './common';
export const aFunction = () => {
console.log(`Using shared variable in A: ${sharedVariable}`);
};
// moduleB.ts
import { sharedVariable } from './common';
export const bFunction = () => {
console.log(`Using shared variable in B: ${sharedVariable}`);
};
- 延迟初始化
// moduleA.ts
let bFunction: () => void;
export const aVariable = 'This is a variable in A';
export const setBFunction = (func: () => void) => {
bFunction = func;
};
export const aFunction = () => {
if (bFunction) {
bFunction();
}
};
// moduleB.ts
import { aVariable, setBFunction } from './moduleA';
export const bFunction = () => {
console.log(`Using variable from A in B: ${aVariable}`);
};
setBFunction(bFunction);