藉助Wasmer-JS在瀏覽器和Node.js上運行WASI

Aaron TurnerWasmer的開發者關係工程師,他宣佈最近發佈的Wasmer-JS允許開發人員在Node和瀏覽器中運行WASI模塊。Turner提供了wasm-terminal作爲使用Wasmer-JS構建終端應用的樣例,Wasmer-JS允許抓取和運行WASI模塊。

Wasmer-JS是由四個包組成的集合,它允許開發人員在Node和瀏覽器中使用WASI模塊。第一個包叫做@wasmer/wasi,它是針對Node和瀏覽器的WASI實現。@wasmer/wasmfs實現了一個在瀏覽器中使用的WASI/Wasm文件系統,也可以用於Node中的沙箱。第三個包爲@wasmer/wasm_transformer,它爲wasm_transformer crate提供了一個JavaScript接口。第四個包爲@wasmer/wasm-terminal,它是使用上述包所構建的一個樣例應用。wasm-terminal是一個終端/shell,用來與瀏覽器中運行的WASI/Wasm模塊進行交互。信息來源:wasmer announcement blog post

Wasmer-JS構建在現有解決方案之上,部分允許開發人員在JavaScript環境中運行WASI。一方面,Mozilla web polyfill允許在瀏覽器中運行基於WASI的應用,但是有一定的限制。而Mozilla polyfill支持標準輸出,Turner說到:

[The Mozilla polyfill]不支持標準輸入,不能運行使用i64導入的WASI模塊,不適合在現代JavaScript項目中使用。

另一方面,node-wasi會填充(polyfill)WASI導入、提供文件訪問,並且可以用到現代Node項目中,但是它並不能運行使用i64導入的WASI模塊,也不能用到瀏覽器中。

隨着WASI在標準化道路上的不斷演進,Turner提到如下這些額外的問題會限制JavaScript中WASI模塊的執行:

  • WASI模塊期望獲取來自主機運行時的特定導入,目前這在Web瀏覽器和Node中是無法實現的。
  • 有些API 調用是同步的,而JavaScript正常會運行在一個異步的環境中。

通過使用Wasmer-JS包,Wasmer WebAssembly運行時解決了上述問題。例如,@wasmer/wasm-transformer包通過注入trampoline函數來轉換WebAssembly二進制包,用來處理Wasm和JavaScript之間的i64/BigInt調用。

在JavaScript中運行WASI爲新的使用場景打開了大門。Web開發人員可以編譯使用Rust、Go、C、Java、C#或任意WASI編譯語言所編寫應用,並將它們集成到Web應用的工作流中。最近有一些流行的應用都遷移到了WebAssembly上(如Google EarthDoom3以及更簡單的JSON解析器JQ)。通過解除上述約束,Wasmer-JS將增加應用程序的範圍,從而能夠更加有效地移植到JavaScript環境中。

另一方面,Rust或Go開發人員可以向他們的應用程序添加Web前端,通過將他們的應用程序移植到WASI上,潛在地增加其用戶基礎。

發佈公告的博客文章提供了一些代碼示例來說明如何在JavaScript中使用Wasmer-JS包。同時,@wasmer/wasm-terminal示例應用程序的代碼有助於理解如何在更大的範圍內使用Wasmer-JS包協同工作。

WASI是用於WebAssembly平臺的模塊化系統接口(目前四大主流的瀏覽器引擎都已實現)。WASI在WebAssembly CG的一個子組中得以標準化。Mozilla稱WASI是一種快速、可伸縮、安全的方式,可以在所有機器上運行相同的代碼。WebAssembly是一種用於概念機(conceptual machine)的彙編語言,它能夠在各種不同的實現了概念機的機器架構上運行。同時,WASI也可以理解爲概念操作系統的系統接口,提供了在各種硬件和軟件環境中的實現。

Wasmer-JS可以基於MIT開源協議獲取。歡迎通過Wasmer-JS GitHub項目對其進行貢獻,貢獻過程需要遵循Wasmer-JS的貢獻指南代碼規範

原文鏈接:

Running WASI in the Browser and Node.js With Wasmer-JS

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