Categories
程式開發

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


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

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

/
├── .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 {
...
}

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

let x = cx.argument::(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團隊正在開發電子重建,這個工具將簡化這一過程,可以像使用其他依賴項那樣使用Neon依賴項。

原文鏈接

Neon啟用在Node.js應用程序中嵌入Rust代碼