本文介绍c++插件,简单来讲c++插件就是在c层直接调用v8,可以内置一些js api,通过学习nodejs c++插件,忽然灵光一闪,v8中有一个拦截器,虽然没有用过,但是通过这个拦截器应该可以做js的代理吧,今天先来总结nodejs c++插件,后续会继续研究js的代理。
如果你发现下面我讲的东西你不好理解,你可以查看这个目录下的另一篇文章(https://yuque.antfin.com/xiaobao.spf/ad2gcp/sm0sxn),仔细研读,然后再回来查看这边文章,你会发现nodejs c++插件竟然如此简单。
流程:js - c++插件 - node - v8
官方示例 demo:https://github.com/nodejs/node/tree/v14.17.5/test/addons
更多示例 demo:http://gitlab.alibaba-inc.com/amap_mini/js-v8-demo
参考:
https://nodejs.org/dist/latest-v14.x/docs/api/addons.html
https://github.com/nodejs/node/blob/master/src/node.h
工具
node-gyp
1
npm install -g node-gyp
node https://nodejs.org/zh-cn/
代码
hello.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
namespace demo {
using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;
void Method(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate(); //获取isolate,
args.GetReturnValue().Set(String::NewFromUtf8(
isolate, "i am xiaobao").ToLocalChecked()); //返回值
}
void Initialize(Local<Object> exports) {
NODE_SET_METHOD(exports, "hello", Method);//导出hello方法,
}
NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize) //导出初始化
}binding.gyp
1
2
3
4
5
6
7
8{
"targets": [
{
"target_name": "hello",
"sources": [ "hello.cc" ]
}
]
}hello.js
1
2
3const hello = require('./build/Release/hello');
console.log(hello.hello());编译
1
2
3
4生成Makefile
node-gyp configure
生成 hello.node
node-gyp build运行
1
node hello.js
解析
hello.cc
1 | // 导出hello方法 |
或者可以使用 宏NODE_MODULE_INIT 初始化导出
1 | NODE_MODULE_INIT(/* exports, module, context */) { |
更多示例
http://gitlab.alibaba-inc.com/amap_mini/js-v8-demo
1 | const hello = require('./build/Release/hello'); |