Neon支持在Node App中嵌入Rust代碼

Neon是一個可以使用Rust開發原生Node模塊的庫和工具鏈,類似於使用C和C++所實現的功能,它還利用了Rust安全方面的好處。

Neon致力於讓Node.js模塊的創建變得簡單明瞭。在安裝了Neon和Rust工具鏈後,你就可以使用neon new 來創建一個Node模塊骨架,其中包含了一個Cargo.toml文件和一個Rust文件(一個示例hello函數):

<project-name>/
├── .git ignore
├── README.md
├── lib/
│   └── index.js
├── native/
│   ├── Cargo.toml
│   └── src/
│       └── lib.rs
└── package.json

你可以在Cargo.toml中添加所需的Rust依賴項,並按照你喜歡的方式佈局代碼。你可以通過兩個步驟導出Rust函數,然後在Node程序中使用它。首先是註冊函數:

register_module!(mut m, {
    m.export_function("myFunction", thread_count)
});

然後,在lib/index.js中導出:

const addon = require('../native');
module.exports = addon.myFunction;

準備好代碼後,你就可以構建Node模塊:

neon build --release

雖然這看起來很簡單,但你無論如何都應該特別注意在Node環境中表現得像個好公民。特別是你導出的任何一個Rust函數都應該是特定類型的:

fn add1(mut cx: FunctionContext) -> JsResult<JsNumber> {
...
}

這裏,可以通過FunctionContext訪問Node調用者環境,包括它的arguments列表。類似地,導出的函數應該返回一個JsResult,這是一個指定了函數返回給定類型或拋出JavaScript異常的可選類型。例如,你可以使用以下語法訪問特定參數:

let x = cx.argument::<JsNumber>(0)?.value();

要從導出的函數返回值,應該將其轉換爲預期值。例如,如果你的函數返回一個數字,在返回時你需要使用Rust的as f64轉換操作符對其進行轉換:

Ok(cx.number(num_cpus::get() as f64))

構建原生Node模塊的一個好處是可以執行異步後臺任務。Neon使用N-API的微任務API來實現這個目標,並依賴JavaScript端的回調和Promise來控制異步任務的執行。

Neon也可以用於Electron App。目前這需要使用一箇中間工具electron-build-env,用於構建Electron App所需的Neon依賴項。Neon團隊正在開發electron-rebuild,這個工具將簡化這一過程,可以像使用其他依賴項那樣使用Neon依賴項。

原文鏈接

Neon Enables Embedding Rust Code in Node.js Apps

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章