node-gyp使用指南

1.使用方法

1.1 hello world

#include <node.h>

namespace demo {
    using v8::FunctionCallbackInfo;
    using v8::Isolate;
    using v8::Local;
    using v8::Object;
    using v8::String;
    using v8::Value;

    void Method(const FunctionCallbackInfo<Value>& args) {
        Isolate* isolate = args.GetIsolate();
        args.GetReturnValue().Set(String::NewFromUtf8(isolate, "world"));
    }

    //初始化函數(shù)
    void init(Local<Object> exports) {
        //導(dǎo)出Method方法,重命名為hello
        NODE_SET_METHOD(exports,"hello",Method);
    }

    //模塊名為addon
    NODE_MODULE(addon, init)
}

要把一個(gè)函數(shù)作為接口導(dǎo)出,需要:
1.為函數(shù)傳入FunctionCallbackInfo<Value>類型的參數(shù)列表夺巩,這個(gè)參數(shù)列表是一個(gè)指針數(shù)組勘高,可以通過(guò)args[index]來(lái)訪問(wèn)每一個(gè)傳入?yún)?shù)菱涤,通過(guò)args[index]->ToString來(lái)調(diào)用參數(shù)對(duì)應(yīng)的方法
2.在函數(shù)中創(chuàng)建一個(gè)js的數(shù)據(jù)類型都要通過(guò)

Isolate* isolate = args.GetIsolate()

這個(gè)隔離對(duì)象指針來(lái)創(chuàng)建,例如:

//創(chuàng)建基本數(shù)據(jù)類型并賦給一個(gè)本地變量
String::NewFromUtf8(isolate,"msg");
Local<Number> num=Number::New(isolate,value);
//創(chuàng)建一個(gè)object
Local<Object> obj=Object::New(isolate);
//讀取一個(gè)回調(diào)函數(shù)
Local<Function> cb = Local<Function>::Cast(args[0]);

3.為函數(shù)創(chuàng)建返回值级野,函數(shù)的返回值必須時(shí)v8的變量類型

args.GetReturnValue().Set(String::NewFromUtf8(isolate, "world"));

4.需要?jiǎng)?chuàng)建一個(gè)初始化函數(shù),函數(shù)的第一個(gè)參數(shù)為module.exports粹胯,第二個(gè)參數(shù)為module蓖柔,可以選擇是同NODE_SET_METHOD宏來(lái)為module.exports添加導(dǎo)出的屬性,也可以在module對(duì)象上完全重寫exports屬性

NODE_SET_METHOD(exports,"hello",Method);

5.最后风纠,使用NODE_MODULE宏指定模塊名和初始化函數(shù)况鸣,即可導(dǎo)出一個(gè)函數(shù)在js中調(diào)用

1.2 函數(shù)的參數(shù)

讀取傳入?yún)?shù)和返回結(jié)果需要在js數(shù)據(jù)類型和C++數(shù)據(jù)類型之間做轉(zhuǎn)換,讀取并轉(zhuǎn)化為C++數(shù)據(jù)類型竹观,即可通過(guò)C++進(jìn)行計(jì)算

ars[0]->NumberValue();   //轉(zhuǎn)化為number
args[1]->ToString();   //轉(zhuǎn)化為string

1.3 導(dǎo)出對(duì)象

#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <node.h>
#include <node_object_wrap.h>

namespace demo 
{

    class MyObject: public node::ObjectWrap
    {
    public:
        static void Init(v8::Local<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_;
    };

}//namespace demo

#endif
#include "myobject.h"

namespace demo {

    using namespace v8;

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

    //初始化函數(shù)
    void MyObject::Init(v8::Local<v8::Object> exports)
    {
        Isolate* isolate = exports->GetIsolate();

        //創(chuàng)建構(gòu)造函數(shù)
        Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, New);
        tpl->SetClassName(String::NewFromUtf8(isolate, "MyObject"));
        tpl->InstanceTemplate()->SetInternalFieldCount(1);

        //在原型上添加方法
        NODE_SET_PROTOTYPE_METHOD(tpl, "plusOne", PlusOne);

        //設(shè)置構(gòu)造函數(shù)
        constructor.Reset(isolate, tpl->GetFunction());
        exports->Set(String::NewFromUtf8(isolate, "MyObject"), tpl->GetFunction());
    }

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

    MyObject::~MyObject()
    {
    }

    //v8構(gòu)造函數(shù)
    void MyObject::New(const v8::FunctionCallbackInfo<v8::Value>& args)
    {
        Isolate* isolate = args.GetIsolate();
        
        //構(gòu)造函數(shù)調(diào)用
        if (args.IsConstructCall())
        {
            double value = args[0]->IsUndefined() ? 0 : args[0]->NumberValue();
            MyObject* obj = new MyObject(value);

            //this指向這個(gè)對(duì)象
            obj->Wrap(args.This());
            args.GetReturnValue().Set(args.This());
        }
        else {
            //否則調(diào)用v8構(gòu)造函數(shù)镐捧,讀取參數(shù)放入?yún)?shù)列表
            const int argc = 1;
            Local<Value> argv[argc] = { args[0] };
            Local<Context> context = isolate->GetCurrentContext();
            Local<Function> cons = Local<Function>::New(isolate, constructor);
            Local<Object> result = cons->NewInstance(context, argc, argv).ToLocalChecked();
            args.GetReturnValue().Set(result);
        }
    }

    //將成員變量加一
    void MyObject::PlusOne(const v8::FunctionCallbackInfo<v8::Value>& args)
    {
        Isolate* isolate = args.GetIsolate();

        MyObject* obj = ObjectWrap::Unwrap<MyObject>(args.Holder());
        obj->value_ += 1;

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

}//namespace demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市臭增,隨后出現(xiàn)的幾起案子懂酱,更是在濱河造成了極大的恐慌,老刑警劉巖誊抛,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件列牺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拗窃,警方通過(guò)查閱死者的電腦和手機(jī)瞎领,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)随夸,“玉大人九默,你說(shuō)我怎么就攤上這事√悠牵” “怎么了荤西?”我有些...
    開(kāi)封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)伍俘。 經(jīng)常有香客問(wèn)我邪锌,道長(zhǎng),這世上最難降的妖魔是什么癌瘾? 我笑而不...
    開(kāi)封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任觅丰,我火速辦了婚禮,結(jié)果婚禮上妨退,老公的妹妹穿的比我還像新娘妇萄。我一直安慰自己蜕企,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布冠句。 她就那樣靜靜地躺著轻掩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪懦底。 梳的紋絲不亂的頭發(fā)上唇牧,一...
    開(kāi)封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音聚唐,去河邊找鬼丐重。 笑死,一個(gè)胖子當(dāng)著我的面吹牛杆查,可吹牛的內(nèi)容都是我干的扮惦。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼亲桦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼崖蜜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起烙肺,我...
    開(kāi)封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤纳猪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后桃笙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氏堤,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年搏明,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鼠锈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡星著,死狀恐怖购笆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情虚循,我是刑警寧澤同欠,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站横缔,受9級(jí)特大地震影響铺遂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茎刚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一襟锐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧膛锭,春花似錦粮坞、人聲如沸蚊荣。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)互例。三九已至,卻和暖如春姓迅,著一層夾襖步出監(jiān)牢的瞬間敲霍,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工丁存, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柴我。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓解寝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親艘儒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子聋伦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宮若石閱讀 1,064評(píng)論 0 1
  • Node.js是目前非常火熱的技術(shù)界睁,但是它的誕生經(jīng)歷卻很奇特觉增。 眾所周知,在Netscape設(shè)計(jì)出JavaScri...
    w_zhuan閱讀 3,612評(píng)論 2 41
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理翻斟,服務(wù)發(fā)現(xiàn)逾礁,斷路器,智...
    卡卡羅2017閱讀 134,638評(píng)論 18 139
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測(cè)試 ...
    KeKeMars閱讀 6,313評(píng)論 0 6
  • 看完今天的文章访惜,感覺(jué)自己長(zhǎng)大了好多嘹履,懂事了好多,每次看書之后都有不一樣的感覺(jué)债热,感覺(jué)說(shuō)話的感覺(jué)都變了砾嫉,仿佛看清了很多...
    季珊嘻嘻閱讀 185評(píng)論 0 0