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()); }
从这一点开始,你所需要做的就是例如在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 ++级别的模块注入!
- npm install不会创buildnode_modules目录
- node.js中的module.parent有什么用? 我怎样才能参考require()ing模块?
- 将C ++虚拟方法绑定到具有覆盖function的js
- 如何在React Native中使用节点模块
- 如何使用Browserify和Gulp启动多页面应用程序
- 如何将expression式parameter passing给nodejsasynchronous调用
- Nodejs:如何解决Windows兼容性问题的一个模块?
- 如何从node_modules文件夹添加package.json依赖项?
- 在节点模块内共享“全局”variables是一种很好的方法吗?