簡體   English   中英

node.js中的核心模塊如何工作? (https://github.com/nodejs/node/blob/master/lib)

[英]How do the core modules in node.js work? (https://github.com/nodejs/node/blob/master/lib)

節點解釋器是否在節點二進制文件中尋找核心模塊(比如說“ fs”)? 如果是,這些模塊是否打包為js文件。 我們的代碼中引用的核心模塊是否先轉換為c / c ++代碼然后執行? 例如,我在_tls_common.js( https://github.com/nodejs/node/blob/master/lib/_tls_common.js )文件中看到一個名為“ loadPKCS12”的方法,而我唯一看到此方法的地方引用/定義在“ node_crypto.cc”文件中( https://github.com/nodejs/node/blob/master/src/node_crypto.cc )。 那么,節點如何將javascript中的方法與c / c ++文件中定義的方法鏈接起來?

以下是使用“ loadPKCS12”方法的_tls_common.js文件的摘錄:

 if (passphrase) {
      c.context.loadPKCS12(buf, toBuf(passphrase));
    } else {
      c.context.loadPKCS12(buf);
    }
  }
} else {
  const buf = toBuf(options.pfx);
  const passphrase = options.passphrase;
  if (passphrase) {
    c.context.loadPKCS12(buf, toBuf(passphrase));
  } else {
    c.context.loadPKCS12(buf);

這里有兩個不同(但看似相關)的問題。 第一個是:“核心模塊如何工作?”。 第二個是“ NodeJS如何讓c ++代碼在JavaScript中被引用和執行?”。 讓我們一一介紹。

核心模塊如何工作?

核心模塊與NodeJS二進制文件一起打包。 而且,盡管它們與二進制文件一起打包,但打包之前不會轉換為c ++代碼。 內部模塊在節點進程的引導過程中被加載到內存中。 當程序執行時,可以說require('fs') ,require函數只是從緩存中返回已經加載的模塊。 內部模塊的實際加載顯然是在c ++代碼中進行的

NodeJS如何讓c ++代碼在JS中被引用?

此功能部分來自V8引擎,該引擎提供了在C ++中創建和管理JS構造的功能,另一部分來自NodeJS / LibUV,后者在V8之上創建了一個包裝器以提供執行環境。 可以在此處訪問有關此類節點模塊的文檔。 如文檔所述,這些c ++模塊可以像其他任何普通JS模塊一樣通過要求在JS文件中使用。

但是,您在JS中使用c ++函數的示例( loadPKCS12 )是loadPKCS12內部c ++功能的更特殊情況。 crypto c ++模塊導入的SecureContext對象上調用loadPKCS12 如果您_tls_common.js上面_tls_common.js SecureContext導入的鏈接,您將看到未使用require()加載加密_tls_common.js ,而是使用特殊的(全局)方法internalBinding獲取引用。 node_crypto.cc文件的最后一行 ,注冊了內部模塊crypto初始化程序。 按照初始化鏈, node::crypto::Initialize調用node::crypto::SecureContext::Initialize創建一個功能模板,分配適當的原型方法並將其導出到target 最終,這些來自C ++ world的導出功能通過internalBinding導入並在JS-World中使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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