module在Node.js的模块体系中,每个文件都被看成是一个独立的模块。当运行一个模块时,node会生成一个模块对象Module{id:'.',exports:2,parent:null,filename:'/Users/leinov/github/node-api/module/module.js',loaded:false,children:[Module{id:'/Users/leinov/github/node-api/module/circle.js',exports:[Object],parent:[Circular],文件名:'/Users/leinov/github/node-api/module/circle.js',loaded:true,children:[],paths:[Array]}],路径:['/Users/leinov/github/node-api/module/node_modules','/Users/leinov/github/node-api/node_modules','/Users/leinov/github/node_modules','/Users/leinov/node_modules','/Users/node_modules','/node_modules']}id是当前fileexports为当前节点文件模块导出的值parent为父调用,若为null则fileNotcalledfilename为当前加载的文件名是否加载children导入模块数组,数组项的格式为与modulepaths相同的是node模块node_modules模块搜索路径,直到根目录module.exports&exportsNode中的模块系统遵循CommonJs规范,CommonJs定义的模块分为:模块标识(module),模块定义(出口),模块引用(require),模块运行时会生成一个模块对象和一个exports对象,模块对象下还有一个exports对象。默认情况下,这两个对象都是空对象。如果存在对其他模块或定义的引用模块module.exports或exports被赋值时,该模块是一个有效的模块,具有返回值。一个模块真正导出的是module.exports的值,exports只是对module.exports的引用。可以简单理解为如下对象引用和赋值的区别letobj1={a=1};letobj2=obj1;console。日志(obj1,obj2);//{a:1}{a:1}obj2.a=2console.log(obj1,obj2);//{a:2}{a:2}obj2={b:3}console.log(obj1,obj2);//{a:2}{b:3}obj2只是对obj1的引用。当obj2.a改变时,真正改变的是obj1和obj2都指向的同一个堆中的数据。但是obj2={b:3}在堆中重新开辟了另一个内存块进行存储。和obj1没有关系,所以经常看到node模块会像下面这样导出模块。exports=module.exports=()=>{dosomething}这是为了让exports引用指向和module.exports相同的内存块,保证数据的一致性。综上所述,当执行节点文件时,会创建module.exports和exports对象。exports是对module.exports的引用。require("xxx")实际上指的是xxx中的module.exports而不是exportsgithubnodejs
