1.commonJS規(guī)范內(nèi)容
每一個(gè)文件就是一個(gè)模塊,都有自己獨(dú)立的作用域、變量、方法等,對(duì)其他的模塊都不可見(jiàn)。
commonJS規(guī)范規(guī)定,每個(gè)模塊內(nèi)部,module變量代表當(dāng)前模塊。這個(gè)變量是一個(gè)對(duì)象,它的
exports屬性(即module.exports)是對(duì)外的接口。
加載某個(gè)模塊,其實(shí)就是加載該模塊的module.exports屬性。require方法用于加載模塊
加載方式:同步。exports是導(dǎo)出,require是導(dǎo)入。(使用權(quán)限肯定就是閉包)
需要用node **.js 命令運(yùn)行。
2.commonJS特點(diǎn)
所有代碼都運(yùn)行在模塊作用域,不會(huì)污染全局作用域。
模塊可以多次加載,但只會(huì)在第一次加載時(shí)運(yùn)行一次,然后運(yùn)行結(jié)果就被緩存了,以后再加載,就會(huì)直接讀取緩存的結(jié)果。要想再次運(yùn)行,必須清除緩存。
模塊加載的順序,是按照其在代碼中出現(xiàn)的順序。
模塊輸出的值,是值的拷貝:從而控制了數(shù)據(jù)的訪問(wèn)權(quán)限。
3.require的內(nèi)部處理流程
require命令是commonJS規(guī)范之中,用來(lái)加載其他模塊的命令。它其實(shí)不是一個(gè)全局命令,而是指向當(dāng)前模塊的module.require命令,而后者又調(diào)用node的內(nèi)部命令module._load。
Module._load = function(request, parent, isMain) {
1.檢查Module._cache,是否緩存之中有指定模塊
2.如果緩存之中沒(méi)有,則創(chuàng)建一個(gè)新的Module實(shí)例
3.將它保存到緩存中去
4.使用Module.load() 加載指定的模塊文件,讀取文件內(nèi)容之后,使用module.compile() 執(zhí)行文件代碼
5.如果加載解析過(guò)程中報(bào)錯(cuò),就從緩存中刪除該模塊
6.返回該模塊的module.exprots
}
一旦require函數(shù)準(zhǔn)備完畢,整個(gè)所要加載的腳本內(nèi)容,就被放到一個(gè)新的函數(shù)之中,這樣可以避免污染全局環(huán)境。該函數(shù)的參數(shù)包括require、module、exports,以及其他一些參數(shù)。
(function(exports, require, module, _filename, _dirname) {
// 代碼導(dǎo)入在這里
})()
4.在瀏覽器中直接使用commonJS(browserify介紹)
npm install broswerify
broswerify inputPath.js -o outputPath.js
官網(wǎng):https://broswerify.org/