Module

module是node.js最常用的模塊,是node.js的根基,主要作用是導入模塊,組織模塊。

簡單原理

module里面核心的方法是require,以下我將會用簡單的偽代碼來描述require的過程


var cache = {}; //模塊緩存
function require(path) {

    var filename = _resolveFilename(path); // 讀取模塊的文件名字
    if (cache[filename]) {  //判斷該模塊是否已經加載到內存,如果已經在內存,則直接讀取
        return cache[filename];
    }

    if (Native.module[filename]) { //判斷模塊是否原生 native的模塊,如果是native模塊,讀取模塊內容
        return Native.module[filename];
    }


    var content = fs.readFileSync(filename); // 用同步阻塞的方法讀取文件內容

    var extension = getFileextension(filename); //根據(jù)文件extension的類型,根據(jù)不同的類型對不同文件進行相應的處理。

    if (extension == '.json') {
        return JSON.parse(content);
    }

    if (extension == '.node') {
        return process.dlopen; 
    }

    if (extension == '.js') {

        if (Module._contextLoad) { //根據(jù)_contextLoad 這個全局參數(shù)來區(qū)分,模塊是需要所有文件都加載統(tǒng)一的上下文里面,還是分開不同上下文加載,通過exports的方法來跟其他模塊通訊。node.js默認使用后者來處理。
            var sandbox = {};
            for (var k in global) {
                sandbox[k] = global[k];
            }
            sandbox.require = require;
            sandbox.exports = self.exports;
            sandbox.__filename = filename;
            sandbox.__dirname = dirname;
            sandbox.module = self;
            sandbox.global = sandbox;
            sandbox.root = root;
            return runInNewContext(content, sandbox, { filename: filename });

        } else {
            global.require = require;
            global.exports = self.exports;
            global.__filename = filename;
            global.__dirname = dirname;
            global.module = self;
            return runInThisContext(content, { filename: filename });

        }
    }
}

后記

總的來說,module模塊還是比較簡單,不過在瀏覽器里面就不是那么好實現(xiàn)了,根源還是在加載文件的時候,是否異步方法相關,嘗試想想如果我們在加載模塊的時候,使用fs.readFile 而不是readFileSync ,而執(zhí)行一個文件當中,我們需要判斷模塊是否已經加載完畢,復雜度就變得大很多。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容