如何将Node.js解释器嵌入到C/C++中?

Jef*_*eff 34 c c++ node.js

我想在我的C/C++应用程序中使用Node.js脚本.有人建议我从v8,libev和libeio开始; 但这意味着从头开始重写Node.js.

那么,是否可以将Node.js嵌入到C或C++中?

err*_*per 14

您应首先考虑将您的应用程序实现为Node的C++模块,然后将主要部分粘贴为Node脚本是否足够.

否则,您可能希望"重新实现节点",以核心代码为例,删除不需要的部分(例如HTTP模块),然后将组件放入其中.最不痛苦的方法是进行子树合并并剥离构建系统,然后在构建脚本中添加前缀以指向它所在的目录.然后,您可以停止构建某些部件.然而,Node的构建系统包含几个部分,这可能是一项相当困难的工作.

您还可以尝试使用默认加载的东西重新打包Node并更改可执行文件的名称.然而,这只是采用我所描述的第一种方法的一种更复杂的方式,你可以安装一个脚本,/usr/bin/其中将:

  #!/usr/bin/node
  var myAppMain = require('libmyApp');
  myAppMain.withConfig(filename,
  function(err, cnf) {
     if (err) throw err; // parser or file access error
     cnf.evalMe();
  });
Run Code Online (Sandbox Code Playgroud)

您可以使用JSlint作为解析器,然后使用grep进行危险调用,然后eval(conf_script)使用require(config.js),但您需要添加exports.someMethod = function (...) {...}.但require()在一般更安全,但您可能希望实现预处理器为你的配置将替代exports.someMethod = function (...) {...}的,而不是你的职责,并会追加require('OnlyCallMySafeMethods')而拒绝任何企图require('fs')或其他的lib,你可能会害怕让别人使用.这种安全性只是您可能希望拥有的一种选择,这完全取决于您.虽然我想你可能想要用exports.someMethod = ....替换做一点,然后require('myAppConfigLib)在顶部添加一个,这样用户就可以使用API​​加上他们可能希望放入脚本/配置的任何内容!

更新:有一个非常有用的注释第66行src/node.js:

  // To allow people to extend Node in different ways, this hook allows
  // one to drop a file lib/_third_party_main.js into the build
  // directory which will be executed instead of Node's normal loading.
Run Code Online (Sandbox Code Playgroud)

另请注意,src/在构建时将内容编译为字节码.


Nur*_*tin 14

嵌入Node.JS现在由Node.JS fork JXcore正式支持.可以从此链接获得嵌入文档.


Har*_*ich 1

可能是,V8 是用 C++ 编写的,node.js 可以在 V8 上运行,但除非你有一个非常充分的理由为什么要通过 C++ 运行 javascript,否则你最好找到一个合适的 C++ 库并直接实现所需的功能在C++中。集成脚本语言和本机代码的任务通常并不简单。例如V8 文档。Qt 在 C++ 和 javascript 之间提供了相当不错的集成,并且在脚本和代码之间来回移动对象仍然不是小事。