Skip to content

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 的最终导出对象:

MIT Licensed