如果沒有接觸過 commonJs 這類可以將 js 模組化為檔案的開發者,剛開始寫 Nodejs 時可能會有點不懂 module.exports
與 exports
的差別
舉例來說: 有一個 player.js
[javascript]
var players = [];
function getPlayers() {
return players;
}
function addPlayer(player) {
players.push(player);
}
module.exports = { addPlayer: addPlayer, getPlayers: getPlayers };
[/javascript]
這樣就產生了一個 player.js
這個模組
如果今天 main.js 想要使用這個模組,就可以透過 require 來引入模組 如:
[javascript] var player = require(’./player’);
player.addPlayer(‘playerOne’); console.log(player.getPlayers()); // [‘playerOne’] [/javascript]
再來我們看看使用 exports 新增一個 removePlayer
的方法
[javascript]
var players = [];
function getPlayers() {
return players;
}
function addPlayer(player) {
players.push(player);
}
function removePlayer(player) { players = players.filter((val) => val !== player); }
module.exports = { addPlayer: addPlayer, getPlayers: getPlayers };
exports.removePlayer = removePlayer;
[/javascript]
[javascript] var player = require(’./player’);
player.addPlayer(‘playerOne’); console.log(player.getPlayers()); // [‘playerOne’] player.removePlayer(‘playerOne’); //player.removePlayer is not a function [/javascript]
原因是在模組裡面其實會預先幫你做
[javascript] var exports = module.exports = {}; [/javascript]
預設當我們使用 exports
其實也代表更改了 module.exports
。 但當直接使用 module.exports = {...}
其實也就更改了模組對外公開的物件,因此更改 exports
時無法更改到 module.exports
。
參考資料:
https://program365.wordpress.com/2015/07/02/understanding-module-exports-and-exports-in-node-js/