成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Node.js 是怎么找到模塊的?你知道嗎?

開發 前端
首先分析標識符的風格,如果是不是路徑的寫法,我們會先找 Node.js 內置的包有沒有匹配的,如果匹配,就導入對應模塊,比如 require('http') 就能拿到一個 http 對象,可用于創建 web 服務等功能。

大家好,我是前端西瓜哥,今天我們來看看 Node.js 模塊查找的原理。

模塊種類

模塊有三種來源。

  1. 核心模塊:Node.js 內置的包。比如 http、fs、path。
  2. 自定義模塊:NPM 包。比如 axios、express,位于 node_modules 目錄下的同名目錄,并通過 package.json 的 main 字段指定入口文件。
  3. 文件模塊:項目自己的模塊文件,使用路徑的寫法。包括相對路徑(比如 "./utils")和絕對路徑(比如 "/Users/xigua/project/utils")。

需要注意的是,"a/b" 這種不屬于路徑寫法,它屬于前兩種,比如 "fs/promises"、"@babel/core"。

這里給一個例子:

const http = require('http'); // Node.js 內置包
const { defaultContent } = require('./default'); // 開發者自己寫的模塊文件
http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end(defaultContent);
}).listen(3200);

模塊查找

我們使用 require() 方法,傳入一個字符串標識符,模塊查找的旅途就開始了。

核心模塊

首先分析標識符的風格,如果是不是路徑的寫法,我們會先找 Node.js 內置的包有沒有匹配的,如果匹配,就導入對應模塊,比如 require('http') 就能拿到一個 http 對象,可用于創建 web 服務等功能。

NPM 包

如果不匹配,會在當前文件的目錄下,找 node_modules 目錄,看里面有沒有對應的包。如果找不到,就繼續往父目錄找,直到根目錄。如果找不到,會報 Cannot find module '包名' 的錯誤。

文件模塊

包通常是一個文件夾,里面會有 package.json 文件,Node.js 會提取其中 main 字段對應的文件作為模塊文件。如果沒有,就依次查找該目錄下的 index.js、index.json、index.node 文件。

需要查找的目錄可以通過 module.paths 變量得到。

如果你熟悉 JavaScript 的原型鏈,你會發現它們非常相似,可以做類比以加深理解。

如果標識符是路徑,會通過計算得到一個絕對路徑,然后找到的是個目錄,同上面找 npm 包的邏輯。

要是找不到,就加上后綴再找。后綴按順序添加為:.js 、.json、.node,找到就立即返回。若一個文件沒有后綴但被匹配到了,它會被當作 js 文件。

上面沒說緩存的情況,其實我們會對模塊做緩存,下面詳細說明一下。

模塊緩存

每當加載一個模塊后,這個模塊就會被緩存起來。

你可以在隨意一個文件中輸入得到緩存的內容,是一個哈希表,key 為模塊的絕對路徑,確保緩存命中,value 則是模塊對象。

const { Module } = require("module");
console.log(Module._cache);

也能用  require.cache 變量拿到,它和 Module._cache 指向同一個對象。

Node.js 內置的模塊也需要緩存,但它不會記錄到 Module._cache 中,而是保存在 Module.

下面是一個例子,index.js 導入了 a.js,a.js 下引入了 lodash.get 包,模塊緩存結果為:

圖片

因為緩存的存在,所以 一個模塊文件只會被執行一次,然后將 module.exports 緩存下來。

之后被多次導入,不會再執行這個模塊文件,而是直接取出對應的 module.exports。

總結

畫了個流程圖,丟掉了一些細節(路徑定位到目錄后的邏輯)。

圖片

責任編輯:姜華 來源: 前端西瓜哥
相關推薦

2025-04-27 09:04:08

2011-12-09 11:16:48

Node.js

2024-02-19 00:00:00

Docker輕量級容器

2024-12-04 08:40:19

2021-11-16 08:51:29

Node JavaScript變量類型

2024-11-26 00:45:29

free區域字段

2023-12-20 08:23:53

NIO組件非阻塞

2020-12-30 11:22:11

Node.js前端模塊

2024-12-11 08:19:34

2025-01-16 16:41:00

ObjectConditionJDK

2024-10-05 00:00:00

HTTPS性能HTTP/2

2024-06-20 08:06:30

2024-07-30 08:22:47

API前端網關

2024-11-08 09:48:38

異步編程I/O密集

2022-11-28 00:04:17

2024-01-15 12:16:37

2024-04-26 09:03:31

Node.jsCurrent發布版

2023-01-09 08:00:41

JavaScript閉包

2025-06-27 09:32:47

GoRedis單線程

2024-10-24 08:47:12

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久国产精品 | 亚洲一级av毛片 | 天堂va在线观看 | av中文字幕在线 | 欧美日韩精品久久久免费观看 | 男女性毛片| 91在线看片 | 精品视频成人 | 小川阿佐美pgd-606在线 | 午夜小电影 | 一本一道久久a久久精品蜜桃 | 日韩欧美一区二区三区 | 欧美8一10sex性hd | 亚洲性在线 | 国产一区二区视频在线观看 | 日韩久久综合 | 黄色av网站免费看 | 亚洲国产成人久久综合一区,久久久国产99 | 懂色一区二区三区免费观看 | 久久久久久久久一区 | 欧美激情精品久久久久久 | 中文字幕在线看人 | 国产一区91精品张津瑜 | 中文二区 | 日韩超碰在线 | 91精品国产91久久久久久密臀 | 欧美精品一区二区三区在线四季 | 精品亚洲永久免费精品 | 高清欧美性猛交 | 久久久免费少妇高潮毛片 | 久久国产精品久久久久 | 国产精品久久视频 | h视频免费在线观看 | 精品福利在线 | 超碰在线久 | 中文字幕国产 | 亚洲午夜精品久久久久久app | 日韩精品亚洲专区在线观看 | 亚洲一区中文字幕 | 中文字幕视频在线观看 | 日韩欧美综合在线视频 |