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

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

那么,是否有可能将Node.jsembedded到C或C ++中?

它可能是,V8是用C ++编写的,node.js可以在V8上运行,但是除非你有一个非常好的理由,为什么你要通过C ++来运行javascript,你可能会更好地find合适的C ++库并直接实现所需的function在C ++中。 集成脚本语言和本地代码的任务通常不是微不足道的。 例如V8文档 。 Qt在c ++和javascript之间提供了一个相当不错的集成,并且在脚本和代码之间来回移动对象仍然不是微不足道的。

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

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

您也可以尝试使用默认加载的东西重新打包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(); }); 

您可以使用JSlint作为您的parsing器,然后grep危险的调用,然后eval(conf_script)或只使用require(config.js) ,但您将需要添加exports.someMethod = function (...) {...} 。 但是require()总的来说要安全得多,不过你可能希望为你的configuration实现一个预处理器,它将替代exports.someMethod = function (...) {...}来代替你的函数,并且会追加require('OnlyCallMySafeMethods')并拒绝任何试图require('fs')或其他你可能害怕让别人使用的lib。 这种安全性只是你可能希望拥有的一种可选的东西,完全取决于你。 虽然我想你可能想用exports.someMethod = ....replace,并在顶部添加一个require('myAppConfigLib) ,这样用户就可以使用API​​和他们希望放入脚本的任何东西/configuration!

更新:src/node.js 第66行有一个相当有用的评论:

  // 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. 

还请注意, src/的内容正在编译为字节码。

embeddedNode.JS现在正式由一个Node.JS分支JXcore支持。 embedded文档可从此链接获得 。

我已经build立了一些我认为你正在寻找的东西:

https://github.com/ZECTBynmo/tacnode

这是一个允许node.js静态链接到C ++应用程序的库。 这绝对没有抛光,但我用它来启动简单的节点脚本。

embedded节点有很多很好的理由,包括利用npm的能力。

不幸的是JXCore正在死亡。 这个artice给了一些替代品。 http://www.goland.org/nodeapps/

我只是检查了为Node.js制作的js-git ,并且还依赖于其他一些Node.js模块。

然而,同一个开发人员编写了一个工具tim-task来包装一些常见的Node.js函数,最重要的是require ,并且将Node.js模块打包在一起,使其不再依赖于Node.js。 他用它来制作git-web-platform ,也就是将js-git打包成一个可以在浏览器中使用的JS文件。 结果打包文件看起来像这样 。 这可能也可以在纯V8中稍作修改。

这可能对你有用。 但请注意,这种方法将受到限制。