@levinzhang
2019-10-12T10:07:57.000000Z
字数 1991
阅读 789
by
Aaron Turner是Wasmer的开发者关系工程师,他宣布最近发布的Wasmer-JS允许开发人员在Node和浏览器中运行WASI模块。Turner提供了wasm-terminal作为使用Wasmer-JS构建终端应用的样例,Wasmer-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