久久精品五月,日韩不卡视频在线观看,国产精品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综合
国产精品一级| 日产精品一区二区| 欧美午夜精品一区二区三区电影| 国产一区二区三区四区五区| 国产一区二区三区不卡视频网站 | 色婷婷亚洲mv天堂mv在影片| 国际精品欧美精品| 99精品综合| 最新日韩av| 亚洲最新av| 国产女人18毛片水真多18精品| 久久香蕉网站| 美女网站一区| 91伊人久久| 婷婷综合六月| 中文字幕一区二区精品区| 国产极品嫩模在线观看91精品| 日韩精品不卡一区二区| 亚洲一区二区三区高清| 91亚洲无吗| av在线最新| 亚洲一区二区日韩| 麻豆精品国产91久久久久久| 99国产精品一区二区| 四虎精品一区二区免费| 国产一区二区三区久久| 精品91久久久久| 91精品丝袜国产高跟在线| 在线精品亚洲欧美日韩国产| 欧美专区在线| 国内精品伊人| 亚洲视频二区| 麻豆理论在线观看| 麻豆91精品| 国产精品扒开腿做爽爽爽软件| 91亚洲国产成人久久精品| 视频在线观看一区| 日韩国产欧美| 日本午夜精品一区二区三区电影 | 香蕉国产精品| 国产精品videossex| 欧美日韩高清| 久久精品免费看| 亚洲一区二区网站| 精品视频网站| 美女被久久久| 日本在线高清| 国产精品嫩模av在线| 亚洲欧洲一区| 麻豆视频在线看| 国产日韩在线观看视频| 亚洲综合国产| 日韩av福利| 免费精品一区| 日韩欧美中文在线观看| 免费国产自久久久久三四区久久| 欧美精品97| 亚洲久久在线| 黄色日韩在线| 高清av不卡| 久久女人天堂| 国产精品亚洲综合色区韩国| 亚洲日韩视频| 久久国产99| 午夜国产一区二区| 欧美日韩国产v| 国产一区福利| 国产欧美另类| 欧美一区二区三区久久精品| 一区二区三区网站| 久久不射中文字幕| 欧美日韩国产探花| 亚洲高清不卡| 性欧美长视频| 亚洲香蕉久久| 999久久久亚洲| 国产精品成人a在线观看| 日韩在线观看中文字幕| 丝袜诱惑制服诱惑色一区在线观看| 日韩久久电影| 高清不卡一区| 麻豆91精品视频| 久久国内精品视频| 亚欧成人精品| 日韩欧美精品一区二区综合视频| 亚洲尤物在线| 国产精品日韩| 亚洲一区网站| 久久午夜精品| 夜夜嗨网站十八久久| 欧美日韩黑人| 亚洲免费一区二区| 爽爽淫人综合网网站| 丝袜诱惑制服诱惑色一区在线观看 | 日韩精品视频中文字幕| 亚洲久草在线| 亚洲欧美日韩国产一区二区| 福利欧美精品在线| 天堂成人免费av电影一区| 在线亚洲国产精品网站| 欧美日韩国产探花| 欧美日一区二区| 免费精品国产的网站免费观看| 婷婷丁香综合| 蜜臀av国产精品久久久久 | 国产精品777777在线播放 | 免费在线观看成人| 亚洲精品第一| 日韩手机在线| 日韩欧乱色一区二区三区在线| 日韩一区精品| 国产精品香蕉| 中文字幕人成乱码在线观看| 久久国产日本精品| 丝瓜av网站精品一区二区| 91成人在线| 成人在线超碰| 不卡在线一区| 老鸭窝亚洲一区二区三区| 日韩欧美中文字幕在线视频| 美女性感视频久久| 免费视频久久| 国产精东传媒成人av电影| 欧美aⅴ一区二区三区视频| 国产精品亚洲片在线播放| 国产精品99精品一区二区三区∴| 麻豆视频在线看| 亚洲深夜福利| 欧美精品国产白浆久久久久| 福利一区二区| 蜜桃av一区| 麻豆精品久久久| 欧美日韩视频| 国产福利一区二区三区在线播放| 日韩网站中文字幕| 色综合视频一区二区三区日韩 | 日韩一区二区三区精品| 国产精品嫩模av在线| 亚洲午夜精品久久久久久app| 综合欧美亚洲| 日韩国产综合| 日本伊人久久| 视频一区日韩精品| 亚洲aⅴ网站| 欧美天堂在线| 日韩免费看片| 午夜久久av| 久久精品观看| 啪啪亚洲精品| 精品一区欧美| 久久的色偷偷| 丝袜脚交一区二区| 国产精品蜜芽在线观看| 亚洲深深色噜噜狠狠爱网站| 久久久久久一区二区| 亚洲欧美日本国产专区一区| 国产精成人品2018| 视频一区欧美日韩| 三上亚洲一区二区| 一区二区三区网站| 人人精品亚洲| 国产精品mm| 亚洲精选成人| 蜜桃tv一区二区三区| 久久亚洲道色| 日本不卡的三区四区五区| 午夜国产精品视频免费体验区| 麻豆精品久久| 日韩高清成人在线| 国产精品婷婷| 91精品精品| 麻豆国产91在线播放| 午夜电影一区| 久久福利一区| 国产精品精品国产一区二区| 欧美综合二区| 亚洲成av人片一区二区密柚| 国产日韩欧美中文在线| 中国女人久久久| 日韩视频网站在线观看| 国产乱人伦丫前精品视频 | 欧美日韩视频| 成人自拍av| 欧洲av不卡| 在线观看亚洲精品福利片| 日韩av二区| 麻豆精品视频在线观看免费| 日韩av一区二区三区四区| 亚洲天堂日韩在线| 人人精品人人爱| 黄色成人精品网站| 一区二区三区视频免费观看| 日韩一区亚洲二区| 欧美激情国产在线| 国产精品福利在线观看播放| 久久精品天堂| 电影91久久久| 日韩成人精品一区| 久久精品卡一| 黑丝美女一区二区|