我想在我的C / C ++应用程序中使用Node.js脚本。有人建议我从v8,libev和libeio开始;但它意味着从头开始重写Node.js.
那么,是否可以将Node.js嵌入到C或C ++中?
答案 0 :(得分:14)
您首先应该考虑是否足以将您的应用程序实现为Node 的C ++模块,然后将主要部分粘贴为Node脚本。
否则你可能希望“重新实现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();
});
您可以使用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以及他们可能希望放入其脚本/配置中的任何内容!
更新: 对src/node.js
的{{3}}有一个非常有用的评论:
// 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/
的内容在构建时被编译为字节码。
答案 1 :(得分:12)
嵌入Node.JS现在由Node.JS fork JXcore正式支持。嵌入文档可从this link获得。
答案 2 :(得分:1)
我已经建立了一些接近我认为你正在寻找的东西:
https://github.com/ZECTBynmo/tacnode
这是一个允许node.js静态链接到C ++应用程序的库。它绝对没有被抛光,但我用它来启动简单的节点脚本。
答案 3 :(得分:1)
嵌入节点有很多好的理由,包括利用npm的能力。
不幸的是JXCore正在死去。 这个artice提供了一些替代方案。 http://www.goland.org/nodeapps/
答案 4 :(得分:0)
可能是,V8是用C ++编写的,node.js可以在V8上运行,但除非你有一个极其的理由,为什么你要通过C ++运行javascript,你可能会更好地找到它一个适当的C ++库,并直接在C ++中实现所需的功能。集成脚本语言和本机代码的任务通常并不简单。例如。 V8 documentation。 Qt在c ++和javascript之间提供了相当不错的集成,在脚本和代码之间来回移动对象仍然不是一件容易的事。
答案 5 :(得分:0)
我刚刚查看了js-git这是为Node.js做的,也取决于其他一些Node.js模块。
但是,同一个开发人员编写了一个工具tim-task来包装一些常见的Node.js函数,最重要的是require
,并将一些Node.js模块打包在一起不再依赖Node.js了。他使用它来制作git-web-platform,即js-git打包为JS文件,可以在浏览器中使用。生成的打包文件看起来像this。这可能也可以在纯V8中进行少量修改。
这可能对您有用。但请注意,这种方法将受到限制。