当前位置: 首页 > 后端技术 > Node.js

使用NAN写一个nodejs的c++扩展

时间:2023-04-03 21:21:06 Node.js

NAN简介NAN的全称是NativeAbstractionforNode.js,是对Node.js性能的封装。安装后,你会得到一堆C++头文件,里面有一堆宏。主要为Node.js和V8的跨版本提供封装的宏,让开发者无需关心版本间的API差异。(来自《nodejs来一打C++扩展》)NAN的优点是可以屏蔽不同版本Node的API,使得C++扩展一次编写,随处编译,一个C++扩展可以适用于不同版本的Node.js。这里c++扩展实现的功能是求和扩展(helloworld太多了,另写一个)。扩展地址为:https://www.npmjs.com/package...,项目代码地址:https://github.com/warjiang/d...使用方法如下:项目目录如下:在开发之前,我们首先需要安装nan包(npminstallnan-S)。扩展开发分为两个级别,c++级别和JS级别。src目录主要是c++代码,也是扩展的实现部分。index.js引用了C++扩展,暴露了上层使用的方法。初次开发nodejs扩展的用户需要注意项目目录下的binding.gyp文件(node-gyp会读取项目中的binding.gyp):target_name为sum,表示最后生成的扩展文件被命名为sum.node。include_dirs的意思是除了nodejs的基本依赖,我们还需要nan的头文件,#include#includeusingv8::Local;usingv8::对象;使用v8::Number;NAN_METHOD(sum){Nan::HandleScope范围;uint32_t总和=0;for(inti=0;iNumberValue();}info.GetReturnValue().Set(Nan::New(sum));}voidinit(Localexports){Nan::HandleScope作用域;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函数的输入参数是一个信息数组。这里我们遍历info数组,通过info[i]->NumberValue方法获取每个入参对应的number类型的值。出来加总。累加完成后,通过info.GetReturnValue().Set(Nan::New(sum))返回累加结果。这样,我们的c++部分扩展就已经开发好了。可以通过执行node-gypconfigure&&node-gypbuild编译项目,在build/Release目录下会生成sum.node文件。我们可以启动一个节点命令行来验证://nodecli>letaddon=require('./build/Release/sum')>addon.sum(1)//1>addon.sum(1,2)//3引用build/Release/sum的方法在实际开发中很不方便。我们可以用js封装这行代码,引用js内部的build/Release/sum,将方法暴露出来供外部调用。js部分的开发有上面的铺垫,我们在这里开发js部分是很自然的事情。直接添加代码constaddon=require('./build/Release/sum')module.exports=addon.sum,一共两行代码,逻辑清晰简单,编译扩展用于暴露求和法。在发布nodejs扩展时,需要在package.json的scripts部分添加一个installhook,如下:当用户安装扩展时,会帮助用户在installhook上执行node-gyprebuild,生成对应的用户机器上的响应。扩展文件。这样我们的开发就完成了,执行npmpublish发布npm包