C ++级别的nodeJS模块加载

我正在开发一个NodeJS模块,其文件大小正在急剧增加,但是我意识到我可以将模块分成两个独立的模块。 发生这种情况时,我的第二个模块中只有几个函数需要使用我的第一个模块的内部C ++类。 有没有可能只是通过第一个模块的原型到第二个?

例:

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

 class cModuleA { //declarations data* pointer; } 

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

我试图从第一个模块(窗口中的dllimport/dllexport )导出符号,但我只是想知道是否有更好的select注入在C ++级别的依赖关系。

我find了一个解决这个问题的方法,我会详细的去看看,因为可能没有其他人试图做这样一个疯狂的事情!

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

ModuleA

 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()); } 

从这一点开始,你所需要做的就是例如在ModuleBPersistent句柄来存储ModuleA的类c'tor的构造函数的副本。 例如,你可以有一个叫做dependencies的方法,并用JS调用它:

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

并做了! 你有C ++级别的模块注入!