GTLC全球技术领导力峰会·上海站,首批讲师正式上线! 了解详情
写点什么

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

2019 年 10 月 19 日

借助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


2019 年 10 月 19 日 08:002082

评论

发布
暂无评论
发现更多内容

iOS 动画 - 窗景篇(一)

柯烂

ios objective-c swift 移动应用 动画

啪啪,打脸了!领导说:try-catch必须放在循环体外!

王磊

Java 性能优化 性能 java编程

深入理解ContextClassLoader

WANDEFOUR

深入理解JVM ContextClassLoader

这些Java8官方挖的坑,你踩过几个?

牧码哥

Java 踩坑 加密 「Java 25周年」

匆忙的一周 ARTS第二周

困到清醒

万字长文,助你吃透Eureka服务发现机制!

攀鱼飞岩

分布式 微服务 微服务发现 Eureka

ARTS打卡 第2周

引花眠

ARTS 打卡计划

除了直接看余额,谁更有钱还能怎么比(三)

石君

零知识证明 多方计算 同态加密

【大厂面试01期】高并发场景下,如何保证缓存与数据库一致性?

NotFound9

Java MySQL 数据库 redis 后端

机器学习算法评估指标——2D目标检测

做技术BP的文案Gou

游戏夜读 | 2020周记(5.24-5.31)

game1night

Linux 自动化运维工具 ansible

杨仪军

Linux 运维自动化

搞定 HTTP 协议(一):HTTP 与网络基础

零和幺

技术 前端 HTTP

深入理解JVM类加载机制

WANDEFOUR

类加载 深入理解JVM

深入理解ClassLoader

WANDEFOUR

类加载 深入理解JVM ClassLoader

MySQL实战笔记-事务隔离和MVCC

shiziwen

MySQL 学习 事务隔离级别

产品经理的商业能力

夜来妖

程序人生 产品经理 商业 商业模式 商业价值

是公司养活了你,还是你养活了公司?

四猿外

生涯规划 程序员 个人成长

架构学习历程

从技术到管理,我在极客时间的成长历程

邓建春

【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。

why技术

redis 分布式锁 分布式系统

[Redis] 你了解 Redis 的三种集群模式吗?

猴哥一一 cium

redis redis高可用 redis哨兵模式 群集安装

CPU的性能,编译器是这样压榨的!

GPU

算法 cpu 编译器 程序语言

我的 windows 利器

玄兴梦影

工具

关于区块链的“去中心化”,90% 的人都搞错了

CECBC区块链专委会

CECBC 区块链技术 去中心化 专制

java的时间利器:joda

毛佳伟🐳

Java

深度解读 Flink 1.11:流批一体 Hive 数仓

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

信息的表示与存储-整数的表示

引花眠

赢的境界 - 双赢思维

石云升

创业 创业心态 双赢思维

坏的开始是成功的一半

escray

不想被下载限速,教你自建属于自己的云盘!

小傅哥

小傅哥 云服务 云盘 在线网盘

DNSPod与开源应用专场

DNSPod与开源应用专场

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