繁体   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