exports
和module.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
. 下面講為什么.
exports
和module.exports
的關(guān)系
來自SO的經(jīng)典解答
var module = { exports: {} };
var exports = module.exports;
// your code
return module.exports;
可以看出:
- 最終導(dǎo)出的是
module.exports
-
exports
就是module.exports
的一個(gè)引用, 幫助簡(jiǎn)化代碼, 如module.exports.A = 1
可以簡(jiǎn)寫為exports.A = 1
.
需要注意的:
- 如果對(duì)
exports
進(jìn)行直接賦值, 如exports = 1
, 將斷開exports
和module.exports
之間的關(guān)系. 之后再怎么向exports
上掛變量 (如exports.A = 1
) 都不會(huì)被導(dǎo)出了.- 這意味著
exports
的正確使用方法, 只有exports.A = B
這種掛變量的形式. -
exports = { A: 1 }
并不會(huì)導(dǎo)出一個(gè)包含A屬性的模塊, 但是module.exports = { A: 1 }
可以.
- 這意味著
-
modules.exports
一旦被直接賦值, 如modules.exports = 1
, 也會(huì)斷開它和exports
之間的聯(lián)系, 導(dǎo)致exports
失去意義. 但是這種形式常常用來直接導(dǎo)出你想用到的數(shù)據(jù)類型, 如: (以下的D
都來自var D = require('dep')
)-
modules.exports = [1, 2]
就直接導(dǎo)出了一個(gè)數(shù)組, 可以D.push(3)
-
modules.exports = function () {}
就直接導(dǎo)出了一個(gè)函數(shù)/類, 可以D()
或者var d = new D()
- 依次類推, 還可以直接導(dǎo)出字符串等其他類型.
-