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