文档章节

Node.js C++ addon编写实战(四)之兼容v0.11+与nan模块

冬瓜1
 冬瓜1
发布于 2013/12/31 21:23
字数 752
阅读 1928
收藏 3

前面三篇介绍文章:
Node.js C++ addon编写实战(一)之node-gyp
Node.js C++ addon编写实战(二)之对象转换 
Node.js C++ addon编写实战(三)之Buffer

node v0.11+ 的变化

Node.js 日趋成熟,即将要发布 v1.0 版本,但是在成长过程中,不得不有一些 API 的变化。在从 v0.10 向 v0.11/v0.12 升级的过程中,就导致了几处 C++ addon 编写上的变化。

Buffer

API changes between v0.10 and v0.12中我们发现:

All node::Buffer::New() variants now return Local<Object> instead of Buffer*.

我们不再需要通过 Buffer::New(str, 100)->handle_ 来获取能传递给 js 的 Buffer 对象了,New 出来的就已经是 v8 对象了。

V8 API

同时,在 node v0.11.4+ 的版本,v8 进行了一次大的升级,API 有一些大的调整,通过一个小例子来展示这一套新的 API 在使用上的变化:

//in node 0.10 Handle<Value> Add(const Arguments& args) {   HandleScope scope;   if (args.Length() < 2) {     ThrowException(Exception::TypeError(String::New("Wrong number of arguments")));     return scope.Close(Undefined());   }   if (!args[0]->IsNumber() || !args[1]->IsNumber()) {     ThrowException(Exception::TypeError(String::New("Wrong arguments")));     return scope.Close(Undefined());   }   Local<Number> num = Number::New(args[0]->NumberValue() +       args[1]->NumberValue());   return scope.Close(num); } //in node 0.11.4+   template<class T> void Add(const v8::FunctionCallbackInfo<T>& info) {   Isolate* isolate = Isolate::GetCurrent();   HandleScope scope(isolate);   if (info.Length() < 2) {     ThrowException(Exception::TypeError(         String::New("Wrong number of arguments")));     info.GetReturnValue().SetUndefined();     return;   }   if (!info[0]->IsNumber() || !info[1]->IsNumber()) {     ThrowException(Exception::TypeError(String::New("Wrong arguments")));     info.GetReturnValue().SetUndefined();     return;   }   Local<Number> num = Number::New(info[0]->NumberValue() +       info[1]->NumberValue());   info.GetReturnValue().Set(num); }

可以看到,变化主要在函数声明、 HandleScope 初始化以及如何返回数据这三点上。

其他 Bug

在 linux (Red Hat Enterprise Linux Server release 5.7 (Tikanga)) 和 node v0.11.8 下编译我的一个 C++ addon 的时候,出现了一个诡异的Bug,调用: v8::Value::ToInteger() 这个方法的时候会在链接的时候报错 undefined symbol, 最终没有找到原因,通过 V8::Value::IntegerValue() 替换了之前的实现,一切恢复正常。

node C++ addon 辅助编写模块 nan

上面废话了这么多来谈谈 node 升级导致的 C++ addon 兼容性问题,是不是很想写一个辅助模块来把这些变化全部封装起来? 别急,早就有大神做了这件事情:nan 是 rvagg(iconv 和 levelup 的作者) 发起维护的一个辅助模块,最近TooTallNate(node-gyp作者,node开发组成员)也加入开始维护这个模块。

A header file filled with macro and utility goodness for making add-on development for Node.js easier across versions 0.8, 0.10 and 0.11, and eventually 0.12.

通过 nan 来简化上面的示例代码:

//with nan #include "nan.h" NAN_METHOD(Add) {   NanScope();   if (args.Length() < 2) {     ThrowException(Exception::TypeError(String::New("Wrong number of arguments")));     NanReturnUndefined();   }   if (!args[0]->IsNumber() || !args[1]->IsNumber()) {     ThrowException(Exception::TypeError(String::New("Wrong arguments")));     NanReturnUndefined();   }   Local<Number> num = Number::New(args[0]->NumberValue() +       args[1]->NumberValue());   NanReturnValue(num); }

通过 nan,再也不用管兼容性问题,也不需要些那么一长串的函数声明了。当然,它不单单是解决了这个问题,上面提到的 Buffer API 的变更, nan 也有封装。更多的接口以及详细的使用方式,可以查阅它的文档


本文转载自:http://deadhorse.me/

冬瓜1
粉丝 11
博文 42
码字总数 16987
作品 0
东城
程序员
私信 提问
Nodejs如何调用Dll模块

苏格团队 作者:Tomey 一、为什么需要用node.js调用dll? 公司项目采用Electron( electronjs.org/ )开发pc应用,会涉及到与底层硬件设备的通信,而sdk封装 基本上都是通过 C++ 动态链接库d...

苏格团队
2018/09/17
0
0
简单上手nodejs调用c++(c++和js的混合编程)

因为项目的原因,最近经常使用node.js搭RESTful接口。 性能还是很不错啦,感觉比Spring Boot之类的要快。而且在不错的性能之外,只要程序结构组织好,别让太多的回调把程序结构搞乱,整体开发...

俺踏月色而来
2018/08/02
0
0
结合源码分析 Node.js 模块加载与运行原理

Node.js 的出现,让 JavaScript 脱离了浏览器的束缚,进入了广阔的服务端开发领域。而 Node.js 对 CommonJS 模块化规范的引入,则更是让 JavaScript成为了一门真正能够适应大型工程的语言。 ...

技术小能手
2018/08/17
0
0
Electron-如何保护源码?

一开始听到这个需求挺懵的,作为一个聊天软件,代码里并没有所谓核心算法和商业机密,为什么需要保护源码。况且Electron本身在打包时提供了这种archive文件格式,会将所有源码和依赖封装。 ...

Charles0427
02/18
0
0
用NAN写一个nodejs的c++扩展

NAN介绍 NAN的全称为Native Abstraction for Node.js, 其表现上是一个Node.js包。安装后,就得到一堆C++头文件,里面是一堆宏。它主要为Node.js和V8跨版本提供了封装的宏,使得开发者不用关心...

warjiang
01/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
5
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0
栈-链式(c/c++实现)

上次说“栈是在线性表演变而来的,线性表很自由,想往哪里插数据就往哪里插数据,想删哪数据就删哪数据...。但给线性表一些限制呢,就没那么自由了,把线性表的三边封起来就变成了栈,栈只能...

白客C
今天
43
0
Mybatis Plus service

/** * @author beth * @data 2019-10-20 23:34 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ServiceTest { @Autowired private IUserInfoService iUserInfoS......

一个yuanbeth
今天
5
0
php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己...

冻结not
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部