久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

深入了解Node的模塊機制,聊聊模塊實現流程

本篇文章帶大家了解一下CommonJs規范和Node的模塊機制,介紹一下Node實現CommonJs規范的基本流程,希望對大家有所幫助!

深入了解Node的模塊機制,聊聊模塊實現流程

在CommonJs規范提出之前,Javascript是沒有模塊系統的,這意味著我們很難開發大型的應用,因為代碼的組織會比較困難。

什么是CommonJs規范


首先CommonJS不是Node獨有的東西,CommonJs是一種模塊規范,定義了如何引用和導出模塊,Nodejs只是實現了這個規范,CommonJS模塊規范主要分為模塊引用、模塊定義和模塊標識三個部分。

模塊引用

模塊引用就是我們可以通過require引入其它的模塊。

const { add } = require('./add'); const result = add(1 ,2);

模塊定義

一個文件就是一個模塊,模塊里會提供兩個變量,分別為module和exports。module為當前模塊本身,exports為要導出的內容,同時exports為module的一個屬性,即exports為module.exports。其他模塊通過require導入的內容即為module.exports的內容。

// add.js exports.add = (a, b) => {     return a + b; }

模塊標識

模塊標識即為require里面的內容,比如require('./add'),則模塊標識為./add。

通過CommonJS構建的這套模塊導入導出機制使得用戶完全無需考慮變量污染,可以方便的構建大型應用。

Node的模塊實現


Node實現了CommonJs規范,并且增加了一些自己需要的特性。Node為了實現CommonJs規范主要做了以下三件事情:

  • 路徑分析

  • 文件定位

  • 編譯執行

路徑分析

當執行require()的時候,require接收的參數即為模塊標識符,node通過模塊標識符來進行路徑分析。路徑分析的目的就是為了通過模塊標識符找到這個模塊所在的路徑。首先,node的模塊分為兩類,分別是核心模塊和文件模塊。核心模塊是node自帶的模塊,文件模塊是用戶編寫的模塊。同時文件模塊又分為相對路徑形式的文件模塊、絕對路徑形式的文件模塊和非路徑形式的文件模塊(比如express)。

深入了解Node的模塊機制,聊聊模塊實現流程

當node找到一個文件模塊之后,會將這個模塊編譯執行并且緩存起來,大致原理是將這個模塊的完整路徑作為key,編譯后的內容作為值,后續再第二次引入這個模塊的時候就不需要再進行路徑分析文件定位編譯執行這幾個步驟了,可以直接從緩存中讀取編譯好的內容。

// 緩存的模塊示意: const cachedModule = {     '/Usr/file/src/add.js': 'add.js編譯后的內容',     'http': 'Node自帶的http模塊編譯后的內容',     'express': '非路徑形式自定義文件模塊express編譯后的內容'     // ... }

當要查找require導入的模塊時,查找模塊的順序是先查看緩存里是否已經有該模塊,如果緩存里面沒有再查看核心模塊,然后再查找文件模塊。其中路徑形式的文件模塊比較好查找,根據相對或絕對路徑就可以得到完整的文件路徑。非路徑形式的自定義文件模塊查找起來會相對麻煩一些,Node會從node_modules這個文件夾里去查找是否有這個文件。

node_modules這個目錄在哪里呢,比如說我們當前執行的文件為/Usr/file/index.js;

/**  * /Usr/file/index.js; */  const { add } = require('add'); const result = add(1, 2);

這個模塊里我們有引入了一個add模塊,這個add不是一個核心模塊也不是一個路徑形式的文件模塊,那么這時候如何找到這個add模塊呢。

module有一個paths的屬性,查找add模塊的路徑在paths這個屬性里,我們可以把這個屬性打出來看一下:

/**  * /Usr/file/index.js; */  console.log(module.paths);

我們在file目錄下執行node index.js可以打印出paths的值。paths里的值是一個數組,如下:

[ '/Usr/file/node_modules', '/Usr/node_modules', '/node_modules', ]

即Node會依次從上面的目錄里尋在是否包含add這個模塊,原理和原型鏈類似。先從當前執行的文件的同級目錄的node_modules文件夾里開始找,如果沒找到或者沒有node_modules這個目錄,則繼續往上級查找。

文件定位

路徑分析和文件定位是搭配一起使用的,文件標識符可以是不帶后綴的,也可能通過路徑分析找到的是一個目錄或者一個包,這個時候要定位到具體的文件需要一些額外的處理。

文件擴展名分析

const { add } = require('./add');

比如上面這段代碼,文件標識符是不帶擴展名的,這個時候node會依次查找是否存在.js、.json、.node文件。

目錄和包分析

同樣是上面這段代碼,通過./add查找到的可能不是一個文件,可能是一個目錄或者包(通過判斷add文件夾下是否有package.json文件來判斷是目錄還是包)。這個時候文件定位的步驟是這樣的:

  • 查看是否有package.json文件
      • 讀取package.json里的main字段的值作為文件
    • 沒有
      • 尋找目錄下的index作為文件(依次查找index.js、index.json、index.node)

如果package.json里沒有main字段,那么也會將index作為文件,然后進行擴展名分析找到對應后綴的文件。

模塊編譯

我們開發中主要遇到的模塊為json模塊和js模塊。

json模塊編譯

當我們require一個json模塊的時候,實際上Node會幫我們使用fs.readFilcSync去讀取對應的json文件,得到json字符串,然后調用JSON.parse解析得到json對象,再賦值給module.exports,然后給到require。

js模塊編譯

當我們require一個js模塊的時候,比如

// index.js const { add } = require('./add');
// add.js exports.add = (a, b) => {     return a + b; }

這個時候發生了什么呢,為什么我們可以直接在模塊里使用module、exports、require這些變量。這是因為Node在編譯js模塊的時候對模塊的內容進行了首尾的包裝。

比如add.js這個模塊,實際編譯的時候是會被包裝成類似這樣的結構:

(function(require, exports, module) {   exports.add = (a, b) => {     return a + b;   }   return module.exports; })(require, module.exports, module)

即我們編寫的js文件是會被包裝成一個函數,我們編寫的只是這個函數里的內容,Node后續的包裝的過程對我們隱藏了。這個函數支持傳入一些參數,其中就包括require、exports和module。

當編譯完js文件后,就會執行這個文件,node會將對應的參數傳給這個函數然后執行,并且返回module.exports值給到require函數。

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
精品美女久久| 久久男人av资源站| 偷拍欧美精品| 蜜臀av一区二区三区| 婷婷成人av| 一区二区国产在线| 久久精品免费看| 国产精品一页| 午夜久久av| 久久电影一区| 精品国产91| 亚洲性色视频| 国产一区二区三区四区大秀| 成人精品亚洲| 久久国产成人| 欧美日本久久| 久久国产麻豆精品| 狠狠久久婷婷| 日本欧美大码aⅴ在线播放| 蜜桃视频一区二区三区| 国内在线观看一区二区三区 | 成人一区而且| 麻豆久久久久久| 欧美日韩在线观看视频小说| 精品91久久久久| 亚洲欧美专区| 久久精品av麻豆的观看方式| 激情欧美日韩一区| 久久精品在线| 婷婷综合六月| 国产精品日本一区二区不卡视频| 亚洲激情欧美| 亚洲精品国产嫩草在线观看| 精品在线网站观看| 日韩美女国产精品| 亚洲欧洲一区二区天堂久久| 日韩免费久久| 日本欧美一区| 日韩精品一二三区| 欧美午夜不卡影院在线观看完整版免费| 久久精品免费看| 久久精品人人| 精品国产成人| 国产不卡一区| 日韩成人精品一区二区| 精品三区视频| 久久久久久色 | 久久久久久黄| 日韩av一二三| 中文一区一区三区免费在线观 | 国产成人精品三级高清久久91| 日本午夜精品一区二区三区电影| 国产精品嫩草99av在线| 亚洲在线国产日韩欧美| 另类国产ts人妖高潮视频| 日韩av免费| 鲁大师成人一区二区三区 | 影院欧美亚洲| 久久精品国产久精国产| 91精品蜜臀一区二区三区在线 | 狠狠久久伊人| 色爱综合网欧美| 国产毛片精品久久| 岛国精品一区| 国内精品麻豆美女在线播放视频| 国产精品久久久久av电视剧| 黑森林国产精品av| 天堂久久av| 影院欧美亚洲| 亚洲毛片在线| 国产无遮挡裸体免费久久 | 日韩欧美综合| 9999国产精品| 日韩不卡一区二区三区| 日韩精品一二三区| 日韩和欧美一区二区三区| 久久麻豆精品| 日本在线成人| 国产探花在线精品一区二区| 中文无码久久精品| 日韩视频一区| 日韩中文字幕区一区有砖一区 | 99久久激情| japanese国产精品| 亚洲精品九九| 麻豆亚洲精品| 国产手机视频一区二区| 欧美羞羞视频| 精品视频自拍| 国产高潮在线| 日韩欧美在线精品| 久久国内精品自在自线400部| 国产成人精选| 91国内精品| 国产乱码精品| 久久精品99国产国产精| 蜜桃av在线播放| 99精品小视频| 欧洲一级精品| 伊人久久高清| 亚洲精品极品少妇16p| 黄色在线一区| 六月天综合网| 中文国产一区| 亚洲婷婷在线| 日本美女一区| 久久国产麻豆精品| 国产成人免费视频网站视频社区| 美女av一区| 欧美影院精品| 亚洲精品乱码| 免费一区二区三区在线视频| 国产精品nxnn| 精品亚洲a∨一区二区三区18| 成人精品中文字幕| 欧美激情91| 欧美日一区二区在线观看| 四虎成人av| 日韩午夜在线| 久久gogo国模啪啪裸体| 欧美一级网址| 女人天堂亚洲aⅴ在线观看| 视频一区二区三区入口| 亚洲一级淫片| 日韩av福利| 91综合久久爱com| 欧美.日韩.国产.一区.二区| 国产精品乱战久久久| 亚洲精选久久| 国产伦精品一区二区三区千人斩| 日本成人一区二区| 国产亚洲一区| 在线精品视频一区| 日韩综合精品| 精品午夜视频| 欧美日中文字幕| 久久99久久久精品欧美| 日韩精品一二三区| 激情综合网五月| 三级在线看中文字幕完整版| 欧美精品羞羞答答| 9999国产精品| 国产精品久久久久久久久久久久久久久| 久久久精品日韩| 日韩国产一区二区| 成人国产精品一区二区网站| 亚洲小说春色综合另类电影| 日韩精品一级| 免费视频久久| 羞羞答答国产精品www一本| 日本一区二区免费高清| 一区二区三区四区在线观看国产日韩| 欧美一区激情| 国产精品s色| 精品国产欧美| 国产不卡av一区二区| 国产视频一区二区在线播放| 国产精品一区二区精品| 日韩在线短视频| 香蕉人人精品| 日韩av福利| 香蕉久久国产| 亚洲男女自偷自拍| 国产免费av一区二区三区| 日本三级亚洲精品| 99久久亚洲精品蜜臀| 桃色一区二区| 999久久久亚洲| 黄色在线一区| 欧美美女一区| 久久国内精品| 中文无码久久精品| 在线观看一区| 日韩高清在线不卡| 国产伦精品一区二区三区千人斩 | 精品高清久久| 欧美福利在线| 99精品美女| 日韩在线卡一卡二| 亚洲欧洲美洲国产香蕉| 国产精品videossex| 国产欧美一区二区三区米奇| 青青国产91久久久久久| 欧美日韩午夜电影网| 丰满少妇一区| 伊人久久婷婷| 日韩福利视频一区| 国产 日韩 欧美 综合 一区| 日韩欧美精品综合| 在线看片日韩| 国产一区二区三区久久| 喷白浆一区二区| 日韩毛片网站| 国产一区国产二区国产三区| 免费日韩av| 欧美日韩国产v| 国产日韩综合| 麻豆精品国产91久久久久久| 中文字幕亚洲精品乱码| 久久久久久婷|