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

S·阿吉斯·库马尔

节点解释器是否在节点二进制文件中寻找核心模块(比如“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)中。那么 node 如何将 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);
d_shiv

这里提出了两个不同(但看似相关)的问题。第一个是:“核心模块如何工作?”。第二个是“NodeJS 如何让 C++ 代码在 JavaScript 中被引用和执行?”。让我们一一拿下。

核心模块如何工作?

核心模块用 NodeJS 二进制文件打包。而且,虽然它们与二进制文件一起打包,但它们在打包之前不会转换为 C++ 代码。内部模块在节点进程的引导过程加载到内存中。当程序执行时,可以说require('fs'),require 函数只是从缓存中返回已经加载的模块。内部模块的实际加载显然发生在 c++ 代码中

NodeJS 如何让 C++ 代码在 JS 中被引用?

这种能力部分来自 V8 引擎,它公开了在 C++ 中创建和管理 JS 构造的能力,部分来自 NodeJS / LibUV,它们在 V8 之上创建了一个包装器以提供执行环境。可以在此处访问有关此类节点模块的文档正如文档所述,这些 c++ 模块可以通过要求在 JS 文件中使用,就像任何其他普通的 JS 模块一样。

但是,您在 JS ( loadPKCS12) 中使用 c++ 函数的示例是 NodeJS 内部 c++ 功能的更特殊情况。loadPKCS12SecureContextcryptoc++ 模块导入的对象上调用如果您按照_tls_common.js上面的SecureContext 导入链接,您将看到加密不是使用 加载的require(),而是使用特殊(全局)方法internalBinding来获取引用。文件最后一行注册node_crypto.cc了内部模块的初始化程序crypto在初始化链之后,node::crypto::Initialize调用node::crypto::SecureContext::Initialize创建函数模板,分配适当的原型方法并将其导出到target. 最终这些从 C++ 世界导出的功能被导入并在 JS-World 中使用internalBinding.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何覆盖node.js核心模块?

来自分类Dev

如何从node.js将资产上传到github版本

来自分类Dev

Github中node.js的“可执行文件”

来自分类Dev

是否可以在Node.js中替换或别名核心模块?

来自分类Dev

您如何在Node.js中对GitHub App进行身份验证?

来自分类Dev

在同一工作中使用Node.JS和.NET的GitHub动作

来自分类Dev

node.js http模块http.createServer如何工作?

来自分类Dev

Node.js模块在不同设备中无法正常工作

来自分类Dev

使用Node JS中的Curl在GitHub上更新文件的问题

来自分类Dev

Node.js中的模块

来自分类Dev

使用github操作进行部署时如何在node.js进程中设置环境变量

来自分类Dev

Node js 逐行模块

来自分类Dev

如何使用JSDoc注释Node.js核心模块以在IntelliJ中进行代码提示?

来自分类Dev

Request forbidden while accessing github api on node.js program

来自分类Dev

Node JS无法从github网址正确下载文件

来自分类Dev

如何从node.js中的请求模块获取cookie?

来自分类Dev

如何在Node JS中模块化代码

来自分类Dev

如何从clojurescript调用node.js模块中的javascript?

来自分类Dev

如何在Node.js模块中监视类方法

来自分类Dev

如何使用C ++插件中内置模块的node.js

来自分类Dev

如何在Node.js中卸载npm模块?

来自分类Dev

如何在Node.js模块中监视类方法

来自分类Dev

如何从Node.js模块中的请求获取变量

来自分类Dev

如何在 node.js 模块中嵌入承诺?

来自分类Dev

如何在github上的另一个存储库中将node.js github存储库作为服务运行

来自分类Dev

我可以检查我的API密钥是否在node.js中足够隐藏以推送到github吗?

来自分类Dev

如何“继承” node.js模块

来自分类Dev

如何阅读Firebase Node.js模块?

来自分类Dev

在Node.js中模拟嵌套模块?

Related 相关文章

  1. 1

    如何覆盖node.js核心模块?

  2. 2

    如何从node.js将资产上传到github版本

  3. 3

    Github中node.js的“可执行文件”

  4. 4

    是否可以在Node.js中替换或别名核心模块?

  5. 5

    您如何在Node.js中对GitHub App进行身份验证?

  6. 6

    在同一工作中使用Node.JS和.NET的GitHub动作

  7. 7

    node.js http模块http.createServer如何工作?

  8. 8

    Node.js模块在不同设备中无法正常工作

  9. 9

    使用Node JS中的Curl在GitHub上更新文件的问题

  10. 10

    Node.js中的模块

  11. 11

    使用github操作进行部署时如何在node.js进程中设置环境变量

  12. 12

    Node js 逐行模块

  13. 13

    如何使用JSDoc注释Node.js核心模块以在IntelliJ中进行代码提示?

  14. 14

    Request forbidden while accessing github api on node.js program

  15. 15

    Node JS无法从github网址正确下载文件

  16. 16

    如何从node.js中的请求模块获取cookie?

  17. 17

    如何在Node JS中模块化代码

  18. 18

    如何从clojurescript调用node.js模块中的javascript?

  19. 19

    如何在Node.js模块中监视类方法

  20. 20

    如何使用C ++插件中内置模块的node.js

  21. 21

    如何在Node.js中卸载npm模块?

  22. 22

    如何在Node.js模块中监视类方法

  23. 23

    如何从Node.js模块中的请求获取变量

  24. 24

    如何在 node.js 模块中嵌入承诺?

  25. 25

    如何在github上的另一个存储库中将node.js github存储库作为服务运行

  26. 26

    我可以检查我的API密钥是否在node.js中足够隐藏以推送到github吗?

  27. 27

    如何“继承” node.js模块

  28. 28

    如何阅读Firebase Node.js模块?

  29. 29

    在Node.js中模拟嵌套模块?

热门标签

归档