您好,我正在寻找一种有效的方法,将节点js分成几个单独的模块以进行更好的管理,但遇到了我无法克服的问题。我将在示例代码中进行解释:
server.js
const module1 = require('./lib/module1');
const module2 = require('./lib/module2');
module1.example();
/lib/module1.js
const module2 = require('./module2');
class Module1 {
constructor() {}
example() {
var test = module2.someNumber();
console.log(test);
}
getNumber() {
var number = 10;
return number;
}
}
module.exports = new Module1();
/lib/module2.js
const module1 = require('./module1');
class Module2 {
constructor() {}
someNumber() {
let some = module1.getNumber();
return some;
}
}
module.exports = new Module2();
所以我打电话给module1.example();
时出现错误:
module1.getNumber不是函数
我知道这是因为两个模块都互相请求,但是有解决方案吗?
答案 0 :(得分:0)
要处理这种周期性依赖关系,您可以只在需要的地方使用所需的模块:
module1.js
class Module1 {
constructor() {}
example() {
const module2 = require('./module2');
var test = module2.someNumber();
console.log(test);
}
getNumber() {
var number = 10;
return number;
}
}
module.exports = new Module1();
module2.js
class Module2 {
constructor() {}
someNumber() {
const module1 = require('./module1');
let some = module1.getNumber();
return some;
}
}
module.exports = new Module2();
但是通常最好尝试消除这种循环依赖性。
答案 1 :(得分:0)
节点中有许多技巧可以处理循环依赖,other answer中提到了一种方法,该方法涉及本地解析依赖。
另一种解决方案是将require
向下移动,使其成为使用另一个模块的模块的最后一行:
module1.js
class Module1 {
constructor() {}
example() {
var test = module2.someNumber();
console.log(test);
}
getNumber() {
var number = 10;
return number;
}
}
module.exports = new Module1();
const module2 = require('./module2');
module2.js
class Module2 {
constructor() {}
someNumber() {
let some = module1.getNumber();
return some;
}
}
module.exports = new Module2();
const module1 = require('./module1');
这样,模块解析器不会尝试先加载模块(并在达到周期时获取空导出),而是将解析推迟到执行实际代码之前(此时,依赖项已经存在)