我們知道Node.js的實現讓js也可以成為后端開發語言,
但在早先Node.js開發過程中,它的作者發現在js中并沒有像其他后端語言一樣有包引入和模塊系統的機制。
這就意味著js的所有變量,函數都在全局中定義。這樣不但會污染全局變量,更會導致暴露函數內部細節等問題。
CommonJS組織也意識到了同樣的問題,于是 CommonJS組織創造了一套js模塊系統的規范。我們現在所說的CommonJS指的就是這個規范。
Tips: CommonJS 是一個有志于構建 JavaScript 生態圈的組織。它有一個 郵件列表,很多開發者參與其中。 整個社區致力于提高 JavaScript 程序的可移植性和可交換性,無論是在服務端還是瀏覽器端。
來看一個CommonJS的例子:(index.js和moduleA.js在同級目錄中)
index.js
let a = require('./moduleA');
console.log(a);
console.log(a.xxx);
moduleA.js
exports.xxx = {
name: 'moduleA'
}
執行node index.js
返回
{ xxx: { name: 'moduleA' } }
{ name: 'moduleA' }
在上面這里例子里可以發現,require和exports是相對應的。
另外你或許知道還有一個module.exports
它和exports有相同的作用,
但兩者有細微的差距。
例子:
index.js
let a = require('./moduleA');
console.log(a);
console.log(a.xxx);
moduleA.js
exports = { //這里省去.xxx
name: 'moduleA'
}
這次會輸出
{}
undefined
這是為什么?
本質上一個文件就是一個module,
當我們require一個文件的時候,
真正對應去找的是module.export
moduleA.js 其實等價于
module.exports = {}
exports = { //這里省去.xxx
name: 'moduleA'
}
1.module.exports 初始值為一個空對象 {}
2.exports 是指向的 module.exports 的引用
(在上面這里例子中,exports這個指針被重新賦值成了一個新的對象。)
3.require() 返回的是 module.exports 而不是 exports
(在上面這個例子中module.export沒有被賦予任何值)
更多資料:
1.關于module.exports 和 exports
2.阮一峰 - CommonJS概念和語法
3.玉伯 - 從 CommonJS 到 Sea.js