您现在的位置是:亿华云 > 系统运维

Nodejs系列之使用V8编写C++插件

亿华云2025-10-09 09:12:08【系统运维】1人已围观

简介虽然现在大部分情况都是使用n-api来编写插件,但是底层毕竟是v8(和libuv),使用v8编写简单的插件,同时熟悉v8的使用。本文介绍在写c++插件时,简单又常用的写法,其实本质上,写插件的难处在于

虽然现在大部分情况都是系列使用n-api来编写插件,但是编写底层毕竟是v8(和libuv),使用v8编写简单的系列插件,同时熟悉v8的编写使用。

本文介绍在写c++插件时,系列简单又常用的编写写法,站群服务器其实本质上,系列写插件的编写难处在于底层的能力和对libuv、v8的系列了解。话不多说,编写直接看代码。系列

#include <node.h> namespace demo {  using v8::FunctionCallbackInfo; using v8::Isolate; using v8::Local; using v8::Object; using v8::String; using v8::Value; using v8::FunctionTemplate; using v8::Function; using v8::Number; using v8::MaybeLocal; using v8::Context; using v8::Int32; static int seq; // 定义一个工具函数,编写生成seq void GenSeq(const FunctionCallbackInfo<Value>& args) {      Isolate* isolate = args.GetIsolate();     args.GetReturnValue().Set(Number::New(isolate,系列 ++seq)); } // 定义一个加法函数 void Add(const FunctionCallbackInfo<Value>& args) {      Isolate* isolate = args.GetIsolate();     int a = args[0].As<Int32>()->Value();     int b = args[1].As<Int32>()->Value();     args.GetReturnValue().Set(Number::New(isolate, a + b)); } void Initialize(   Local<Object> exports,   Local<Value> module,   Local<Context> context ) {    Isolate* isolate = context->GetIsolate();   // 新建一个函数模版   Local<FunctionTemplate> func = FunctionTemplate::New(isolate);   // 新建一个字符串表示函数名   Local<String> zaylee = String::NewFromUtf8(isolate, "zaylee", v8::NewStringType::kNormal).ToLocalChecked();   // 设置函数名   func->SetClassName(zaylee);   // 设置原型属性   func->PrototypeTemplate()->Set(isolate, "protoField", Number::New(isolate, 1));   // 设置对象属性   func->InstanceTemplate()->Set(isolate, "instanceField", Number::New(isolate, 2));   func->InstanceTemplate()->Set(isolate, "add", FunctionTemplate::New(isolate, Add));   // 设置函数对象本身的属性   func->Set(isolate, "funcField", Number::New(isolate, 3));   // 根据函数模版创建一个函数   Local<Function> ret = func->GetFunction(context).ToLocalChecked();   Local<String> Demo = String::NewFromUtf8(isolate, "Demo", v8::NewStringType::kNormal).ToLocalChecked();   // 导出函数   exports->Set(context, Demo, ret).Check();   // 导出工具函数   NODE_SET_METHOD(exports, "genSeq", GenSeq); } NODE_MODULE_CONTEXT_AWARE(NODE_GYP_MODULE_NAME, Initialize) }  // namespace demo 

写个测试例子

const {  Demo, genSeq } = require(./build/Release/test.node); const demo = new Demo(); console.log(demo对象:, demo, \n); console.log(原型属性:, demo.protoField, \n); console.log(执行add方法:, demo.add(1,2), \n);   console.log(执行seq方法:, genSeq(), genSeq(), \n); 

最后编写编译配置

{    "targets": [     {        "target_name": "test",       "sources": [ "./test.cc" ]     }   ]   } 

看起来非常简单,香港云服务器大概的编写流程如下

npm install -g node-gyp node-gyp configure node-gyp build node test.js 

拓展nodejs的方式很多,插件是系列一种,直接修改内核也是一种,之前有介绍过如何修改内核,有兴趣的同学也可以看一下。

免费信息发布网

很赞哦!(9)