日期:2014-05-16  浏览次数:20363 次

一起读nodejs(四)----插件(addons)

    本文是对nodejs0.8.8版本的api开发手册解读.nodejs网址

    

    因本人没有c++编译环境,故下面代码没有做测试.


    插件(Addons) 

    插件是动态被连接到共享的对象.他们可以提供一种c和c++类库结合的能力.Api(目前)还是想当复杂,包括几个类库的知识:

  • V8 javascript 引擎,一个c++类库.用于和javascript连接接口:创建对象,调用方法,等等.在弄的源码目录树中的dpes/v8/include/v8.h文件中做了说明,也可以在线查看.
  • libuv,c的事件循环库.在任何时间,一个需要等待一个文件描述符变成可读的事件,等待一个定时器,或者等待一个信号来接受都需要使用libux.就是这样,如果你需要i/o操作,你就需要使用libux.
  • internal node libraries,node核心库,大部分很重要的库都是node::ObjectWrap的类,方便有调用.
  • others.可以在deps下查看其他可见的库.
    node总是静态的编译所有的依赖到可执行文件.当编译你的模块时,你不需要担心的连接到任何地方的libs.

    Hello World
    作为开始,让我们来制作一个小插件,下面的代码是和c++等价的js代码:
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> target) {
  target->Set(String::NewSymbol("hello"),
      FunctionTemplate::New(Method)->GetFunction());
}
NODE_MODULE(hello, init)
    注意,所有的模块插件必须导出一个初始化的方法:
void Initialize (Handle<Object> target);
NODE_MODULE(module_name, Initialize)
    因为NODE_MODULE不是一个函数,所以它后面没有分号.(参见hello.h).
    module_name必须要匹配除去node后缀的文件名.