javascript - nodejs require 一个文件可以需要一个已经被它需要的文件吗?
问题描述
我想知道如果您有两个相互需要的文件会发生什么。假设foo.js
&bar.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,
}
解决方案
cyclic require
这在 Node.js中被调用。当存在循环 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 导出对象的未完成副本返回给 b.js 模块。然后 b.js 完成加载,并将其导出对象提供给 a.js 模块。
当 main.js 加载两个模块时,它们都已完成。因此,该程序的输出将是:
$ 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
需要仔细规划以允许循环模块依赖项在应用程序中正常工作。在这里查看更多详情。
我建议检查这个线程,因为它提供了一些要遵循的模式。
推荐阅读
- reactjs - 如何在 Material UI 5 中使用 useTheme?
- mxnet - 如何在 MXNet 中获取下一个和上一个层的名称?
- node.js - 在 Nginx 中使用查询参数启用 React/Express Route
- kubernetes - 如何访问另一个 pod(busybox)中的 mysql pod?
- powershell - 通过 PowerShell 访问 MS Graph API 的权限
- sharepoint - 将 Microsoft Clarity 与 SharePoint 集成
- jquery - 使用唯一 ID 的 Chrome 存储集
- java - 如何在 Selenium 的 soft assertAll() 中仅打印失败的断言而没有堆栈跟踪?
- android - 为什么这里用红色突出显示 -
- amazon-cognito - 当每秒请求超过一定限制时,我们如何获得警告。(Cognito AWS 的配额)