博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用NAN写一个nodejs的c++扩展
阅读量:7069 次
发布时间:2019-06-28

本文共 2172 字,大约阅读时间需要 7 分钟。

NAN介绍

NAN的全称为Native Abstraction for Node.js, 其表现上是一个Node.js包。安装后,就得到一堆C++头文件,里面是一堆宏。它主要为Node.js和V8跨版本提供了封装的宏,使得开发者不用关心各个版本之间的API的差异。(from 《nodejs来一打C++扩展》)

NAN的优势在于可以屏蔽不同版本Node的API,使得C++扩展可以wirte once, compile anywhere,一份C++扩展可以适用于不同版本的Node.js。这里的c++扩展实现的功能是一个求和的扩展(hello world太多了,写个不一样的)

扩展地址为:

项目代码地址:

使用方式如下:

项目目录如下:

在开发之前我们首先需要安装nan包(
npm install nan -S)。扩展开发分成两个层面,c++层面和JS层面。src目录中主要是c++代码,也是扩展的实现部分。index.js引用c++扩展,暴露出方法供上层使用。 初次开发nodejs扩展的用户需要注意下项目目录中的binding.gyp文件(node-gyp会读取项目中的binding.gyp):
target_name为sum,表示最后生成的扩展文件名为
sum.node。include_dirs表示除了nodejs基础的依赖之外,我们还需要nan的头文件,
<!(node -e \"require('nan')\")
<!表示后面是命令,
node -e "require('nan')"就是利用nodejs的require能力,寻找nan的目录,执行效果如下:
sources项指明了c++扩展需要编译的源文件。

c++部分开发

先直接上代码(src/init.cc):

#include 
#include
#include
using v8::Local;using v8::Object;using v8::Number;NAN_METHOD(sum){ Nan::HandleScope scope; uint32_t sum = 0; for(int i = 0; i< info.Length(); i++){ sum += info[i]->NumberValue(); } info.GetReturnValue().Set(Nan::New(sum));}void init (Local
exports){ Nan::HandleScope scope; Nan::SetMethod(exports, "sum", sum);}NODE_MODULE(memwatch, init);复制代码

扩展的入口从NODE_MODULE(memwatch, init);开始,当js层面执行了require('path/to/xxx.node')的时候,就会执行init函数。 init函数的入参可以类比module.exports对象,这里我们给exports对象增加了一个名为sum的方法,其对应的实现为NAN_METHOD(sum)部分。 NAN_METHOD(sum)通过宏定义对sum函数进行包装,sum函数的入参为info数组,我们再这里遍历info数组,通过info[i]->NumberValue方法将每个入参对应的number类型的值取出来,加到sum中去。累加完成后通过info.GetReturnValue().Set(Nan::New(sum))将sum结果返回出去。这样其实我们的c++部分扩展就已经开发完毕了,可以通过执行node-gyp configure && node-gyp build编译项目,在build/Release目录下会生成sum.node的文件。我们可以启动一个node的命令行进行验证:

// node cli> let addon = require('./build/Release/sum')> addon.sum(1) // 1> addon.sum(1,2) // 3复制代码

引用build/Release/sum的方式实际开发中十分不方便,我们可以用js对这行代码进行封装,在js内部引用build/Release/sum,暴露出来方法给外部进行调用。

js部分开发

有了上面的铺垫,这里我们开发js部分就显得十分自然。直接上代码

const addon = require('./build/Release/sum')module.exports = addon.sum复制代码

一共就两行代码,逻辑清晰简单,就引用编译好的扩展,将sum方法暴露出去。

发布

nodejs扩展发布的时候需要在package.json的scripts部分增加install钩子的处理,如下:

用户安装扩展的时候,会在install的钩子上,帮助用户执行
node-gyp rebuild来在用户的机器上生成对应的扩展文件。这样我们的开发就完毕了,执行
npm publish将npm包发布出去

转载地址:http://sehll.baihongyu.com/

你可能感兴趣的文章
堆排序Java实现(递归方式&非递归方式)
查看>>
GRU网络生成莎士比亚小说
查看>>
一次读锁重入导致的死锁故障
查看>>
如何使用Kubernetes里的NetworkPolicy
查看>>
图像风格转移
查看>>
ReactNative集成百度语音合成
查看>>
记一次企业级存储规划及重大事故
查看>>
微信小程序Markdown渲染组件wemark
查看>>
Dubbo分析之Serialize层
查看>>
飞雪无情的博客Go语言、Android相关的十大热门文章
查看>>
程序员练级攻略(2018):前端性能优化和框架
查看>>
免费申请通配符证书
查看>>
如何快速搭建一个react+webpack环境
查看>>
IO模型浅析-阻塞、非阻塞、IO复用、信号驱动、异步IO、同步IO
查看>>
如何将Excel文件解析为json格式
查看>>
剥开比原看代码16:比原是如何通过/list-transactions显示交易信息的?
查看>>
单行文字向上滚动
查看>>
vue进阶2-构建基础框架
查看>>
TiDB 源码阅读系列文章(十五)Sort Merge Join
查看>>
打造RecyclerView的n级列表
查看>>