簡體   English   中英

require 在 NodeJS 中如何工作?

[英]How require work under the hood in NodeJS?

我試圖了解 nodeJS 的引導是如何工作的,但我堆滿了 function require

  1. internal/bootstrap/node.js中首次使用 require(見下圖)
  2. require 作為native_module_require傳遞給src/node.cc中的這個文件
  3. node.cc 從internal/bootstrap/loaders.js loaders.js 獲取 require(在第 1 步之前執行)
  4. internal/bootstrap/loaders.js使用internalBinding ,它使用getInternalBinding
  5. getInternalBinding創建自...
  6. src/node_binding.cc ,看起來有點復雜,但我的情況(第 4 步中的"native_module" )是findModule(modlist_internal...
  7. modlist_internal保存在node_module_register
  8. napi_module_register
  9. NAPI_MODULE
  10. 但我找不到使用NAPI_MODULE的地方(測試和工作台除外)

代碼塊

我使用來自 GitHub 的 nodeJS 的 16.14.0 LTS 版本

我想做什么? 沒什么特別的,只是好奇,我也研究了舊項目的源代碼,它可以在瀏覽器中運行節點https://github.com/olydis/node-in-browser ,但是它使用舊版本的nodeJS(不同require ),並且該項目幾年沒有更新。 另外,我想知道 stackblitz.com 如何在瀏覽器中啟動現代版本的 nodeJS。

PS 還有文件夾 lib\internal\modules\ 這在某種程度上與requireimport相關,但我不認為它在引導過程中使用,也許稍后

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM