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