理解nodejs的module

module

在 Node.js 模塊系統中,每一個文件都視爲獨立的模塊,node在運行某個模塊兒時會生成一個module對象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],
       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被賦值時,則該模塊兒就是一個有效的帶有返回值的模塊兒。git

一個模塊兒真正導出的是module.exports的值,exports只是module.exports的一個引用
能夠簡單理解爲下面這種對象引用和賦值的區別github

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 改變時其實改變的是 obj1obj2 都指向的同一個堆裏的數據。但 obj2 ={b:3} 則從新在堆裏開闢了另外一個內存塊兒來存儲。已經跟 obj1 脫離沒有關係了api

因此常常會看到node模塊兒裏會像下面這樣來導出模塊兒。數組

exports = module.exports = ()=>{
    do something
}

這是爲了讓exports引用指向module.exports同一塊內存,確保數據的一致性。ui

總結

  • 在執行 node 文件時同事建立了 module.exportsexports 對象
  • exports 是指向 module.exports 的一個引用
  • require("xxx") 其實引用的是xxx中的 module.exports 而非 exports

github nodejs

相關文章
相關標籤/搜索