当前位置: 首页 > 编程日记 > 正文

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

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

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,读者可自行选择安装方式。

nvm i 8.0
nvm use 8.0

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

npm install -g node-gyp

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

mkdir hello & cd hello # 目录名随便起
npm init -f

2、编写扩展

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

mkdir src
touch src/hello.cc

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

#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

{"targets": [{"target_name": "hello","sources": [ "./src/hello.cc" ]}]
}

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

node-gyp rebuild

4、调用扩展

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

npm install --save bindings

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

var addon = require('bindings')('hello');console.log( addon.hello() );  // world

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

node --napi-modules app.js

输出如下

{"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

相关文章:

什么是标记符控制的分水岭算法

本文首先指出传统分水岭算法的不足&#xff0c;然后介绍了标记符控制的分水岭算法&#xff0c;最后通过实例演示了该算法在图像分割中的应用。该微信图文由安晟提供。

.NE 后退刷新验证码

Response.Buffer true; Response.Expires -1; Response.ExpiresAbsolute DateTime.Now.AddDays(-1); Response.Expires0; Response.CacheControl "no-cache"; 转载于:https://www.cnblogs.com/lmjob/archive/2008/09/01/128096…

intellij打开工程在每个java文件上有个红色的无效符的解决办法

说明该类不是可编译文件。在project Structure中&#xff08;快捷键ctrlaltshifts&#xff09;选Modules将你带红圈的文件添加上&#xff0c;将你带红圈的文件夹设为Sources。一般是src文件夹&#xff0c;点Sources文件夹&#xff0c;然后点击OK。设置为可编译文件再去工程中看…

[zt] petshop4.0 详解之三

三、PetShop数据访问层之消息处理在进行系统设计时&#xff0c;除了对安全、事务等问题给与足够的重视外&#xff0c;性能也是一个不可避免的问题所在&#xff0c;尤其是一个B/S结构的软件系统&#xff0c;必须充分地考虑访问量、数据流量、服务器负荷的问题。解决性能的瓶颈&a…

windows下Bullet 2.82编译安装(Bullet Physics开发环境配置)

平台&#xff1a;Win7&#xff0c;VS2010 1. Bullet库的组织 下图是Bullet_User_Manual中的截图&#xff1a; 从中可见&#xff0c;Bullet的LinearMath&#xff08;线性数学模块&#xff09;&#xff0c;其上是BulletCollision&#xff08;碰撞检测模块&#xff09;&#xff0c…

Matlab与线性代数 -- 寻找矩阵的非零元素

本微信图文详细介绍了Matlab中find函数的用法。

java重新回顾

很不幸&#xff0c;自己的移动硬盘坏掉了&#xff0c;之前自己所做的学习笔记都没了&#xff0c;大概有300多篇&#xff0c;是大学学习java的时候整理复习的&#xff0c;这样的损失是巨大的&#xff0c;这将花费我更多的时间重新去整理&#xff0c;但是事实已经是这样的了。 基…

BestCoder 1st Anniversary ($) 1002.Hidden String

Hidden String Accepts: 437 Submissions: 2174 Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 262144/262144 K (Java/Others)问题描写叙述今天是BestCoder一周年纪念日. 比赛管理员Soda有一个长度为n的字符串s. 他想要知道是否能找到s的三个互不相交的子串s[l1..r1],…

动态生成GridView时,加入DataKeyNames属性,回调时出错解决方法

早上看到有位同学问关于自动生成GridVie并且添加DataKeyNames属性后 回调页面时&#xff0c;出现错误异常.下面是我实现的方法。注意一点。就是数据绑定的时间。 要是先绑定&#xff0c;再添加到div1中&#xff0c;回调页面时&#xff0c;就会出错。 页面代码&#xff1a; <…

如何制作风格迁移图?

本微信图文介绍了实现风格迁移图的基本原理并在此基础上制作了效果展示图。

leetcode--链表的设计--python

leetcode--链表的设计--python题目题目详情示例提示解题代码代码运行结果体会题目 设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性&#xff1a;val 和 next。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。如果要使用双向…

从空间数据库中删除所有拓扑对象

/// <summary> /// //从空间数据库中删除所有拓扑对象 /// </summary> /// <returns></returns> public bool DeleteALLTopolgyFromGISDB() { bool rbc true; try { …

Altium Desgner软件,PCB设计中铺铜的作用

PS原文出自http://mp.weixin.qq.com/s/5mLNXzCDm1hGOXiKNE8Ddg 问1:为何要铺铜&#xff1f; 答&#xff1a;一般铺铜有几个方面原因。 &#xff11;、EMC.对于大面积的地或电源铺铜&#xff0c;会起到屏蔽作用&#xff0c;有些特殊地&#xff0c;如PGND起到防护作用。&#xff…

如何利用自组织竞争网络进行患者癌症发病预测

如何利用自组织竞争网络进行患者癌症发病预测 数据下载&#xff1a; http://download.csdn.net/detail/lsgo_myp/9711473

leetcode--反转链表--python

文章目录题目题目详情示例提示解题代码代码运行结果体会题目 题目详情 反转一个单链表。 示例 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL提示 你可以迭代或递归地反转链表。你能否用两种方法解决这道题&#xff1f; 解题代码 …

非递归一次性加载分类数据到TreeViw

不是经常用,发现再次用到时又要再写一遍,这次花点时间记录一下 代码:------------------------------------- private void InitView() { DataView dv CommodityClassBLL.Query().Tables[0].DefaultView; if (dv.Count > 1) { dv.Sort …

什么是SESSION?(二)

本篇图文讨论了SESSION多服务器共享问题以及SESSION操作的效率问题。本篇微信图文由钟锦提供。

leetcode--两数之和--python

文章目录题目题目详情示例解题代码代码运行结果体会题目 题目详情 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;你不能重复…

关于 OpenIdConnect 认证启用 HTTPS 回调 RedirectUri 不生效问题

在搭建 IdentityServer 服务端后&#xff0c;我们尝试使用了 OIDC(OpenID Connect) 的中间件来代替了原先的 Session 系统认证方式&#xff0c;起初采用的是 HTTP 协议&#xff0c;一切都没有什么问题&#xff0c;最近启用全站 HTTPS 后&#xff0c;发现登陆会跳转到 HTTP的页面…

C#中使用GUID

GUID&#xff08;全局统一标识符&#xff09;是指在一台机器上生成的数字&#xff0c;它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成GUID的API。生成算法很有意思&#xff0c;用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。GUID的唯一缺陷在于生…

Matlab与线性代数 -- 对角矩阵

本微信图文详细介绍了Matlab中diag()函数的应用。

leetcode--对称二叉树--python

文章目录题目题目详情示例说明解题代码代码运行结果体会题目 题目详情 给定一个二叉树&#xff0c;检查它是否是镜像对称的。 示例 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。 1/ \2 2/ \ / \ 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1…

IPV6的设置问题!

最近一段在研究IPV6&#xff0c;在网上搜了好多资料&#xff0c;但是感觉大部分都不实在&#xff0c;都是泛泛而谈&#xff0c;实用性不强&#xff0c;故决定做点什么&#xff01;正所谓该出手时就出手&#xff0c;风风火火闯九州哦~~ IPV6设置步骤&#xff1a; 1.首先查看你时…

Matlab与线性代数 -- 数组与矩阵的乘幂

本微信图文详细介绍了数组的乘幂运算power()与矩阵的乘幂运算mpower()。

Docker 公司是如何做社区的?

今天看了一个Docker公司是如何做社区的PPT&#xff0c;演讲者是Docker公司的市场部老大。Docker从发布之初就受到了开发者的关注&#xff0c;1.0版本发布的时候Docker就收到了超过460位贡献者的8741条改进建议&#xff0c;Docker也承认是社区帮助他们迅速达到了这一新的里程碑。…

leetcode--整数反转--python

文章目录题目题目详情示例注意解题代码小知识代码运行结果体会题目 题目详情 给出一个 32 位的有符号整数&#xff0c;你需要将这个整数中每位上的数字进行反转。 示例 输入: 123 输出: 321输入: -123 输出: -321输入: 120 输出: 21注意 假设我们的环境只能存储得下 32 位…

水晶报表调用存储过程的问题

前言&#xff1a;现在碰到了水晶报表调用存储过程的问题&#xff0c;问题是这样的&#xff1a;ERP软件里有很多的数据表&#xff0c;有些报表的字段要从多个数据表里取数据&#xff0c;并且要对数据进行处理&#xff0c;来作为报表的字段&#xff0c;我看了些资料&#xff0c;说…

iOS-ARC_Xcode检测循环引用

iOS-ARC_Xcode检测循环引用 一&#xff0c;在桌面上新建立一个工程&#xff0c;在ViewController.m中输入如下代码&#xff1a; - (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.NSMutableArray *firstArr…

什么是SESSION?(三)

本微信图文通过一个利用数据库的方式存储Session的例子&#xff0c;深入介绍了对Session机制的理解。本微信图文由钟锦提供。

leetcode--回文数--python

文章目录题目题目详情示例解题代码代码运行结果体会题目 题目详情 判断一个整数是否是回文数。回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 示例 输入: 121 输出: true输入: -121 输出: false 解释: 从左向右…