commonjs可以
1.可以把文件加載成模塊
2.提供了module.exports ?exports 解決了public private
所以nodejs才能處理后端
module.exports 把一個類 暴露給外部 要在外面new一下 才能調用
exports返回的永遠是一個對象
module.exports可以返回很多(方法 數組 對象)
一個簡單的例子,計算圓的面積:
使用 exports
app.js
```
var circle = require('./circle');
console.log(circle.area(4));
circle.js
exports.area = function(r) {
return r * r * Math.PI;
}
```
這種方法是把對象暴露給外部 之后對象.屬性去調用area函數
使用 module.exports
app.js
```
var area = require('./area');
console.log(area(4));
area.js
module.exports = function(r) {
return r * r * Math.PI;
}
```
這種是將整個類暴露給外部 new之后 直接就可以訪問
exports和module.exports的區(qū)別
exports是module.exports的一個引用;module.exportsd的初始值是一個空對象
所以exports的初始值也是一個空對象
require返回的是module.exports
上面兩個例子輸出是一樣的。你也許會問,為什么不這樣寫呢?
app.js
```
var area = require('./area');
?console.log(area(4));
area.js
?exports = function(r) {
? ?return r * r * Math.PI;
?}
```
運行上面的例子會報錯。這是因為,前面的例子中通過給 exports 添加屬性,只是對 exports 指向的內存做了修改,而
? ```
exports = function(r) {
? ?return r * r * Math.PI;
?}
```
其實是對 exports 進行了覆蓋,exports 指向了一塊新的內存(內容為一個計算圓面積的函數),exports 和 module.exports 不再指向同一塊內存,此時 exports 和 module.exports 毫無聯(lián)系, module.exports 指向的那塊內存并沒有做任何改變,仍然為一個空對象 {} , area.js 導出了一個空對象,所以我們在 app.js 中調用 area(4) 會報 TypeError: object is not a function 的錯誤。
所以,一句話做個總結:當我們想讓模塊導出的是一個對象時, exports 和 module.exports 均可使用(但 exports 也不能重新覆蓋為一個新的對象),而當我們想導出非對象接口時,就必須也只能覆蓋 module.exports 。