Appearance
cjs
结果会怎么样
a.js
exports.a =1
require("b.js")
exports.b=2
b.js
console.log(require("a.js"))
执行过程
开始执行 a.js:
Node.js 初始化模块并创建 exports 对象。 执行 exports.a = 1,此时 a.js 的导出对象是:{ a: 1 }。 执行到 require("b.js"):
Node.js 开始加载 b.js,并运行其代码。 在 b.js 中执行 console.log(require("a.js")):
require("a.js") 再次请求 a.js 模块。 Node.js 检查模块缓存,发现 a.js 正在加载,返回当前的导出对象 { a: 1 }(部分加载的结果)。 console.log(require("a.js")) 打印:{ a: 1 }。 完成 b.js 的加载:
b.js 的代码执行完毕,返回到 a.js 继续执行。 继续执行 a.js:
执行 exports.b = 2,将 b 属性添加到导出对象。 此时 a.js 的最终导出对象是:{ a: 1, b: 2 }。
最终结果
输出:
这是因为在 b.js 中 require("a.js") 返回的是 a.js 正在加载时的导出对象,此时 b 尚未导出。 a.js 的最终导出对象: