成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Node.js design pattern : module

focusj / 1888人閱讀

摘要:本文轉(zhuǎn)發(fā)自本人。這個例子通過對進(jìn)行計(jì)算,即通過函數(shù)處理該字符串腳本。實(shí)現(xiàn)的功能與函數(shù)類似,但比函數(shù)更強(qiáng)大。返回模塊中暴露的接口以供調(diào)用。但如果給重新賦值,則會失去的引用此時,意味著通過暴露的接口是無效的,沒有添加到中的中。

Node.js design pattern一書中對Node的Module模塊機(jī)制這一塊,我覺得講的挺透徹和易懂,這里根據(jù)自己理解做下總結(jié)。本文轉(zhuǎn)發(fā)自本人github。

loadModule

自定義一個簡單的模塊加載方法loadModule,基本思路跟nodejs一致,將加載的模塊內(nèi)容包裹在一個函數(shù)里面實(shí)現(xiàn)變量的隔離,保證模塊內(nèi)的變量都是私有的。

    function loadModule(filename, module, require) {
        const wrappedSrc = `(function(module, exports, require) {
            ${fs.readFileSync(filename, "utf8")}
        })(module, module.exports, require);`;
    
        eval(wrappedSrc);
    }

這個例子通過evalwrappedSrc進(jìn)行計(jì)算,即通過eval函數(shù)處理該字符串腳本。因?yàn)檫@里要把(function(module, exports, require) { 這串東西和 fs.readFileSync(filename, "utf8")加載的模塊內(nèi)容合并在一起作為新的整合代碼再運(yùn)行,所以必須借助eval函數(shù)。

作為對比,在nodejs源碼中, wrap是這樣實(shí)現(xiàn)的

    Module.wrap = function(script) {
          return Module.wrapper[0] + script + Module.wrapper[1];
    };

    Module.wrapper = [
      "(function (exports, require, module, __filename, __dirname) { ",
      "
});"
    ];

最終對該warpper的解析實(shí)現(xiàn)在Module.prototype._compile方法中,其中用到了vm模塊對wrapper腳本進(jìn)行處理。vm實(shí)現(xiàn)的功能與eval函數(shù)類似,但比eval函數(shù)更強(qiáng)大。

模塊引用require()

對模塊的引用我們通過require(..)函數(shù)進(jìn)行引用,如var http = require("http"),該方法簡單實(shí)現(xiàn)如下:

    const require = (moduleName) => {
        console.log(`Require invoked for module: ${moduleName}`);
        const id = require.resolve(moduleName);
        if (require.cache[id]) { return require.cache[id].exports; }
    
        // 1.module metadata
        const module = {
            exports: {},
            id: id
        }
    
        // 2.require.cache
        require.cache[id] = module;
    
        // 3.load the module
        loadModule(id, module, require);
    
        // 4.return exported variables
        return module.exports;
    }
    
    require.cache = {};
    require.resolve = (moduleName) => {
        /* resolve a full module id from the moduleName */
    }

定義了一個module對象用來保存通過loadModule方法中加載模塊中暴露出的接口。

將第一次加載的模塊保存在內(nèi)部緩存中。即第二次調(diào)用require(..)時不會再調(diào)用loadModule方法,直接從cache中返回。

通過loadModule方法通過模塊路徑加載模塊內(nèi)容。

返回模塊中暴露的接口以供調(diào)用。

可以通過下圖更加直觀的了解其中的關(guān)系。

module.exports vs exports

通過上述代碼和圖示可知,我們寫的模塊中的exports其實(shí)是對module.exports的引用。 因此我們可以通過exports添加屬性來給module.exports引用的對象添加屬性。

    exports.hello = () => { console.log("Hello") };

但如果給exports重新賦值,則會失去module.exports的引用

    exports = () => { console.log("Hello") };

此時exports !== module.exports,意味著通過exports暴露的接口是無效的,沒有添加到module metadata中的exports中。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/92473.html

相關(guān)文章

  • [譯 + 更新] 參透 Node 中 exports 的 7 種設(shè)計(jì)模式

    摘要:現(xiàn)在,我們可以開始探討介面的設(shè)計(jì)模式了。匯出命名空間一個簡單且常用的設(shè)計(jì)模式就是匯出一個包含數(shù)個屬性的物件,這些屬性具體的內(nèi)容主要是函式,但並不限於函式。如此,我們就能夠透過匯入該模組來取得這個命名空間下一系列相關(guān)的功能。 前言 這篇文章試著要整理,翻譯Export This: Interface Design Patterns for Node.js Modules這篇非常值得一讀的...

    wmui 評論0 收藏0
  • 2017-08-10 前端日報(bào)

    摘要:前端日報(bào)精選譯用搭建探索生命周期中的匿名遞歸瀏覽器端機(jī)器智能框架深入理解筆記和屬性中文上海線下活動前端工程化架構(gòu)實(shí)踐滬江技術(shù)沙龍掘金周二放送追加視頻知乎專欄第期聊一聊前端自動化測試上雙關(guān)語來自前端的小段子,你看得懂嗎眾成翻 2017-08-10 前端日報(bào) 精選 [譯] 用 Node.js 搭建 API Gateway探索 Service Worker 「生命周期」JavaScript ...

    wupengyu 評論0 收藏0
  • JavaScript設(shè)計(jì)模式

    摘要:此處的構(gòu)造函數(shù)使用的形式添加新屬性,但實(shí)際上新屬性的添加有四種方式,除去這一種,還有三種方括號語法,方法方法此處舉的是原文中的例子,若要使用,可參考原文。 參考書籍Learning Javascript Design Patterns 一、設(shè)計(jì)模式概述與應(yīng)用場景 首先引用原書的一段話: Patterns are proven solutions: They provide solid ...

    dreambei 評論0 收藏0
  • 2017-10-08 前端日報(bào)

    摘要:前端日報(bào)精選讀書思考一的計(jì)算屬性使用開發(fā)調(diào)試開發(fā)者控制臺中,你可能意想不到的功能中字符串轉(zhuǎn)數(shù)字的陷阱和示例中文設(shè)計(jì)模式單例模式個人文章設(shè)計(jì)模式工廠模式個人文章讀書思考二掘金網(wǎng)絡(luò)基礎(chǔ)三傳輸層的筆記學(xué)習(xí)筆記中的屬性學(xué)習(xí) 2017-10-08 前端日報(bào) 精選 Node.js Design Patterns - Second Edition讀書思考(一)Vue的計(jì)算屬性_Vue使用typesc...

    Cciradih 評論0 收藏0
  • 山地人的2019年前端自學(xué)路徑Roadmap——v0.0.1

    摘要:為何會有這個自學(xué)也需要有章可尋,早上整理了一下這段時間學(xué)的內(nèi)容東西比較多,接下來的一段時間都會圍繞這個展開學(xué)習(xí),當(dāng)然這張前端自學(xué)圖譜并不是一成不變的,隨著時間的推移我會調(diào)整這張里的內(nèi)容,總的目標(biāo)只有一個系統(tǒng)化的學(xué)好前端的技術(shù),我會隨時調(diào)整完 為何會有這個Roadmap 自學(xué)也需要有章可尋,早上整理了一下這段時間學(xué)的內(nèi)容東西比較多,接下來的一段時間都會圍繞這個Roadmap展開學(xué)習(xí),當(dāng)然...

    Hegel_Gu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<