選單

將 JavaScript 嵌入到 Rust 中|用 WasmEdge 執行 JavaScript

WasmEdge 將 Rust 強大的效能和 JavaScript 的簡單易用完美結合在一起。

在之前的文章中,我們討論瞭如何在 WebAssembly 沙箱中執行 JavaScript 程式。WasmEdge runtime 為雲原生 JavaScript 應用程式提供了一個輕量級、高效能且符合 OCI 標準的“容器”。

然而,JavaScript 是一種“慢”語言。使用 JavaScript 的原因主要是因為它用起來很容易,開發者生產力高,對初學者來說尤其如此。另一方面,WebAssembly 能夠執行用 Rust 等語言編寫的高效能應用程式。有沒有結合 JavaScript 和 Rust 的解決方案?WasmEdge 給出了兩全其美的答案。

有了WasmEdge 和 QuickJS[1],開發者就可以完美搭配這兩個最強大的語言來創造應用程式。就像下面這樣:

該應用程式本身是用 Rust 寫的並被編譯成了 WebAssembly。它可以作為單個 wasm 位元組碼檔案進行編譯和部署。它可以由符合 OCI 的容器工具管理,如 Docker Hub、CRI-O 和 k8s。

JavaScript 程式嵌入在 Rust 應用程式中。Rust 程式可以在編譯時包含JavaScript 原始碼,也可以在 runtime 透過檔案、STDIN、網路請求甚至函式呼叫引入JS。這樣一來 JavaScript 程式可以由與Rust 程式不同的開發者編寫。

Rust 程式可以處理應用程式中的計算密集型任務,而 JavaScript 程式可以處理“業務邏輯”。例如,Rust 程式可以為 JavaScript 程式準備資料。

接下來,讓我們看幾個示例。所有示例都在wasmedge-quickjs[2]repo 的 分支中。

確保你已經安裝Rust[3]和WasmEdge[4],這樣才能構建和執行本文中的示例。

Hello WasmEdge

main。rs[5]中的以下 Rust 程式在編譯時嵌入了一個 JavaScript 程式。

example_js/demo。js[6]程式碼如下。

你可以將 Rust + JavaScript 應用程式構建到單個 WebAssembly 位元組碼程式中。

執行它,就看到列印到控制檯的結果了。

就是這樣。Rust 程式碼可以透過傳遞引數甚至直接修改包含的 JavaScript 原始碼,將資料傳遞到 JavaScript 程式碼中。JavaScript 程式碼還可以透過寫入臨時檔案來返回值。

使用嵌入式 JavaScript 進行圖片識別

你可以修改main。rs[7]中的 Rust 程式以嵌入不同的 JavaScript 程式。在下面的示例中,讓我們更改為

main。js[8]程式碼使用 WasmEdge Tensorflow 擴充套件的 JavaScript API 來呼叫 ImageNet 讀取和識別影象模型。

你可以將 Rust + JavaScript 應用程式構建到單個 WebAssembly 位元組碼程式中。注意  標誌,它要求 Rust 編譯器使用 WasmEdge TensorFlow 擴充套件 API。

執行並檢視列印到控制檯的結果。

讓執行變得更快

執行上面的 Tensorflow 推理示例需要花費 1-2 秒。這在 Web 應用場景中是可以接受的,但還能改進。在上篇文章中,我們提過由於其 AOT(提前編譯器)最佳化,WasmEdge 是當前速度最快的 WebAssembly runtime。WasmEdge 提供了一個 實用程式來將 檔案編譯為原生的 共享庫。你可以使用 來執行 檔案而不是 檔案以獲得更快的效能。

下面的例子使用了 和 的擴充套件版本來支援 WasmEdge Tensorflow 擴充套件。

你可以看到影象分類任務可以在 0。1 秒內完成。這至少是 10 倍的改進!

共享庫不能跨機器和作業系統移植。你必須在你部署和執行應用程式的機器上執行 和 。

下一步

在 Rust 中嵌入 JavaScript 是一種建立高效能雲原生應用程式的強大方法。下一篇文章中,我們將研究另一種技術方法:在 JavaScript 中嵌入原生庫。

雲原生 WebAssembly 中的 JavaScript 是下一代雲和邊緣計算基礎設施中的新興領域。我們也是剛剛起步!如果你也感興趣,請加入我們的WasmEdge[9]專案或透過提出 feature request issue 告訴我們,你需要的是什麼。

參考資料[1]

WasmEdge 和 QuickJS:https://github。com/second-state/wasmedge-quickjs/

[2]

wasmedge-quickjs:https://github。com/second-state/wasmedge-quickjs/tree/embed_in_rust

[3]

Rust:https://www。rust-lang。org/tools/install

[4]

WasmEdge:https://github。com/WasmEdge/WasmEdge/blob/master/docs/install。md

[5]

main。rs:https://github。com/second-state/wasmedge-quickjs/blob/embed_in_rust/src/main。rs

[6]

example_js/demo。js:https://github。com/second-state/wasmedge-quickjs/blob/embed_in_rust/example_js/demo。js

[7]

main。rs:https://github。com/second-state/wasmedge-quickjs/blob/embed_in_rust/src/main。rs

[8]

main。js:https://github。com/second-state/wasmedge-quickjs/blob/embed_in_rust/example_js/tensorflow_lite_demo/main。js

[9]

WasmEdge:https://github。com/WasmEdge/WasmEdge