CommonJS中exports和module.exports的區(qū)別

exportsmodule.exports的常用形式

首先, 兩種常用形式:

第一種

// dep.js
exports.A = function() {}
// app.js
var dep = require('dep');
dep.A()

這其中exports.A = function() {}也可以寫成module.exports.A = function() {}

第二種

// dep.js
module.exports = function () {}
// app.js
var dep = require('dep');
dep();

注意這里只能module.exports. 下面講為什么.

exportsmodule.exports的關(guān)系

來自SO的經(jīng)典解答

var module = { exports: {} };
var exports = module.exports;

// your code

return module.exports;

可以看出:

  1. 最終導(dǎo)出的是module.exports
  2. exports就是module.exports的一個(gè)引用, 幫助簡(jiǎn)化代碼, 如module.exports.A = 1可以簡(jiǎn)寫為exports.A = 1.

需要注意的:

  1. 如果對(duì)exports進(jìn)行直接賦值, 如exports = 1, 將斷開exportsmodule.exports之間的關(guān)系. 之后再怎么向exports上掛變量 (如exports.A = 1) 都不會(huì)被導(dǎo)出了.
    1. 這意味著exports的正確使用方法, 只有exports.A = B這種掛變量的形式.
    2. exports = { A: 1 }并不會(huì)導(dǎo)出一個(gè)包含A屬性的模塊, 但是module.exports = { A: 1 }可以.
  2. modules.exports一旦被直接賦值, 如modules.exports = 1, 也會(huì)斷開它和exports之間的聯(lián)系, 導(dǎo)致exports失去意義. 但是這種形式常常用來直接導(dǎo)出你想用到的數(shù)據(jù)類型, 如: (以下的D都來自var D = require('dep'))
    1. modules.exports = [1, 2]就直接導(dǎo)出了一個(gè)數(shù)組, 可以D.push(3)
    2. modules.exports = function () {}就直接導(dǎo)出了一個(gè)函數(shù)/類, 可以D()或者var d = new D()
    3. 依次類推, 還可以直接導(dǎo)出字符串等其他類型.

參考

  1. module.exports vs exports in Node.js
  2. Difference between “module.exports” and “exports” in the CommonJs Module System
  3. Node.js Module – exports vs module.exports
  4. exports shortcut
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。