繁体   English   中英

nodejs require 一个文件可以需要一个已经被它需要的文件吗?

[英]nodejs require can one file require a file which is already being required by it?

我想知道如果您有两个相互需要的文件会发生什么。 假设foo.jsbar.js都需要彼此。 会发生什么? nodejs 可以解决这个问题还是会无休止地循环要求对方?

例如

bar.js

const Foo = require('./foo.js`);

const bar = () => {
   Foo.foop();
}
const baz = () => {

}
module.exports = {
   bar,
   baz,
}

foo.js

const Bar = require('./bar.js`);

const foo = () => {
   Bar.baz();
}
const foop = () => {

}
module.exports = {
   foo,
   foop,
}

这在 Node.js 中称为cyclic require 当存在循环 require() 调用时,模块在返回时可能尚未完成执行。

考虑这种情况:

一个.js:

console.log('a starting');
exports.done = false;
const b = require('./b.js');
console.log('in a, b.done = %j', b.done);
exports.done = true;
console.log('a done');

b.js:

console.log('b starting');
exports.done = false;
const a = require('./a.js');
console.log('in b, a.done = %j', a.done);
exports.done = true;
console.log('b done');

主.js:

console.log('main starting');
const a = require('./a.js');
const b = require('./b.js');
console.log('in main, a.done = %j, b.done = %j', a.done, b.done);

当 main.js 加载 a.js 时,a.js 依次加载 b.js。 此时,b.js 会尝试加载 a.js。 为了防止无限循环,a.js 导出 object 的未完成副本返回到 b.js 模块。 然后 b.js 完成加载,并将其导出 object 提供给 a.js 模块。

当 main.js 加载两个模块时,它们都已完成。 因此,该程序的 output 将是:

$ node main.js
main starting
a starting
b starting
in b, a.done = false
b done
in a, b.done = true
a done
in main, a.done = true, b.done = true

需要仔细规划以允许循环模块依赖项在应用程序中正常工作。 在这里查看更多详情。

我建议检查这个线程,因为它提供了一些要遵循的模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM