nodejs模組中exports和module.exports的區別

來源:互聯網
上載者:User

標籤:

 通過Node.js的官方API可以看到Node.js本身提供了很多核心模組 http://nodejs.org/api/ ,這些核心模組被編譯成二進位檔案,可以require(‘模組名‘)去擷取;核心模組具有最高的載入優先順序(有模組與核心模組同名時會體現)

檔案模組訪問方式通過require(‘/檔案名稱.尾碼‘) require(‘./檔案名稱.尾碼‘) requrie(‘../檔案名稱.尾碼‘) 去訪問,檔案尾碼可以省略;以"/"開頭是以絕對路徑去載入,以"./"開頭和以"../"開頭表示以相對路徑載入,而以"./"開頭表示同級目錄下檔案

 exports和module.exports;提供了外部存取的介面

講講他們的區別

1、模組匯入會緩衝,寫了多次匯入,只會導一次。

 即使匯入的路徑不一樣。它緩衝是指實際檔案名稱,並不會因為傳入的路徑形式不一樣而認會是不同的檔案

 1 var outputVal  = 0;     //輸出值 2 var increment = 1;    //增量 3 /* 設定輸出值 */ 4 function seOutputVal (val) { 5     outputVal = val; 6 } 7 /* 設定增量 */ 8 function setIncrement(incrementVal){ 9     increment = incrementVal;10 }11 /* 輸出 */12 function printNextCount()13 {14     outputVal += increment;15     console.log(outputVal) ;16 }17 function printOutputVal() {18     console.log(outputVal);19 }20 exports.seOutputVal = seOutputVal;21 exports.setIncrement = setIncrement;22 module.exports.printNextCount = printNextCount;

 

 1 /* 2     一個Node.js檔案就是一個模組,這個檔案可能是Javascript代碼、JSON或者編譯過的C/C++擴充。 3     重要的兩個對象: 4     require是從外部擷取模組 5     exports是把模組介面公開 6 */ 7 var counter = require(‘./1_modules_custom_counter‘); 8 console.log(‘第一次調用模組[1_modules_custom_counter]‘); 9 counter.seOutputVal(10);               //設定從10開始計數10 counter.setIncrement (10);             //設定增量為1011 counter.printNextCount();12 counter.printNextCount();13 counter.printNextCount();14 counter.printNextCount();15 /*16     require多次調用同一模組不會重複載入17 */18 var counter = require(‘./1_modules_custom_counter‘);19 console.log(‘第二次調用模組[1_modules_custom_counter]‘);20 counter.printNextCount();

 

 2、通過exports和module.exports對外公開的方法都可以訪問,但有區別

module.exports才是真正的介面,exports只不過是它的一個協助工具輔助。 最終返回給調用的是module.exports而不是exports。
所有的exports收集到的屬性和方法,都賦值給了Module.exports。當然,這有個前提,就是module.exports本身不具備任何屬性和方法。
如果,module.exports已經具備一些屬性和方法,那麼exports收集來的資訊將被忽略。

我把exports和 module.exports都列印出來看看究竟

 ①  (雖然這樣在引入模組時會報錯,但這一步能說明問題,後面說原因)

 1 var counter  = 0; 2 exports.temp  = function(){ 3     counter += 10; 4     this.printNextCount = function() 5     { 6         console.log(counter); 7     } 8 } 9 var isEq = (exports === module.exports);10 console.log(exports);11 console.log(module.exports);12 console.log(isEq);

結果:

通過exports匯出的方法,會傳遞給module.exports。二者沒區別

 1 var counter  = 0; 2 module.exports = function(){ 3     counter += 10; 4     this.printNextCount = function() 5     { 6         console.log(counter); 7     } 8 } 9 var isEq = (exports === module.exports);10 console.log(exports);11 console.log(module.exports);12 console.log(isEq);

結果:

 

直接傳給module.exports,那exports就說明都沒有,二者不相等了。

 ③:注意,匯入時有點區別。和上面第一大點不一樣

 如這裡的②

1  var  Counter = require(‘./  ‘);2  var  counterObj = new Counter();3  counterObj.printNextCount();

 

 而第一大點可以直接這樣:

1  var counter = require(‘./1_modules_custom_counter‘);2  console.log(‘第二次調用模組[1_modules_custom_counter]‘);3  counter.printNextCount();

 

 就是要new一個對象!

 因為匯出的檔案中的函數變成了成員方法,所以要new一個對象,再調用成員方法。

 說明①不可行的原因:當我在別的檔案調用它時,無論是直接調用,還是new一個對象再調用,都報錯!

 所以,要遵循這兩點

1.最好別分別定義module.exports和exports

2.NodeJs開發人員建議匯出對象用module.exports,匯出多個方法和變數用exports

3、exports和module.exports覆蓋

直接上代碼,看誰留下,誰消失

 1 var counter  = 0; 2 exports.printNextCount = function() 3     { 4     counter+=2; 5         console.log(counter); 6     } 7 module.exports = function(){ 8 counter+=10; 9 this.printNextCount=function(){10 console.log(counter)11 }12 13 }14 var isEq = (exports === module.exports);15 console.log(exports);16 console.log(module.exports);17 console.log(isEq);

想想都知道誰厲害。

引用該模組:

①報錯,說明exports的消失了

1 var counter = require(‘./test3‘);2 counter.printNextCount();

②留下了。

1 var counter = require(‘./test3‘);2 var counterObj=new counter()3 counterObj.printNextCount();

 結果,輸出了它成功匯出的對象函數值;前面兩個是兩個介面收集到的東西,最後exports的被覆蓋了

 

文章是學習筆記,如有錯誤,望指正

 

nodejs模組中exports和module.exports的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.