日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
面試官:說(shuō)說(shuō)Node文件查找的優(yōu)先級(jí)以及Require方法的文件查找策略?

[[405171]]

本文轉(zhuǎn)載自微信公眾號(hào)「JS每日一題」,作者灰灰。轉(zhuǎn)載本文請(qǐng)聯(lián)系JS每日一題公眾號(hào)。

一、模塊規(guī)范

NodeJS對(duì)CommonJS進(jìn)行了支持和實(shí)現(xiàn),讓我們?cè)陂_(kāi)發(fā)node的過(guò)程中可以方便的進(jìn)行模塊化開(kāi)發(fā):

  • 在Node中每一個(gè)js文件都是一個(gè)單獨(dú)的模塊
  • 模塊中包括CommonJS規(guī)范的核心變量:exports、module.exports、require
  • 通過(guò)上述變量進(jìn)行模塊化開(kāi)發(fā)

而模塊化的核心是導(dǎo)出與導(dǎo)入,在Node中通過(guò)exports與module.exports負(fù)責(zé)對(duì)模塊中的內(nèi)容進(jìn)行導(dǎo)出,通過(guò)require函數(shù)導(dǎo)入其他模塊(自定義模塊、系統(tǒng)模塊、第三方庫(kù)模塊)中的內(nèi)容

二、查找策略

require方法接收一下幾種參數(shù)的傳遞:

  • 原生模塊:http、fs、path等
  • 相對(duì)路徑的文件模塊:./mod或../mod
  • 絕對(duì)路徑的文件模塊:/pathtomodule/mod
  • 目錄作為模塊:./dirname
  • 非原生模塊的文件模塊:mod

require參數(shù)較為簡(jiǎn)單,但是內(nèi)部的加載卻是十分復(fù)雜的,其加載優(yōu)先級(jí)也各自不同,如下圖:

從上圖可以看見(jiàn),文件模塊存在緩存區(qū),尋找模塊路徑的時(shí)候都會(huì)優(yōu)先從緩存中加載已經(jīng)存在的模塊

原生模塊

而像原生模塊這些,通過(guò)require方法在解析文件名之后,優(yōu)先檢查模塊是否在原生模塊列表中,如果在則從原生模塊中加載

絕對(duì)路徑、相對(duì)路徑

如果require絕對(duì)路徑的文件,則直接查找對(duì)應(yīng)的路徑,速度最快

相對(duì)路徑的模塊則相對(duì)于當(dāng)前調(diào)用require的文件去查找

如果按確切的文件名沒(méi)有找到模塊,則 NodeJs 會(huì)嘗試帶上 .js、.json或 .node拓展名再加載

目錄作為模塊

默認(rèn)情況是根據(jù)根目錄中package.json文件的main來(lái)指定目錄模塊,如:

 
 
 
 
  1. { "name" : "some-library", 
  2.   "main" : "main.js" } 

如果這是在./some-library node_modules目錄中,則 require('./some-library') 會(huì)試圖加載 ./some-library/main.js

如果目錄里沒(méi)有 package.json文件,或者 main入口不存在或無(wú)法解析,則會(huì)試圖加載目錄下的 index.js 或 index.node 文件

非原生模塊

在每個(gè)文件中都存在module.paths,表示模塊的搜索路徑,require就是根據(jù)其來(lái)尋找文件

在window下輸出如下:

 
 
 
 
  1. [ 'c:\\nodejs\\node_modules', 
  2. 'c:\\node_modules' ] 

可以看出module path的生成規(guī)則為:從當(dāng)前文件目錄開(kāi)始查找node_modules目錄;然后依次進(jìn)入父目錄,查找父目錄下的node_modules目錄,依次迭代,直到根目錄下的node_modules目錄

當(dāng)都找不到的時(shí)候,則會(huì)從系統(tǒng)NODE_PATH環(huán)境變量查找

舉個(gè)例子:

如果在/home/ry/projects/foo.js文件里調(diào)用了 require('bar.js'),則 Node.js 會(huì)按以下順序查找:

  • /home/ry/projects/node_modules/bar.js
  • /home/ry/node_modules/bar.js
  • /home/node_modules/bar.js
  • /node_modules/bar.js

這使得程序本地化它們的依賴,避免它們產(chǎn)生沖突

三、總結(jié)

通過(guò)上面模塊的文件查找策略之后,總結(jié)下文件查找的優(yōu)先級(jí):

  • 緩存的模塊優(yōu)先級(jí)最高
  • 如果是內(nèi)置模塊,則直接返回,優(yōu)先級(jí)僅次緩存的模塊
  • 如果是絕對(duì)路徑 / 開(kāi)頭,則從根目錄找
  • 如果是相對(duì)路徑 ./開(kāi)頭,則從當(dāng)前require文件相對(duì)位置找
  • 如果文件沒(méi)有攜帶后綴,先從js、json、node按順序查找
  • 如果是目錄,則根據(jù) package.json的main屬性值決定目錄下入口文件,默認(rèn)情況為 index.js
  • 如果文件為第三方模塊,則會(huì)引入 node_modules 文件,如果不在當(dāng)前倉(cāng)庫(kù)文件中,則自動(dòng)從上級(jí)遞歸查找,直到根目錄

參考文獻(xiàn)

http://nodejs.cn/api/modules.html#modules_file_modules

https://blog.csdn.net/qq_36801250/article/details/106352686

https://www.cnblogs.com/samve/p/10805908.html


網(wǎng)頁(yè)名稱:面試官:說(shuō)說(shuō)Node文件查找的優(yōu)先級(jí)以及Require方法的文件查找策略?
文章起源:http://www.5511xx.com/article/dhieccd.html