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