借助 Wasmer-JS 在浏览器和 Node.js 上运行 WASI

阅读数:1673 2019 年 10 月 19 日 08:00

借助Wasmer-JS在浏览器和Node.js上运行WASI

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

评论

发布