企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
在介绍C/C++内建模块时,其实已经介绍了C/C++模块的编写方式。普通的扩展模块与内建模块的区别在于无须将源码编译进Node,而是通过dlopen()方法动态加载。所以在编写普通的扩展模块时,无须将源代码写进node命名空间,也不需要提供头文件。下面我们将采用同一个例子来介绍C/C++扩展模块的编写。 它的JavaScript原型代码和前面例子的一样: ~~~ exports.sayHello = function(){ return 'Hello World!'; }; ~~~ 新建hello目录作为自己的项目位置,编写hello.cc并将其存储到src目录下,相关代码如下: ~~~ #include <node.h> #include <v8.h> using namespace v8; // 实现预定义的方法 Handle<Value> SayHello(const Arguments& args) { HandleScope scope; return scope.Close(String::New("Hello World!")); } //给传入的目标对象添加sayHello()方法 void Init_Hello(Handle<Object> target){ target->Set(String::NewSymbol("sayHello"),FunctionTemplate::New(sayHello)->GetFunction()); } //调用NODE_MODULE()方法将注册方法定义到内存中 NODE_MODULE(hello, Init_Hello) ~~~ C/C++扩展模块与内建模块的套路一样,将方法挂载在target对象上,然后通过NODE_MODULE声明即可。 由于不像编写内建模块那样将对象声明到`node_module_list`链表中,所以无法被认作是一个原生模块,只能通过dlopen()方法来动态加载,然后导出给JavaScript调用。