关于commonJS的理解

在commonJS的标准中,所有的js文件都是一个模块,当我们要使用某个模块的时候,就要用a = require(xxx)来引入它,这就像是执行一个函数一样,我们将js代码作为参数传进去,然后将函数的反回结果赋值给a。

那么函数的返回结果是什么?


细节不过多赘述,总之在require()的实现过程中,它会创建一个对象module = {exports: {}},也就是说此时module.exports是一个空对象,然后把这个空对象传递给我们的模块js
这也就是为什么我们要往外暴露什么东西,就都要挂在module.exports上。


除此之外,require里面还会创建一个exports,使exports = module.exports,这个expots也会传入我们的模块代码
这也就是为什么我们在js中在exports上挂的数据也会暴露出来


那这里有一个问题了:exports.a = 1可以暴露出来,为什么exports = {a:1}就暴露不出来了??

很简单,在我们的模块js代码中一开始,this === module.exports === expots是成立的,也就是他们三个会指向同一个数据(一个空对象)
如果我们向其中加某个属性比如this.a = 1expots.b = 2module.exports.c = 3这种操作不会改变它们的指向,此时他们依然this === module.exports === expots
但如果用this = {a:1}exports = {b:2}module.exports = {c:3}这种重新赋值的写法,则会改变它们的指向,导致this === module.exports === expots不成立,也就是说他们各自为政了


了解到这里了,那最开始的问题还是没有回答,即“require函数的返回结果是什么呢?”

答:require返回的是module.exports,也就是说,当我们将一个模块用require引入时,这个模块最终暴露出来的数据是我们在模块代码中挂载在module.exports所指向的对象上的数据。
一切以module.exports为准,如果this、exports 它们的指向依然和module.exports一样,那么通过它们挂载的数据也会暴露出来,但如果他们改变指向了,不好意思,我只认谁module.exports所指向的对象。

posted @ 2025-08-09 11:49  wenerda  阅读(5)  评论(0)    收藏  举报