本文节选自《Nodejs学习笔记》,更多章节和更新请访问github主页地址。欢迎进群交流,群号197339705。N-API简介Node.js8.0于2017年6月发布,升级功能包括N-API。很多写过或者用过node扩展的同学都遇到过升级node版本后node扩展编译失败的情况。由于node扩展严重依赖V8暴露的API,不同版本的node可能依赖不同的V8版本,一旦升级node版本,原本正常运行的node扩展会编译失败。这种情况对于节点生态来说无疑是不利的,而N-API的推出正是为了改善这种情况的一种尝试。它与底层JS引擎无关。只要N-API暴露的API足够稳定,节点扩展的编写者就不用太担心节点升级的问题。如何使用N-API首先强调一下,N-API并不是对原有节点扩展实现的替代,它只是提供了一系列底层无关的API,帮助开发者编写跨版本的节点扩展。至于如何编写、编译和使用扩展,则与原来的类似。本文将从一个超级简单的例子简单介绍一下N-API的使用,包括环境准备、编写扩展、编译、运行等几个步骤。备注:N-API目前还在实验阶段,官方文档提供的例子都是有问题的。如果在生产环境中使用,则应格外小心。一、环境准备首先,N-API在8.0版本中引入。首先,确保本地安装了8.0版本。笔者使用的是nvm,读者可以自行选择安装方式。nvmi8.0nvmuse8.0然后,安装node-gyp,它将用于编译扩展。npminstall-gnode-gyp创建项目目录并初始化package.json。mkdirhello&cdhello#目录名随意npminit-f2,写入扩展名,创建hello.cc作为扩展名的源文件。mkdirsrctouchsrc/hello.cc编辑hello.cc,输入以下内容。#include//实际暴露的方法,这里只是返回一个字符串napi_valueHelloMethod(napi_envenv,napi_callback_infoinfo){napi_valueworld;napi_create_string_utf8(env,“世界”,5,&world);回归世界;}//扩展初始化方法,其中//env:环境变量//exports,module:节点模块中对外暴露的对象voidInit(napi_envenv,napi_valueexports,napi_valuemodule,void*priv){//napi_property_descriptor是一个结构体Napi_property_descriptordesc={"hello",0,HelloMethod,0,0,0,napi_default,0};napi_define_properties(env,exports,1,&desc);//定义暴露方法}NAPI_MODULE(hello,Init);//注册扩展,扩展名为hello,Init为扩展的初始化方法3.编译扩展首先创建编译描述文件binding.gyp。{"targets":[{"target_name":"hello","sources":["./src/hello.cc"]}]}然后运行如下命令编译。节点gyp重建4。来电分机不方便来电分机,先安装绑定。npminstall--savebindings然后,创建app.js,调用你刚刚编译的扩展。varaddon=require('绑定')('你好');console.log(addon.hello());//在world中运行代码,由于N-API还在Experimental阶段,记得加上--napi-modules标记。node--napi-modulesapp.js输出如下{"path":"/data/github/abi-stable-node-addon-examples/1_hello_world/napi/build/Release/hello.node"}world(node:6500)警告:N-API是一项实验性功能,可能随时更改。相关链接N-API:https://nodejs.org/api/n-api....C++Addons:https://nodejs.org/api/addons...