web前端Nodejs学习之使用V8编写C++插件
小职 2021-04-30 来源 :编程杂技 阅读 1215 评论 0

摘要:本文主要介绍了web前端Nodejs学习之使用V8编写C++插件,通过具体的内容向大家展现,希望对大家web前端node.js开发的学习有所帮助。

本文主要介绍了web前端Nodejs学习之使用V8编写C++插件,通过具体的内容向大家展现,希望对大家web前端node.js开发的学习有所帮助。

web前端Nodejs学习之使用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的方式很多,插件是一种,直接修改内核也是一种,之前有介绍过如何修改内核,有兴趣的同学也可以看一下。


我是小职,记得找我

✅ 解锁高薪工作

✅ 免费获取基础课程·答疑解惑·职业测评

web前端Nodejs学习之使用V8编写C++插件

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程