NAN的全称为Native Abstraction for Node.js, 其表现上是一个Node.js包。安装后,就获得一堆C++头文件,里面是一堆宏。它主要为Node.js和V8跨版本提供了封装的宏,使得开发者不用关心各个版本之间的API的差别。(from 《nodejs来一打C++扩展》)node
NAN的优点在于能够屏蔽不一样版本Node的API,使得C++扩展能够wirte once, compile anywhere
,一份C++扩展能够适用于不一样版本的Node.js。这里的c++扩展实现的功能是一个求和的扩展(hello world太多了,写个不同的)c++
扩展地址为:www.npmjs.com/package/sum…git
项目代码地址:github.com/warjiang/de…github
使用方式以下: npm
npm install nan -S
)。扩展开发分红两个层面,c++层面和JS层面。src目录中主要是c++代码,也是扩展的实现部分。index.js引用c++扩展,暴露出方法供上层使用。 初次开发nodejs扩展的用户须要注意下项目目录中的binding.gyp文件(node-gyp会读取项目中的binding.gyp):
sum.node
。include_dirs表示除了nodejs基础的依赖以外,咱们还须要nan的头文件,
<!(node -e \"require('nan')\")
中
<!
表示后面是命令,
node -e "require('nan')"
就是利用nodejs的require能力,寻找nan的目录,执行效果以下:
先直接上代码(src/init.cc):json
#include <v8.h>
#include <node.h>
#include <nan.h>
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<Object> 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
,暴露出来方法给外部进行调用。bash
有了上面的铺垫,这里咱们开发js部分就显得十分天然。直接上代码函数
const addon = require('./build/Release/sum')
module.exports = addon.sum
复制代码
一共就两行代码,逻辑清晰简单,就引用编译好的扩展,将sum方法暴露出去。ui
nodejs扩展发布的时候须要在package.json的scripts部分增长install钩子的处理,以下:
node-gyp rebuild
来在用户的机器上生成对应的扩展文件。这样咱们的开发就完毕了,执行
npm publish
将npm包发布出去