Node.js中require()是如何運作的?工作原理介紹
相關推薦:《nodejs 教程》
大多數人都知道Node.js中require()函數做什麼的,但有多少人知道它的運作原理呢?我們每天使用它來載入庫包和模組,但是它的內部行為原理很神秘。
我們追尋Node模組系統的核心: module.js,這個檔案包含一個令人驚訝的神奇功能,它負責載入編譯和快取每個用過的文件,讓我們揭開它的神秘面紗。
function Module(id, parent) { this.id = id; this.exports = {}; this.parent = parent; // ...
在module.js中可以發現這個Module類型,扮演兩個主要角色:首先,它提供一個所有Node.js模組從其文件被加載時構建一個實例的基礎功能,甚至在文件運行時持久,這就是為什麼我們能夠將一些屬性加入module.exports,並在需要時返回它們。
module的第二件事是處理Node模組的載入機制,標準的require函數其實是基於module.require的抽象,後者只是一個對Module._load的簡單包裝,載入方法處理每個文件的實際載入。看看它的程式碼大概如下:
Module._load = function(request, parent, isMain) { // 1.在Module._cache中检查模块是否被缓存 // 2.如果缓存中为空,创建一个新的模块实例。 // 3. 保存到缓存 // 4. 使用指定的名称调用module.load() // 在读取了文件内容后将调用module.compile() // 5.如果加载和分析文件时有错误 // 从缓存中删除坏的模块 // 6. 返回 module.exports };
Module._load負責載入新的模組並且管理模組緩存,快取每個模組能夠降低檔案的讀取頻率,從而提高效能,共享模組實例允許像單例模組那樣跨應用保存狀態。
如果一個模組在快取中不存在,Module._load將讀取檔案建立一個新的,讀取檔案內容成功後會呼叫module._compile
如果你注意上面第六步,你會看到返回的是module.exports,這就是為什麼當你定義公共介面時,可以使用exports和module.exports,因為它們確實是Model._load和require返回的。
下面看看module._compile:
Module.prototype._compile = function(content, filename) { // 1. 创建调用模块需要的require标准函数 // 2.将其他帮助方法加入require. // 3.包装JS代码到一个函数,这个函数提供我们的require // 模块, 比如变量本地化到模块的作用域 // 4.返回这个函数 };
這裡有魔術發生,首先,一個特殊的標準require函數將被創建,這就是我們熟悉的require()函數,當函數自己包裝了Module.require,它也包含一些很少人知道的幫助屬性和方法,如:
require():載入一個外部模組
- ##require.resolve(): 根據其絕對路徑解決模組名稱
- #require.main: 主要的模組
- require. cache: 所有快取模組
- require.extensions: 基於檔案的副檔名可用於編譯的方法。
(function (exports, require, module, __filename, __dirname) { // YOUR CODE INJECTED HERE! 你的代码在这里 });
程式設計教學! !
以上是Node.js中require()是如何運作的?工作原理介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

基於無阻塞、事件驅動建立的Node服務,具有記憶體消耗低的優點,非常適合處理海量的網路請求。在海量請求的前提下,就需要考慮「記憶體控制」的相關問題了。 1. V8的垃圾回收機制與記憶體限制 Js由垃圾回收機

選擇一個Node的Docker映像看起來像是小事,但是映像的大小和潛在漏洞可能會對你的CI/CD流程和安全造成重大的影響。那我們要如何選擇一個最好Node.js Docker映像呢?

Node 19已正式發布,以下這篇文章就來帶大家詳解了解Node.js 19的 6 大特性,希望對大家有幫助!

文件模組是對底層文件操作的封裝,例如文件讀寫/打開關閉/刪除添加等等文件模組最大的特點就是所有的方法都提供的**同步**和**異步**兩個版本,具有sync 字尾的方法都是同步方法,沒有的都是異

事件循環是 Node.js 的基本組成部分,透過確保主執行緒不被阻塞來實現非同步編程,了解事件循環對建立高效應用程式至關重要。以下這篇文章就來帶大家深入了解Node中的事件循環 ,希望對大家有幫助!

如何用pkg打包nodejs可執行檔?以下這篇文章跟大家介紹一下使用pkg將Node專案打包為執行檔的方法,希望對大家有幫助!
