详解Node.js API系列C/C++ Addons(1) API文档

Addons

扩展插件(Addons)是动态链接的共享对象,这些对象提供了使用C/C++类库的能力。由于涉及了多个类库导致了这类API目前比较繁杂,主要包括下述几个主要类库:

  • V8 JavaScript,C++类库,作为JavaScript的接口类,主要用于创建对象、调用方法等功能。大部分功能在头文件v8.h(在node文件夹下的路径为deps/v8/include/v8.h)中有详细文档。

  • libuv基于C的事件循环库,当需要等待的文件描述符可读时,等待定时器,或者等到接受信号时,会调用libuv的接口,也可以说,任何I/O操作,都需要调用libuv库

  • 内部Node的库,可以通过node::ObjectWrap来调用Node.js内部的库。其他的一些类库同样可以在deps/ 中找到。

Node已将所有依赖关系静态地编译成可执行文件,因此我们在编译自己的组件时不需要担心和这些类库的链接问题。

Hello world

让我们着手编写一个Addon的小例子,来达到如下模块同样的效果:

module.exports.hello = function() { return 'world'; };
首先,我们需要新建一个hello.cc文件

#include <node.h>
#include <v8.h>
using namespace v8;
Handle<Value> Method(const Arguments& args) {
  HandleScope scope;
  return scope.Close(String::New("world"));
}
void init(Handle<Object> exports) {
  exports->Set(String::NewSymbol("hello"),
      FunctionTemplate::New(Method)->GetFunction());
}
NODE_MODULE(hello, init)

请注意:所有的Node Addons 必须通过以下初始化代码导出

void Initialize (Handle<Object> exports);
NODE_MODULE(module_name, Initialize)

NODE_MODULE 结尾没有带上分号,因为它不是一个函数(详细可以看node.h)

module_name 是最终生成的二进制模块文件名称

代码将会被编译成hello.node,Addon的二进制文件,在这之前,需要创建一个叫binding.gyp的json格式文件来配置node-gyp进行编译。

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

执行node-gyp configure生成合适的当前平台的工程建设文件。不需要传统的Makefile或vcxproj。

执行node-gyp build编译项目,生成.node文件,编译生成的目录在 build/Release/

编译成功后,可以在node.js项目中进行调用,创建hello.js文件通过require函数调用刚编译完的hello.node模块。

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

原文:http://blog.whattoc.com/2013/09/07/nodejs_api_addon_1/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值