[英]Can i use office 365 Rest Api implemented here [https://github.com/jasonjoh/node-tutorial] in node.js as a Web service?
[英]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.