用vs2013開發node.js的addon.

 

 

  1. 下載 node.js 的源代碼。

    https://github.com/joyent/node html

    若是用svn下載,後面加上/trunk,以避免把用不着的branches也下載下來,浪費時間。 node

  2. 安裝VS, express版本也能夠。我安裝的是vs2013 ultimate.
  3. 安裝 python 2.x

    http://www.python.org/download/ python

    注意不能是3.x, 由於node-gyp目前須要2.x. 我安裝的是2.7 c++

  4. 用命令行工具, Cd node 源代碼目錄,運行 vcbuild.bat

    成功後,會生成Release或者Debug目錄以及其餘文件。個人生成是Release目錄。咱們須要的是這個路徑下的node.lib 文件,以便在咱們的c++項目中引用。 git

  5. 打開 VS2013, 建立一個 c++ 空項目。個人項目起名爲 myaddon2.

  6. 添加一個 main.h main.cpp 文件。這兩個文件能夠分別放在 include src 文件夾中,以方便管理。

    main.cpp引用main.h文件。 github

    #include "main.h" express

    因爲main.h是放在include文件夾中,須要設置一下才能夠。 json

  7. 設置頭文件的引用路徑。 須要添加 node 源代碼路徑的 src, deps\v8\include, deps\uv\include.

  8. 添加 lib 所在路徑。咱們須要這個路徑下的 node.lib 文件。

  9. Linker 中填入 node.lib.

  10. 打開網頁:

    https://nodejs.org/api/addons.html#addons_wrapping_c_objects api

     

    複製代碼並更改,如下是具體文件的代碼: app

    Main.h 空。

    Main.cpp:

#include "main.h"

#include <node.h>

#include "myobject.h"

 

using namespace v8;

 

void InitAll(Handle<Object> exports) {

    MyObject::Init(exports);

}

 

NODE_MODULE(myaddon2, InitAll)

Myobject.h

#ifndef MYOBJECT_H

#define MYOBJECT_H

 

#include <node.h>

#include <node_object_wrap.h>

 

class MyObject : public node::ObjectWrap {

public:

    static void Init(v8::Handle<v8::Object> exports);

 

private:

    explicit MyObject(double value = 0);

    ~MyObject();

 

    static void New(const v8::FunctionCallbackInfo<v8::Value>& args);

    static void PlusOne(const v8::FunctionCallbackInfo<v8::Value>& args);

    static v8::Persistent<v8::Function> constructor;

    double value_;

};

 

#endif

 

Myobject.cpp

#include "myobject.h"

 

using namespace v8;

 

Persistent<Function> MyObject::constructor;

 

MyObject::MyObject(double value) : value_(value) {

}

 

MyObject::~MyObject() {

}

 

void MyObject::Init(Handle<Object> exports) {

    Isolate* isolate = Isolate::GetCurrent();

 

    // Prepare constructor template

    Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, New);

    tpl->SetClassName(String::NewFromUtf8(isolate, "MyObject"));

    tpl->InstanceTemplate()->SetInternalFieldCount(1);

 

    // Prototype

    NODE_SET_PROTOTYPE_METHOD(tpl, "plusOne", PlusOne);

 

    constructor.Reset(isolate, tpl->GetFunction());

    exports->Set(String::NewFromUtf8(isolate, "MyObject"),

        tpl->GetFunction());

}

 

void MyObject::New(const FunctionCallbackInfo<Value>& args) {

    Isolate* isolate = Isolate::GetCurrent();

    HandleScope scope(isolate);

 

    if (args.IsConstructCall()) {

        // Invoked as constructor: `new MyObject(...)`

        double value = args[0]->IsUndefined() ? 0 : args[0]->NumberValue();

        MyObject* obj = new MyObject(value);

        obj->Wrap(args.This());

        args.GetReturnValue().Set(args.This());

    }

    else {

        // Invoked as plain function `MyObject(...)`, turn into construct call.

        const int argc = 1;

        Local<Value> argv[argc] = { args[0] };

        Local<Function> cons = Local<Function>::New(isolate, constructor);

        args.GetReturnValue().Set(cons->NewInstance(argc, argv));

    }

}

 

void MyObject::PlusOne(const FunctionCallbackInfo<Value>& args) {

    Isolate* isolate = Isolate::GetCurrent();

    HandleScope scope(isolate);

 

    MyObject* obj = ObjectWrap::Unwrap<MyObject>(args.Holder());

    obj->value_ += 1;

 

    args.GetReturnValue().Set(Number::New(isolate, obj->value_));

}

 

 

  1. 調試。

    設置vsdebug命令和工做路徑。

    調試開始後,會自動啓動node命令行。

    能夠執行如下的命令查看效果。

    若是在 VS 中打上斷點,能夠進行跟蹤。

  2. 使用 addon.

    將生成的myaddon2.node文件拷貝到node.js項目文件夾或者子文件夾下。

    var myaddon2 = require("./addons/myaddon2")

    , nodeJsAddOncdObj;

     

     

    app.post('/api/increase/:num', function (req, res){

        if( !myobj ) myobj = new myaddon2.MyObject(req.params.num);

        res.format({

            //HTML returns us back to the main page, or you can create a success page

             html: function(){

                 //only return json.

             },

             //JSON returns the item with the message that is has been deleted

            json: function(){

                 res.json({

                     success:true,

                     result : myobj.plusOne()

                 });

             }

         });

     

    });

相關文章
相關標籤/搜索