Neon是一個可以使用Rust開發原生Node模塊的庫和工具鏈,類似於使用C和C++所實現的功能,它還利用了Rust安全方面的好處。
Neon致力於讓Node.js模塊的創建變得簡單明瞭。在安裝了Neon和Rust工具鏈後,你就可以使用neon new
<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依賴項。
原文鏈接: