當前位置:
首頁 > 知識 > 擁抱Node.js 8.0,N-API入門極簡例子

擁抱Node.js 8.0,N-API入門極簡例子


本文摘錄自《Nodejs學習筆記》,更多章節及更新,請訪問 github主頁地址。歡迎加群交流,群號197339705。

N-API簡介

Node.js 8.0 在2017年6月份發布,升級的特性中,包含了N-API。編寫過或者使用過 node擴展的同學,不少都遇到過升級node版本,node擴展編譯失敗的情況。因為node擴展嚴重依賴於V8暴露的API,而node不同版本依賴的V8版本可能不同,一旦升級node版本,原先運行正常的node擴展就編譯失敗了。

這種情況對node生態圈無疑是不利的,N-API的引入正是試圖改善這種情況的一種嘗試。它跟底層JS引擎無關,只要N-API暴露的API足夠穩定,那麼node擴展的編寫者就不用過分擔憂node的升級問題。

如何使用N-API

先強調一點,N-API並不是對原有node擴展實現方式的替代,它只是提供了一系列底層無關的API,來幫助開發者編寫跨版本的node擴展。至於如何編寫、編譯、使用擴展,跟原來的差不多。

本文會從一個超級簡單的例子,簡單介紹N-API的使用,包括環境準備、編寫擴展、編譯、運行幾個步驟。


備註:當前N-API還處於試驗階段,官方文檔提供的例子都是有問題的,如用於生產環境需格外謹慎。

1、環境準備

首先,N-API是8.0版本引入的,首先確保本地安裝了8.0版本。筆者用的是nvm,讀者可自行選擇安裝方式。

nvm i 8.0
nvm use 8.0

然後,安裝node-gyp,編譯擴展會用到。

npm install -g node-gyp

創建項目目錄,並初始化package.json

mkdir hello & cd hello # 目錄名隨便起
npm init -f

2、編寫擴展

創建hello.cc作為擴展的源文件。

mkdir src
touch src/hello.cc

編輯hello.cc,輸入如下內容。

#include

// 實際暴露的方法,這裡只是簡單返回一個字元串
napi_value HelloMethod (napi_env env, napi_callback_info info) {
napi_value world;
napi_create_string_utf8(env, "world", 5, &world);
return world;
}

// 擴展的初始化方法,其中
// env:環境變數
// exports、module:node模塊中對外暴露的對象
void Init (napi_env env, napi_value exports, napi_value module, void* priv) {
// napi_property_descriptor 為結構體,作用是描述擴展暴露的 屬性/方法 的描述
napi_property_descriptor desc = { "hello", 0, HelloMethod, 0, 0, 0, napi_default, 0 };
napi_define_properties(env, exports, 1, &desc); // 定義暴露的方法
}

NAPI_MODULE(hello, Init); // 註冊擴展,擴展名叫做hello,Init為擴展的初始化方法

3、編譯擴展

首先,創建編譯描述文件binding.gyp

{
"targets": [
{
"target_name": "hello",
"sources": [ "./src/hello.cc" ]
}
]
}

然後,運行如下命令進行編譯。

node-gyp rebuild

4、調用擴展

未方便調用擴展,先安裝bindings

npm install --save bindings

然後,創建app.js,調用剛編譯的擴展。

var addon = require("bindings")("hello");

console.log( addon.hello ); // world

運行代碼,由於N-API當前尚處於Experimental階段,記得加上--napi-modules標記。

node --napi-modules app.js

輸出如下

{"path":"/data/github/abi-stable-node-addon-examples/1_hello_world/napi/build/Release/hello.node"}
world
(node:6500) Warning: N-API is an experimental feature and could change at any time.

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 達人科技 的精彩文章:

vuex所有核心概念完整解析State Getters Mutations Actions
Oracle體系結構之進程
ProxySQL 介紹

TAG:達人科技 |

您可能感興趣

Telegram完成首輪8.5億美元ICO,BAT很難真正擁抱區塊鏈
申請開放|2018 Stanford CEO China Startup Trek,與我們一起擁抱人生的非凡可能!
Omi 擁抱 60FPS 的 Web 動畫
微軟擁抱 Linux ,Win10 商店上架 Debian 和 Kali
微軟擁抱 Linux,Win10 商店上架 Debian和Kali
IZONE破女團記錄,TWICE、fromis_9擁抱祝賀超暖心!
微軟擁抱其新平台Azure和Microsoft 365
全面擁抱雲,Epicor Insights 2019第一日新品令人眼前一亮
全面擁抱H5與移動端,Scratch3.0測試版發布!
K8s有多熱?傳統銀行轉型擁抱Kubernetes案例
Chrome OS和Windows 雙雙擁抱 Linux
和LCD屏說再見!iPhone將在2020年全面擁抱OLED屏
PPython:PHP 擁抱 Python 的利器
43歲的微軟大重組:肢解Windows,擁抱AI,20年功臣離職
放棄幻想,全面擁抱Transformer:自然語言處理三大特徵抽取器(CNN/RNN/TF)比較
放棄幻想,全面擁抱 Transformer:自然語言處理三大特徵抽取器(CNN/RNN/TF)比較(上篇)
放棄幻想,全面擁抱 Transformer:自然語言處理三大特徵抽取器(CNN/RNN/TF)比較(下篇)
ColinAstrology星象運勢 2018年 12月 巨蟹滿月 擁抱
《華麗志》獨家專訪寶格麗全球 CEO Jean-Christophe Babin:跨越134年歷史去擁抱創新
分享實戰刷入crDroid的體驗,擁抱原生安卓8.1