![](/img/trans.png)
[英]Node.js compiles files I did not require. How does that work under the hood?
[英]How require work under the hood in NodeJS?
我試圖了解 nodeJS 的引導是如何工作的,但我堆滿了 function require
internal/bootstrap/node.js
中首次使用 require(見下圖)native_module_require
傳遞給src/node.cc
中的這個文件internal/bootstrap/loaders.js
loaders.js 獲取 require(在第 1 步之前執行)internal/bootstrap/loaders.js
使用internalBinding
,它使用getInternalBinding
getInternalBinding
創建自...src/node_binding.cc
,看起來有點復雜,但我的情況(第 4 步中的"native_module"
)是findModule(modlist_internal...
modlist_internal
保存在node_module_register
中napi_module_register
NAPI_MODULE
NAPI_MODULE
的地方(測試和工作台除外)我使用來自 GitHub 的 nodeJS 的 16.14.0 LTS 版本
我想做什么? 沒什么特別的,只是好奇,我也研究了舊項目的源代碼,它可以在瀏覽器中運行節點https://github.com/olydis/node-in-browser ,但是它使用舊版本的nodeJS(不同require
),並且該項目幾年沒有更新。 另外,我想知道 stackblitz.com 如何在瀏覽器中啟動現代版本的 nodeJS。
PS 還有文件夾 lib\internal\modules\ 這在某種程度上與require
和import
相關,但我不認為它在引導過程中使用,也許稍后
PPS 我只知道 javaScript,所以我可以在 C++ 源代碼中遺漏一些重要的東西
在節點可執行文件的 .data 部分,有 C++ 個包含本機 js 源的字符串。 在節點可執行文件的 .text 部分是從這些字符串編譯而來的可執行代碼片段。 V8 通過 V8 實例隔離區的全局 object 內部的映射維護原生 js 源和可執行代碼片段之間的綁定,節點在初始化期間使用正確的映射/綁定設置 V8 隔離區。 Require 是本機 js 源之一。
進一步將js代碼通過V8由node轉化為可執行代碼和數據。 你的程序,調用require,就是這樣的js代碼。 由於 require 是一個原生的 js 模塊,存在對可執行代碼的綁定,因此 V8 知道在編譯調用時使用哪個地址。 require 的實現具有判斷其參數是否為本機模塊的邏輯,因為導入本機模塊與非本機模塊的邏輯不同。
因此,對 require 的調用通過編譯為對預編譯的 function 的調用來工作,這是 V8 知道的節點可執行文件的一部分,這要歸功於節點對 V8 的設置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.