Aaron Turner是Wasmer的开发者关系工程师,他宣布最近发布的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 Earth、Doom3以及更简单的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
评论