1逼裆、模塊化
(1)遵守固定的規(guī)則诗力,把一個大文件拆成獨立并相互依賴的多個小模塊
(2)好處:復用性烙心、可維護性稿械、可實現(xiàn)按需加載
2选泻、Node.js中模塊的分類
(1)內(nèi)置模塊(官方提供:http、fs美莫、path)
(2)自定義模塊(用戶自己創(chuàng)建的js文件)
(3)第三方模塊(由第三方開發(fā)的模塊页眯,使用前需要先下載)
3、操作模塊
(1)加載模塊:使用require()方法厢呵,在使用require方法其它模塊時窝撵,會執(zhí)行被加載模塊中的代碼
// m1.js文件
console.log('加載了自定義模塊m1');
// 加載m1.js文件
const m1 = require('./06.用戶自定義模塊1.js') // js后綴名可以被省略
console.log(m1);
// 打印:
// 加載了自定義模塊m1
// {}
(2)自定義模塊中定義的變量襟铭、方法等成員碌奉,只能在模塊內(nèi)部被訪問,可防止全局變量污染
(3)module對象:存儲和當前模塊有關的信息寒砖,每個自定義模塊都有這個屬性
Module {
id: '.',
path: '……',
exports: {},
parent: null,
filename: '……,
loaded: false,
children: [],
paths: [……]
}
(4)向外共享模塊作用域中的成員
在導入某個自定義模塊時赐劣,實際上導入的是module對象中的exports對象,默認為空
-
經(jīng)過module.exports暴露的數(shù)據(jù)才能被訪問到
// export.js文件(不經(jīng)過module.exports暴露則訪問不到) module.exports = { name: '星星' } module.exports.age = 18 // test.js文件 const m = require('./exports.js') console.log(m) // {name: '星星', age: 18}
-
共享成員時需要注意
導入成員時哩都,導入的結(jié)果魁兼,永遠以module.exports指向的對象為準
// export.js文件(不經(jīng)過module.exports暴露則訪問不到) module.exports.age = 18 // 此時module.exports指向一個全新的對象 module.exports = { name: '星星' } // test.js文件 const m = require('./exports.js') console.log(m) // {name: '星星'}
(5)exports對象
向外暴露數(shù)據(jù)時也可以使用exports,exports和module.exports指向同一個對象(修改值也是同步的)漠嵌,最終共享的結(jié)果璃赡,還是以module.exports指向的對象為準
(6)exports和module.exports的使用誤區(qū)
require()導入模塊時,得到的永遠是module.exports所指向的對象
防止混亂献雅,不要在同一個模塊中同時使用exports和module.exports
4碉考、Node.js中的模塊化規(guī)范
(1)CommonJS規(guī)范:規(guī)定模塊的特性和各模塊之間如何相互依賴
(2)CommonJS規(guī)定:
每個模塊內(nèi)部,module變量代表當前模塊
module變量是一個對象挺身,它的exports屬性(module.exports)是對外的接口
加載某個模塊侯谁,其實是加載該模塊的module.exports屬性。require()方法用于加載模塊