首頁  >  文章  >  web前端  >  Node.js 中的「module.exports」和「exports」有什麼區別,為什麼都使用?

Node.js 中的「module.exports」和「exports」有什麼區別,為什麼都使用?

Patricia Arquette
Patricia Arquette原創
2024-11-22 11:44:09190瀏覽

What is the difference between `module.exports` and `exports` in Node.js, and why are both used?

探索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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn