探索Node.js 中'module.exports' 和'exports' 之間的差異
在Node.js 模組系統中,有兩個值得注意的變數:「module.exports」和「exports」。雖然它們看起來可以互換,但理解它們之間的細微差別對於有效的模組開發至關重要。
考慮所提供問題中提到的契約:
module.exports = exports = nano = function database_module(cfg) {...}
這種語法提出了一個問題:什麼是「module.exports」和「exports」之間的區別,以及為什麼兩者都被使用?
要解開這個謎題,讓我們假設每個模組都以以下幾行開頭:
var module = new Module(...); var exports = module.exports;
本質上,「module.exports」和「exports」最初指向同一個對象。當您為“exports”賦值時,您實際上是在修改“module.exports”引用的物件。
在範例合約中,我們首先考慮「安全」方法:
// Using module.exports module.exports.a = function() { console.log('a'); } module.exports.b = function() { console.log('b'); }
這裡,「安全」意味著「module.exports」仍然是包含導出函數的物件。當你需要這個模組時,你會得到這個物件。
但是,分配給'exports'可能是「危險的」:
// Using exports exports.a = function() { console.log('a'); } exports.b = function() { console.log('b'); }
雖然'module.exports'和'exports'最初指向同一個對象,直接分配給「exports ”會破壞該引用。結果,'module.exports' 仍然指向一個空物件 {},當需要模組時會傳回該物件。
值得注意的是,為'module.exports' 分配一個構造函數可以有與“導出”的含義不同:
// Assigning constructor to module.exports module.exports = function Something() { console.log('bla bla'); }
在這種情況下,返回結果的“ typeof”將是'功能。 '這允許您直接將模組作為函數來 require 和呼叫。
但是,將構造函數分配給'exports' 將不會產生相同的效果:
// Assigning constructor to exports exports = function Something() { console.log('bla bla'); }
透過重新分配'exports, ' 你切斷了'module.exports' 和構造函數之間的連接,將'module.exports'留為空
總之,理解「module.exports」和「exports」之間的細微差別對於開發有效的 Node.js 模組至關重要。雖然兩個變數最初都指向同一個對象,但「module.exports」應被視為從模組導出值的官方方法,因為它始終指向導出的對象。另一方面,當您需要直接修改導出的物件或指派建構函式時,「導出」可能很有用。
以上是Node.js 中的「module.exports」和「exports」有什麼區別,為什麼都使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!