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