module
在 Node.js 模块系统中,每个文件都视为独立的模块,node在运行某个模块儿时会生成一个module对象
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], ??????filename: ‘/Users/leinov/github/node-api/module/circle.js‘, ??????loaded: true, ??????children: [], ??????paths: [Array] } ], ?paths: ??[ ‘/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为当前文件
- exports为当前node文件模块儿导出的值
- parent为父级调用,如果为null则该文件没有被调用
- filename为当前文件名
- loaded是否被加载
- children 引入模块数组,数组项格式同module
- paths为node模块儿
node_modules
模块儿查找路径,一直查到根目录
module.exports & exports
Node里面的模块系统遵循是CommonJs规范,CommonJs定义的模块分为: 模块标识(module)、模块定义(exports) 、模块引用(require),在模块儿运行的时候都会生成一个module对象和一个exports对象,module对象下也有一个exports对象,默认情况下这两个对象都是空对象。如果有引用其他模块儿或定义模块儿 即module.exports或者exports被赋值时,则该模块儿就是一个有效的带有返回值的模块儿。
一个模块儿真正导出的是module.exports
的值,exports只是module.exports
的一个引用
可以简单理解为下面这种对象引用和赋值的区别
let obj1 = {a=1};let obj2 = obj1;console.log(obj1,obj2); // {a:1} {a:1}obj2.a = 2 console.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 = ()=>{ ???do something}
这是为了让exports引用指向module.exports同一块内存,确保数据的一致性。
总结
- 在执行
node
文件时同事创建了module.exports
和exports
对象 exports
是指向module.exports
的一个引用require("xxx")
其实引用的是xxx
中的module.exports
而非exports
github nodejs
来源:https://segmentfault.com/a/1190000017345276
理解nodejs的module
原文地址:https://www.cnblogs.com/lovellll/p/10162129.html