成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Node.js中require()的工作原理是什么

這篇文章給大家分享的是有關(guān)Node.js中require()的工作原理是什么的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。

創(chuàng)新互聯(lián)成立10余年來(lái),這條路我們正越走越好,積累了技術(shù)與客戶(hù)資源,形成了良好的口碑。為客戶(hù)提供做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)頁(yè)設(shè)計(jì)、域名與空間、網(wǎng)絡(luò)營(yíng)銷(xiāo)、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。網(wǎng)站是否美觀、功能強(qiáng)大、用戶(hù)體驗(yàn)好、性?xún)r(jià)比高、打開(kāi)快等等,這些對(duì)于網(wǎng)站建設(shè)都非常重要,創(chuàng)新互聯(lián)通過(guò)對(duì)建站技術(shù)性的掌握、對(duì)創(chuàng)意設(shè)計(jì)的研究為客戶(hù)提供一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶(hù),共同發(fā)展進(jìn)步。

大多數(shù)人都知道Node.js中require()函數(shù)做什么的,但是有多少人知道它的工作原理呢?我們每天使用它加載庫(kù)包和模塊,但是它的內(nèi)部行為原理很神秘。

我們追尋Node模塊系統(tǒng)的核心: module.js,這個(gè)文件包含一個(gè)令人驚訝的神奇功能,它負(fù)責(zé)加載 編譯和緩存每個(gè)用過(guò)的文件,讓我們揭開(kāi)它的神秘面紗。

function Module(id, parent) { 
  this.id = id; 
  this.exports = {}; 
  this.parent = parent; 
  // ...

在module.js中可以發(fā)現(xiàn)這個(gè)Module類(lèi)型,扮演兩個(gè)主要角色:首先,它提供一個(gè)所有Node.js模塊從其文件被加載時(shí)構(gòu)建一個(gè)實(shí)例的基礎(chǔ)功能,甚至在文件運(yùn)行時(shí)持久,這就是為什么我們能夠?qū)⒁恍傩约尤雖odule.exports,并在需要時(shí)返回它們。

module的第二個(gè)事情是處理Node模塊的加載機(jī)制,標(biāo)準(zhǔn)的require函數(shù)其實(shí)是基于module.require的抽象,后者只是一個(gè)對(duì)Module._load的簡(jiǎn)單包裝,加載方法處理每個(gè)文件的實(shí)際加載??纯此拇a大概如下:

Module._load = function(request, parent, isMain) { 
  // 1.在Module._cache中檢查模塊是否被緩存
  // 2.如果緩存中為空,創(chuàng)建一個(gè)新的模塊實(shí)例。
  // 3. 保存到緩存
  // 4. 使用指定的名稱(chēng)調(diào)用module.load() 
  //    在讀取了文件內(nèi)容后將調(diào)用module.compile() 
  // 5.如果加載和分析文件時(shí)有錯(cuò)誤
  //    從緩存中刪除壞的模塊
  // 6. 返回 module.exports 
};

Module._load負(fù)責(zé)加載新的模塊并且管理模塊緩存,緩存每個(gè)模塊能夠降低文件的讀取頻率,從而提高性能,共享模塊實(shí)例允許像單例模塊那樣跨應(yīng)用保存狀態(tài)。

如果一個(gè)模塊在緩存中不存在,Module._load將讀取文件創(chuàng)建一個(gè)新的,讀取文件內(nèi)容成功后會(huì)調(diào)用module._compile

如果你注意上面第六步,你會(huì)看到返回的是module.exports,這就是為什么當(dāng)你定義公共接口時(shí),可以使用exports和module.exports,因?yàn)樗鼈兇_實(shí)是Model._load和require返回的。

下面看看module._compile:

Module.prototype._compile = function(content, filename) { 
  // 1. 創(chuàng)建調(diào)用模塊需要的require標(biāo)準(zhǔn)函數(shù)
  // 2.將其他幫助方法加入require. 
  // 3.包裝JS代碼到一個(gè)函數(shù),這個(gè)函數(shù)提供我們的require
  //  模塊, 比如變量本地化到模塊的作用域
  // 4.返回這個(gè)函數(shù)
};

這里有魔術(shù)發(fā)生,首先,一個(gè)特殊的標(biāo)準(zhǔn)require函數(shù)將被創(chuàng)建,這就是我們熟悉的require()函數(shù),當(dāng)函數(shù)自己包裝了Module.require,它還包含一些很少人知道的幫助屬性和方法,如:

  • require():加載一個(gè)外部模塊

  • require.resolve(): 根據(jù)其絕對(duì)路徑解決模塊名稱(chēng)

  • require.main: 主要的模塊

  • require.cache: 所有緩存模塊

  • require.extensions: 基于文件的擴(kuò)展名可用于編譯的方法。

一旦require準(zhǔn)備就緒,整個(gè)源碼將被包裝進(jìn)一個(gè)新的函數(shù),這個(gè)函數(shù)有require module和exports和其他暴露變量作為參數(shù),這創(chuàng)建了模塊的一個(gè)新函數(shù)作用域,這樣就不會(huì)污染Node.js環(huán)境的其余部分。

(function (exports, require, module, __filename, __dirname) { 
  // YOUR CODE INJECTED HERE! 你的代碼在這里
});

最后,這個(gè)包裝了模塊的函數(shù)將運(yùn)行,整個(gè)Module._compile方法同步執(zhí)行,這樣原來(lái)對(duì)Module._load方法調(diào)用將會(huì)等待這個(gè)代碼運(yùn)行,然后才會(huì)完成,返回module.exports給用戶(hù)。

現(xiàn)在,我們已經(jīng)知道require('模塊')是如何通過(guò)模塊系統(tǒng)加載你定義的模塊的, module.js source code包含更多代碼原理,如果你有興趣可以發(fā)現(xiàn)更多。

感謝各位的閱讀!關(guān)于Node.js中require()的工作原理是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

網(wǎng)站欄目:Node.js中require()的工作原理是什么
網(wǎng)站網(wǎng)址:http://jinyejixie.com/article32/jjihpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、動(dòng)態(tài)網(wǎng)站、用戶(hù)體驗(yàn)虛擬主機(jī)、小程序開(kāi)發(fā)域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
桃江县| 嘉荫县| 连城县| 江源县| 大同市| 蓝田县| 仁寿县| 靖江市| 玛沁县| 香港 | 郯城县| 库尔勒市| 常熟市| 息烽县| 建阳市| 三原县| 峨边| 怀集县| 织金县| 青海省| 宁武县| 闵行区| 七台河市| 错那县| 武功县| 济源市| 湖口县| 蒙城县| 庆元县| 隆化县| 双牌县| 宝坻区| 青神县| 闽清县| 潼关县| 平昌县| 岢岚县| 西平县| 禄丰县| 金山区| 鹤峰县|