今天看了下node.js的require方法的源码,终于弄明白exports和module.exports的区别了。我们知道有两种方法可以暴露node.js模块。1、方法一:使用exports//a.jsexports.log=function(str){console.log(str);}//b.jsvars=require("./a");s.log("哈哈哈哈");2.方法二:使用module.exports//a.jsmodule.exports=function(str){console.log(str);}//b.jsvars=require("./a");s("嘻嘻嘻嘻");如果第一个方法的exports在第二个方法中写成如下,就会报错://a.jsexports=function(str){console.log(str);}//b.jsvars=要求(“./a”);s("哈哈哈哈");exports和module.exports的初始值指向一个空对象,即{}。从源码可以看出,模块的require方法实际上调用了_load方法,_load方法最终返回module.exports分析错误原因。从一开始,exports和module.exports都指向同一个对象。第一种方式是给空对象{}添加属性,因为module.exports也指向这个对象,所以require方法返回的module.exports最终指向了log方法的对象,可以引用到module.第二种方式是让module.exports指向一个新的内存空间,exports仍然指向{},但是由于require方法返回module.exports,最终可以导入模块。但是最后一种写法是让exports指向一个新的内存空间,而module.exports还是指向{},那么最后的require方法返回module.exports,所以会报错,说s不是a功能。所以:请记住:require方法返回module.exports!
