日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Nodejs系列之使用V8編寫C++插件

雖然現(xiàn)在大部分情況都是使用n-api來編寫插件,但是底層畢竟是v8(和libuv),使用v8編寫簡單的插件,同時(shí)熟悉v8的使用。

為岳塘等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及岳塘網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都外貿(mào)網(wǎng)站建設(shè)、岳塘網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

本文介紹在寫c++插件時(shí),簡單又常用的寫法,其實(shí)本質(zhì)上,寫插件的難處在于底層的能力和對(duì)libuv、v8的了解。話不多說,直接看代碼。

 
 
 
  1. #include  
  2.  
  3.  
  4. namespace demo { 
  5.  
  6.  
  7. using v8::FunctionCallbackInfo; 
  8. using v8::Isolate; 
  9. using v8::Local; 
  10. using v8::Object; 
  11. using v8::String; 
  12. using v8::Value; 
  13. using v8::FunctionTemplate; 
  14. using v8::Function; 
  15. using v8::Number; 
  16. using v8::MaybeLocal; 
  17. using v8::Context; 
  18. using v8::Int32; 
  19.  
  20.  
  21. static int seq; 
  22. // 定義一個(gè)工具函數(shù),生成seq 
  23. void GenSeq(const FunctionCallbackInfo& args) { 
  24.     Isolate* isolate = args.GetIsolate(); 
  25.     args.GetReturnValue().Set(Number::New(isolate, ++seq)); 
  26.  
  27.  
  28. // 定義一個(gè)加法函數(shù) 
  29. void Add(const FunctionCallbackInfo& args) { 
  30.     Isolate* isolate = args.GetIsolate(); 
  31.     int a = args[0].As()->Value(); 
  32.     int b = args[1].As()->Value(); 
  33.     args.GetReturnValue().Set(Number::New(isolate, a + b)); 
  34.  
  35.  
  36. void Initialize( 
  37.   Local exports, 
  38.   Local module, 
  39.   Local context 
  40. ) { 
  41.   Isolate* isolate = context->GetIsolate(); 
  42.   // 新建一個(gè)函數(shù)模版 
  43.   Local func = FunctionTemplate::New(isolate); 
  44.   // 新建一個(gè)字符串表示函數(shù)名 
  45.   Local zaylee = String::NewFromUtf8(isolate, "zaylee", v8::NewStringType::kNormal).ToLocalChecked(); 
  46.   // 設(shè)置函數(shù)名 
  47.   func->SetClassName(zaylee); 
  48.   // 設(shè)置原型屬性 
  49.   func->PrototypeTemplate()->Set(isolate, "protoField", Number::New(isolate, 1)); 
  50.   // 設(shè)置對(duì)象屬性 
  51.   func->InstanceTemplate()->Set(isolate, "instanceField", Number::New(isolate, 2)); 
  52.   func->InstanceTemplate()->Set(isolate, "add", FunctionTemplate::New(isolate, Add)); 
  53.   // 設(shè)置函數(shù)對(duì)象本身的屬性 
  54.   func->Set(isolate, "funcField", Number::New(isolate, 3)); 
  55.   // 根據(jù)函數(shù)模版創(chuàng)建一個(gè)函數(shù) 
  56.   Local ret = func->GetFunction(context).ToLocalChecked(); 
  57.   Local Demo = String::NewFromUtf8(isolate, "Demo", v8::NewStringType::kNormal).ToLocalChecked(); 
  58.   // 導(dǎo)出函數(shù) 
  59.   exports->Set(context, Demo, ret).Check(); 
  60.   // 導(dǎo)出工具函數(shù) 
  61.   NODE_SET_METHOD(exports, "genSeq", GenSeq); 
  62.  
  63.  
  64. NODE_MODULE_CONTEXT_AWARE(NODE_GYP_MODULE_NAME, Initialize) 
  65.  
  66.  
  67. }  // namespace demo 
  68. 寫個(gè)測試?yán)?/p>

     
     
     
    1. const { Demo, genSeq } = require('./build/Release/test.node'); 
    2. const demo = new Demo(); 
    3. console.log('demo對(duì)象:', demo, '\n'); 
    4. console.log('原型屬性:', demo.protoField, '\n'); 
    5. console.log('執(zhí)行add方法:', demo.add(1,2), '\n');   
    6. console.log('執(zhí)行seq方法:', genSeq(), genSeq(), '\n'); 

    最后編寫編譯配置

     
     
     
    1. {   
    2. "targets": [   
    3.   {   
    4.     "target_name": "test",   
    5.     "sources": [ "./test.cc" ]   
    6.   }   
    7. ]   

    看起來非常簡單,大概的流程如下

     
     
     
    1. npm install -g node-gyp 
    2. node-gyp configure 
    3. node-gyp build 
    4. node test.js 

    拓展nodejs的方式很多,插件是一種,直接修改內(nèi)核也是一種,之前有介紹過如何修改內(nèi)核,有興趣的同學(xué)也可以看一下。


    新聞標(biāo)題:Nodejs系列之使用V8編寫C++插件
    文章位置:http://www.5511xx.com/article/djsgjog.html