您现在的位置是:亿华云 > 系统运维
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)
下一篇: ④注册门槛低
相关文章
- 网站页面结构改版,仅是页面样式发生变化,不会对排名、收录有影响;只有涉及到页面URL改变,才会对网站排名、收录有影响。
- 每天一个Python知识点:只用一招就将所有的英文单词首字母变成大写
- Java基础入门之Object类、匿名内部类、构造方法的继承解析
- 视频与网络篇:5G 700MHz大小塔模式和无线上行增强技术
- 域名资源有限,好域名更是有限,但机会随时都有,这取决于我们能否抓住机会。一般观点认为,国内域名注册太深,建议优先考虑外国注册人。外国注册人相对诚实,但价格差别很大,从几美元到几十美元不等。域名投资者应抓住机遇,尽早注册国外域名。
- 韩信大招:一致性哈希
- IntelliJ IDEA 20 岁了!20 年前的第 1 个版本曝光…
- Python 代码一致性的重要性
- 为什么大家都选优质域名?到底存在着什么好处?
- 鸿蒙HarmonyOS三方件开发指南(7)-compress组件