摘要:介紹的全稱為其表現(xiàn)上是一個包。引用擴展,暴露出方法供上層使用。初次開發(fā)擴展的用戶需要注意下項目目錄中的文件會讀取項目中的為表示最后生成的擴展文件名為。累加完成后通過將結(jié)果返回出去。
NAN介紹
NAN的全稱為Native Abstraction for Node.js, 其表現(xiàn)上是一個Node.js包。安裝后,就得到一堆C++頭文件,里面是一堆宏。它主要為Node.js和V8跨版本提供了封裝的宏,使得開發(fā)者不用關心各個版本之間的API的差異。(from 《nodejs來一打C++擴展》)
NAN的優(yōu)勢在于可以屏蔽不同版本Node的API,使得C++擴展可以wirte once, compile anywhere,一份C++擴展可以適用于不同版本的Node.js。這里的c++擴展實現(xiàn)的功能是一個求和的擴展(hello world太多了,寫個不一樣的)
擴展地址為:https://www.npmjs.com/package...,
項目代碼地址:https://github.com/warjiang/d...
使用方式如下:
在開發(fā)之前我們首先需要安裝nan包(npm install nan -S)。擴展開發(fā)分成兩個層面,c++層面和JS層面。src目錄中主要是c++代碼,也是擴展的實現(xiàn)部分。index.js引用c++擴展,暴露出方法供上層使用。
初次開發(fā)nodejs擴展的用戶需要注意下項目目錄中的binding.gyp文件(node-gyp會讀取項目中的binding.gyp):
target_name為sum,表示最后生成的擴展文件名為sum.node。include_dirs表示除了nodejs基礎的依賴之外,我們還需要nan的頭文件, 中表示后面是命令,node -e "require("nan")"就是利用nodejs的require能力,尋找nan的目錄,執(zhí)行效果如下:
sources項指明了c++擴展需要編譯的源文件。
先直接上代碼(src/init.cc):
#include#include #include using v8::Local; using v8::Object; using v8::Number; NAN_METHOD(sum){ Nan::HandleScope scope; uint32_t sum = 0; for(int i = 0; i< info.Length(); i++){ sum += info[i]->NumberValue(); } info.GetReturnValue().Set(Nan::New(sum)); } void init (Local
擴展的入口從NODE_MODULE(memwatch, init);開始,當js層面執(zhí)行了require("path/to/xxx.node")的時候,就會執(zhí)行init函數(shù)。
init函數(shù)的入?yún)⒖梢灶惐萴odule.exports對象,這里我們給exports對象增加了一個名為sum的方法,其對應的實現(xiàn)為NAN_METHOD(sum)部分。
NAN_METHOD(sum)通過宏定義對sum函數(shù)進行包裝,sum函數(shù)的入?yún)閕nfo數(shù)組,我們再這里遍歷info數(shù)組,通過info[i]->NumberValue方法將每個入?yún)膎umber類型的值取出來,加到sum中去。累加完成后通過info.GetReturnValue().Set(Nan::New(sum))將sum結(jié)果返回出去。這樣其實我們的c++部分擴展就已經(jīng)開發(fā)完畢了,可以通過執(zhí)行node-gyp configure && node-gyp build編譯項目,在build/Release目錄下會生成sum.node的文件。我們可以啟動一個node的命令行進行驗證:
// node cli > let addon = require("./build/Release/sum") > addon.sum(1) // 1 > addon.sum(1,2) // 3
引用build/Release/sum的方式實際開發(fā)中十分不方便,我們可以用js對這行代碼進行封裝,在js內(nèi)部引用build/Release/sum,暴露出來方法給外部進行調(diào)用。
js部分開發(fā)有了上面的鋪墊,這里我們開發(fā)js部分就顯得十分自然。直接上代碼
const addon = require("./build/Release/sum") module.exports = addon.sum
一共就兩行代碼,邏輯清晰簡單,就引用編譯好的擴展,將sum方法暴露出去。
發(fā)布nodejs擴展發(fā)布的時候需要在package.json的scripts部分增加install鉤子的處理,如下:
用戶安裝擴展的時候,會在install的鉤子上,幫助用戶執(zhí)行node-gyp rebuild來在用戶的機器上生成對應的擴展文件。這樣我們的開發(fā)就完畢了,執(zhí)行npm publish將npm包發(fā)布出去
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/100800.html
摘要:類似的,如果我們想要調(diào)試擴展,我們也需要擴展源文件的調(diào)試符號信息。配置安裝插件這里我們將用來調(diào)試擴展。配置輸入配置一個任務,該任務會執(zhí)行,生成帶調(diào)試信息的擴展文件。 Debugging NodeJS C++ addons using VS Code 之前筆者寫了一篇 用NAN寫一個nodejs的c++擴展, 實際開發(fā)過程中,肯定是有單步調(diào)試的需求。這里簡單介紹用如何用vscode調(diào)試...
摘要:介紹是一個擴展,主要用來觀察內(nèi)存泄露問題,基本用法如下實現(xiàn)分析分析的版本為。的入口函數(shù)在文件中,通過進行聲明。下面分析下函數(shù)的具體實現(xiàn)函數(shù)內(nèi)部會遞歸調(diào)用函數(shù)得到最終堆快照的結(jié)果。回調(diào)的觸發(fā)與的鉤子有關,詳細看下一節(jié)分析。 介紹 memwatch是一個c++擴展,主要用來觀察nodejs內(nèi)存泄露問題,基本用法如下: const memwatch = require(@airbnb/mem...
摘要:每次在命令行中輸入一串命令,敲入回車,終端進程都會一個子進程,用來執(zhí)行輸入的命令,終端進程通過系統(tǒng)調(diào)用監(jiān)聽子進程退出,同時通過暴露的輸出子進程執(zhí)行信息。父進程通過創(chuàng)建該的實現(xiàn)向子進程從設備的輸入輸出。 背景 terminal(命令行)作為本地IDE普遍擁有的功能,對項目的git操作以及文件操作有著非常強大的支持。對于WebIDE,在沒有web偽終端的情況下,僅僅提供封裝的命令行接口是完...
摘要:本文轉(zhuǎn)載自眾成翻譯譯者亂發(fā)小生鏈接原文學習怎樣傳遞信息從到是一個非常難的事情。原因在于和兩種語言類型之間的巨大差異。你可以在這里查看所有的類型。這兩個組件松散和嚴格的表明一系列函數(shù)接收不同類型的參數(shù),,,和和它們的返回值。 本文轉(zhuǎn)載自:眾成翻譯譯者:亂發(fā)小生鏈接:http://www.zcfy.cc/article/3360原文:https://nodeaddons.com/type-...
摘要:單線程使用單線程來運行,而不是向之類的其它服務器,每個請求將生產(chǎn)一個線程,這種方法避免了上下文切換和內(nèi)存中的大量執(zhí)行堆棧,這也是和其它服務器為解決上一個年,著名的并發(fā)連接問題而采用的方法。 showImg(https://segmentfault.com/img/remote/1460000019968794?w=1080&h=675);當我們學習一項新的事物的時候,我們首先要知道它來...
閱讀 2121·2021-11-24 09:39
閱讀 1504·2019-08-30 15:44
閱讀 1957·2019-08-29 17:06
閱讀 3409·2019-08-29 16:32
閱讀 3553·2019-08-29 16:26
閱讀 2662·2019-08-29 15:35
閱讀 3035·2019-08-29 12:50
閱讀 1649·2019-08-29 11:15