Nodejs的模塊化因爲出現的較早,所以它遵循的是CommonJS規範,而非ES6的模塊化。node
在Nodejs的模塊化中,最經常使用到的有module對象、exports對象、require方法。git
其中module和exports用於輸出模塊,require用於引用模塊。github
示例代碼:/lesson10/module1.js、/lesson10/require.jsbash
先新建一個module1.js文件,代碼以下:less
module.exports.a = 1
module.exports.b = 2
let c = 3
複製代碼
在require.js中,引入模塊並打印:模塊化
const module1 = require('./module1')
console.log(module1)
複製代碼
能夠看到打印結果:{ a: 1, b: 2 }。函數
這段代碼的含義以下:ui
const module2 = require('module2')
console.log(module2) // { a: 1, b: 2 }
複製代碼
若此時項目目錄下的node_modules文件夾下存在module2.js文件,則會引用該文件。this
若不存在,則會查找系統的node_modules文件夾下,即全局安裝的模塊,是否存在module2。spa
若還不存在該模塊,則會報錯。
經過require導入的模塊,能夠被任意命名,所以寫成const a = require('module2')也是能夠的。
上面這個例子中的模塊導出,還能夠省略module,直接寫成exports.a = 1; exports.b = 1; ...。
但直接使用exports導出,也僅支持這種寫法,若寫成:
exports = {
a: 1,
b: 2
}
複製代碼
在引用模塊時,只能接收到{},也就是說exports只支持exports.a = 1;這樣的語法。
若是要將整個模塊直接定義爲一個對象、函數、變量、類,則須要使用module.exports = 123。
以下:
示例代碼:/lesson10/module3.js
module.exports = {
a: 1,
b: 2
}
module.exports = 123
module.exports = {
a: 1,
b: 2,
c: 3
}
module.exports = function () {
console.log('test')
}
module.exports = class {
constructor(name) {
this.name = name
}
show() {
console.log(`Show ${this.name}`)
}
}
複製代碼
module.exports能夠讓模塊被賦值成任意類型,但須要注意的是此時module.exports相似於一個模塊內的全局變量。
對它的重複賦值,只有最後的值有效,以前的值會直接被覆蓋。
在這個例子中,module3.js模塊最終導出爲一個類。
所以,一般推薦使用module.exports,能夠避免出錯。