【问题标题】:C++ level nodeJS module loadingC++级nodeJS模块加载
【发布时间】:2014-08-11 12:34:56
【问题描述】:

我正在开发一个 NodeJS 模块,它的文件大小正在急剧增加,但是我意识到我可以将我的模块分成两个单独的模块。当这种情况发生时,我的第二个模块中只有少数函数需要使用我的第一个模块的内部 C++ 类。是否可以以某种方式仅将第一个模块的原型传递给第二个模块?

例子:

模块 A: 有一个名为cModuleA的类:

class cModuleA {
    //declarations
    data* pointer;
}

模块 B: 有大约 100 个函数,但其​​中只有一个需要操作 data* 指针。它还需要返回cModuleA 对象(因此它需要cModuleA 的原型或注意cModuleA 的实现)

我尝试从第一个模块(Windows 中的dllimport/dllexport)导出符号,但我只是想知道是否有更好的选择在 C++ 级别注入依赖项。

【问题讨论】:

  • @ToddMoses 在这种情况下,FooNeedFoo 都存在于同一个包中(也就是他们知道彼此的实现)但在这里我有我的 Module A 在另一个二进制文件和 @987654332 @在另一个。

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


【解决方案1】:

我找到了解决这个问题的方法,我将详细介绍它,因为可能没有其他人尝试过这么疯狂的事情!

假设您有 两个 本机节点模块。这意味着它们存在于单独的可执行文件(.node)中。其中一个是moduleA,另一个是moduleB:

模块A

class cppClass
{
public:
    cppClass();
    ~cppClass();
    // C++ stuff here
}; // !class cppClass

class cppClassWrap
    : public node::ObjectWrap
{
public:
    // used for initializing this class for Node/v8
    static void Initialize(v8::Handle<Object> target);
    // internal C++ data accessor
    cppClass* GetWrapped() const { return internal_; };
    // internal C++ data accessor
    void SetWrapped(cppClass* n)  { internal_ = n; };
private:
    cppClassWrap();
    cppClassWrap(cppClass*);
    ~cppClassWrap() { if (internal_) delete internal_; };

    // JS stuff here

    static Persistent<Function> constructor;
    // JS c'tor
    static NAN_METHOD(New);
    // internal C++ data
    cppClass* internal_;
}; // !class cppClassWrap

//-------------------------------------------------
// JS c'tor implementation
NAN_METHOD(cppClassWrap::New)
{
    NanScope();
    cppClassWrap* obj;
    if (args.Length() == 0)
    {
        obj = new cppClass();
    }
    // **** NOTICE THIS! ****
    // This is a special case when in JS land we initialize our class like: new cppClassWrap(null)
    // It constructs the object with a pointer, pointing to nothing!
    else if (args[0]->IsNull())
    {
        obj = new cppClass(nullptr);
    }
    else
    {
        //copy constructor for the JS side
        obj = new cppClassWrap(ObjectWrap::Unwrap<cppClassWrap>(args[0]->ToObject())->GetWrapped());
    }
    obj->Wrap(args.This());
    NanReturnValue(args.This());
}

从现在开始,您需要做的就是例如在ModuleB 中拥有Persistent 句柄,以在其中存储ModuleA 的类c'tor 的构造函数的副本。例如,您可以有一个名为 dependencies 的方法并在 JS 中调用它:

var cppClassWrap = require("ModuleA.node").cppClassWrap;
var moduleB = require("ModuleB.node").dependencies({
    "moduleA" : function() {return new cppClassWrap(null); }
});

完成了!你有 C++ 级别的模块注入!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-15
    • 2015-08-07
    • 2022-05-05
    • 2021-10-08
    • 1970-01-01
    • 2014-04-05
    • 2017-07-23
    • 2021-10-04
    相关资源
    最近更新 更多