exports和module.exports的區別?

exports和module.exports有區別嗎?

如題, 當我們使用exports和module.exports的時候, 通常exports.a = 123 和module.exports.a = 123是一回事, 筆者也看過一些資料中說到exports和module.exports是沒有什麼區別的, 結果真是這樣嗎?

我們先來看看exports和module.exports的真身到底是什麼?

console.log(module.exports, exports);
console.log(module.exports === exports);
//

在這裏插入圖片描述

由上圖可以得知, module.exports和exports本質上就是一個空對象{}, 同時我們還發現這兩個對象相等爲true, 那也就是意味着module.exports和exports指向的是同一個地址

於是筆者又進行了如下的測試(test.js)

const a = 123;
const b = 234;

exports.a = a; // 導出a變量
module.exports.b = b; // 導出b變量

在另一個文件夾中導入該文件(index.js)

const exportsObj = require('./test.js'); 
console.log(exportsObj); 

在這裏插入圖片描述

輸出結果爲{a: 123, b: 234}, 看起來沒毛病, 那麼既然這兩個對象又相等, 而我們導出的時候又互不干擾, 是不是可以判斷他們沒什麼區別了呢, 很顯然非也

當我們把代碼寫成如下格式的時候, 問題來了

const a = 123;
const b = 234;

exports = a; // 導出a變量
module.exports = b; // 導出b變量

index區域代碼不變, 則輸出結果如下

在這裏插入圖片描述

我們只看到了一個234, 發生這種情況的原因我看了一些博客中寫是因爲module.exports會覆蓋exports, 其實我們從對象的基礎知識來看或許剖析的比較全面

一開始 module.exports 和 exports 指向了同一個空對象 {},
當我們改變了 exports的值 讓他指向另外一個值以後, 他就已經不再跟module.exports相等了,
而系統會默認識別module.exports導出的內容, 所以exports 只是相當於我們給未聲明變量賦了一個值

所以防止exports被棄用, 建議大家儘量都寫module.exports

發佈了28 篇原創文章 · 獲贊 11 · 訪問量 2047
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章