如何将自定义C ++模块集成到NodeJS的自定义版本中?

时间:2018-06-01 09:53:05

标签: javascript c++ node.js v8 embedded-v8

我希望创建一个使用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的实例。

1 个答案:

答案 0 :(得分:0)

您要问的是“插件”,这里有很多官方文档:https://nodejs.org/api/addons.html

它不像你问题中的假设代码那么容易,但基本原理是一样的。需要更多的代码来桥接C ++和JavaScript的世界(请记住,其中一个是垃圾收集而另一个是手动内存管理;一个是提前编译而另一个是作为源提供)。

请注意“N-API”部分。默认情况下,您将针对V8的C ++ API进行编程,这有时会在不同版本之间进行更改。为了使您的插件与尽可能多的Node / V8版本兼容,N-API提供了一个设计为随时间稳定的抽象层。