我希望创建一个使用NodeJS运行特定JavaScript文件的可执行文件。但是,这个NodeJS应该添加额外的“模块”,使用require
将C ++类/函数公开给JavaScript作用域。
到目前为止,我已成功将NodeJS编译到库中,并将其链接到我的超级简单C ++程序:
#include <vector>
#include "node.h"
int main(int argc, char* argv[]) {
std::vector<char*> newArgs;
newArgs.push_back(argv[0]);
char file[] = "my_file.js";
newArgs.push_back(file);
return node::Start(2, &newArgs[0]);
}
正如您所知,这只是在可执行文件的同一目录中执行名为“my_file.js”的JavaScript文件。
现在的问题是,我怎样才能将我在此代码中创建的潜在C ++类/函数暴露给JavaScript?
例如,我想做这样的事情:
#include <vector>
#include <iostream>
#include "node.h"
class Weather {
public:
Weather() {}
void makeItRain() {
std::cout << "It is raining\n";
}
};
int main(int argc, char* argv[]) {
std::vector<char*> newArgs;
newArgs.push_back(argv[0]);
char file[] = "my_file.js";
newArgs.push_back(file);
// hypothetical code
node::AddClass(Weather, "weather");
return node::Start(2, &newArgs[0]);
}
// my_file.js
var Weather = require("weather");
var w = new Weather();
w.makeItRain();
有什么建议吗? 我发现最接近的是v8pp,但我不知道如何接收v8 :: Isolate的实例。
答案 0 :(得分:0)
您要问的是“插件”,这里有很多官方文档:https://nodejs.org/api/addons.html
它不像你问题中的假设代码那么容易,但基本原理是一样的。需要更多的代码来桥接C ++和JavaScript的世界(请记住,其中一个是垃圾收集而另一个是手动内存管理;一个是提前编译而另一个是作为源提供)。
请注意“N-API”部分。默认情况下,您将针对V8的C ++ API进行编程,这有时会在不同版本之间进行更改。为了使您的插件与尽可能多的Node / V8版本兼容,N-API提供了一个设计为随时间稳定的抽象层。