长话短说,N-API在node8.0以后开始加入支持,目的在于解决node跨版本之间原生模块的兼容问题,Nan原生模块无法兼容不同版本的Node,需要重新编译(看脸和google的心情)。N-API做了一层抽象,实现了跨版本支持。
需要注意一点,10.0之前,N-API是试验模式,使用该模块的时候会在stderr也可能是stdout输出一段警告,程序不依赖控制外可以无视此警告。10.0以后默认支持,警告不再复现
准备工作:
node环境:node 10.X
node开发环境:https://github.com/nodejs/node
需要安装的模块:npm/node-gyp
本人开发环境:debian 9/Linux kernel 4.9/gcc 6.3.0
最简易的开发方式,进入源码目录下的~/node-master/test/addon-napi/1_hello_world/
直接编译:#node-gyp configure &&node-gyp build
结果呢,当然是一堆错误,参照第二个例子修改这个hello world即可
ANSI C的库可以直接使用,三方库需要在binding.gpy里配置,相当于-l -L这些参数去搞gpy文件即可,google搜node-gpy使用
下边简单介绍一下API调用
NAPI_CALL(env, napi_throw_error(env,"timeout 001","time out"));
通过NAPI_CALL宏来调用N-API,N-API帮助去官网看,各种函数,上边这个例子是调用了一个抛出异常的API。
napi_value val1;
通过napi_value声明一个nodejs变量。
变量的初始化通过NAPI_CALL来调用对应的API来实现,可以创建
- napi_create_array
- napi_create_array_with_length
- napi_create_arraybuffer
- napi_create_buffer
- napi_create_buffer_copy
- napi_create_external
- napi_create_external_arraybuffer
- napi_create_external_buffer
- napi_create_function
- napi_create_object
- napi_create_symbol
- napi_create_typedarray
- napi_create_dataview
- napi_create_uint32
- napi_create_int64
- napi_create_double
- napi_create_string_latin1
- napi_create_string_utf16
- napi_create_string_utf8
这么多类型的js变量。
NAPI_CALL(env, napi_create_string_utf8(env, str, str_len, &val1));
这里创建了一个val1的js字符串,还是utf8版本的
如果你的缓存区是个字节流,NAPI能自动给你转UTF-8,大写的赞。
没了,就这么多,不会的看例子。
有心情继续写。
我刚发布的npm模块叫xd-synchttp
执行的功能是同步获取http请求结果。解决http模块全异步的局限性。有些场景必须使用同步。模块内加了超时设定,超时了就会抛出异常。欢迎使用
const sync = require('xd-synchttp');
let content = "";
try{
content = sync.http_get('http://www.csdn.net',0);
//0为不超时
}
catch(err)
{
console.log(err);
}