前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >拥抱Node.js 8.0,N-API入门极简例子

拥抱Node.js 8.0,N-API入门极简例子

作者头像
IMWeb前端团队
发布2017-12-29 18:17:29
2.2K0
发布2017-12-29 18:17:29
举报
文章被收录于专栏:IMWeb前端团队IMWeb前端团队

N-API简介

Node.js 8.0 在2017年6月份发布,升级的特性中,包含了N-API。编写过或者使用过 node扩展的同学,不少都遇到过升级node版本,node扩展编译失败的情况。因为node扩展严重依赖于V8暴露的API,而node不同版本依赖的V8版本可能不同,一旦升级node版本,原先运行正常的node扩展就编译失败了。

这种情况对node生态圈无疑是不利的,N-API的引入正是试图改善这种情况的一种尝试。它跟底层JS引擎无关,只要N-API暴露的API足够稳定,那么node扩展的编写者就不用过分担忧node的升级问题。

如何使用N-API

先强调一点,N-API并不是对原有node扩展实现方式的替代,它只是提供了一系列底层无关的API,来帮助开发者编写跨版本的node扩展。至于如何编写、编译、使用扩展,跟原来的差不多。

本文会从一个超级简单的例子,简单介绍N-API的使用,包括环境准备、编写扩展、编译、运行几个步骤。

备注:当前N-API还处于试验阶段,官方文档提供的例子都是有问题的,如用于生产环境需格外谨慎。

1、环境准备

首先,N-API是8.0版本引入的,首先确保本地安装了8.0版本。笔者用的是nvm,读者可自行选择安装方式。

代码语言:javascript
复制
nvm i 8.0
nvm use 8.0

然后,安装node-gyp,编译扩展会用到。

代码语言:javascript
复制
npm install -g node-gyp

创建项目目录,并初始化package.json

代码语言:javascript
复制
mkdir hello & cd hello # 目录名随便起
npm init -f

2、编写扩展

创建hello.cc作为扩展的源文件。

代码语言:javascript
复制
mkdir src
touch src/hello.cc

编辑hello.cc,输入如下内容。

代码语言:javascript
复制
#include <node_api.h>

// 实际暴露的方法,这里只是简单返回一个字符串
napi_value HelloMethod (napi_env env, napi_callback_info info) {
    napi_value world;
    napi_create_string_utf8(env, "world", 5, &world);
    return world;
}

// 扩展的初始化方法,其中 
// env:环境变量
// exports、module:node模块中对外暴露的对象
void Init (napi_env env, napi_value exports, napi_value module, void* priv) {
    // napi_property_descriptor 为结构体,作用是描述扩展暴露的 属性/方法 的描述
    napi_property_descriptor desc = { "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

代码语言:javascript
复制
{
  "targets": [
    {
      "target_name": "hello",
      "sources": [ "./src/hello.cc" ]
    }
  ]
}

然后,运行如下命令进行编译。

代码语言:javascript
复制
node-gyp rebuild

4、调用扩展

未方便调用扩展,先安装bindings

代码语言:javascript
复制
npm install --save bindings

然后,创建app.js,调用刚编译的扩展。

代码语言:javascript
复制
var addon = require('bindings')('hello');

console.log( addon.hello() );  // world

运行代码,由于N-API当前尚处于Experimental阶段,记得加上--napi-modules标记。

代码语言:javascript
复制
node --napi-modules app.js

输出如下

代码语言:javascript
复制
{"path":"/data/github/abi-stable-node-addon-examples/1_hello_world/napi/build/Release/hello.node"}
world
(node:6500) Warning: N-API is an experimental feature and could change at any time.

相关链接

N-API:https://nodejs.org/api/n-api.html

C++ Addons:https://nodejs.org/api/addons.html

本文摘录自《Nodejs学习笔记》,更多章节及更新,请访问 github主页地址。欢迎加群交流,群号 197339705

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • N-API简介
    • 如何使用N-API
      • 1、环境准备
        • 2、编写扩展
          • 3、编译扩展
            • 4、调用扩展
              • 相关链接
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档