现在你可以通过浏览器直接起一个 PHP/Node.js 环境跑后端程序了,这是 Google I/O 2023 提到的一个 WebAssembly 实践,将 WordPress 直接运行在浏览器,包括后端和数据库:web.dev/wordpress-playground,效果如图一所示。
这项实践颇有意义,以前大家可能见过各种 WebOS 的网页版 Demo,例如运行在 Web 上的操作系统、 Bash 环境、单机游戏,那些其实都是通过 JavaScript 来模拟实现的,现在基于 WASM 我们有机会实现一个纯浏览器的运行环境,它可以为程序提供 POSIX 接口,例如处理文件、进程、信号等等。
这就带来了比较多的想象空间,例如大家熟悉的 Github Workspace,对于简单类型的 Node.js 应用就没必要起一个昂贵的后端容器了,前后端代码都可以在浏览器直接执行。实际上,StackBlitz 的 CodeFlow 就已经在商业化中投入使用了这样的方式。
再例如,新手学编程就不需要配置复杂的本地环境了,基于 WASM 的浏览器环境便是一个最好的 Playground,所有的依赖通过一个远程下发的 .wasm 文件就可以搞定;再例如,对于无状态的云函数,也可以在端上直接运行一个轻量级的 WASM 环境。充分利用端的计算能力,通过软件分发和服务分发的形式提升端侧体验,同时也可以一定程度降低云的成本。
以 WordPress 为例,图二演示了大致的实现原理:使用 Service Worker 拦截请求,然后将处理任务转发给 Worker 进程,Worker 中调用 WASM 提供的能力进行处理。整体看起来就像是在 Client 侧部署了一个 Server,又一个新形态的 BFF(Backend for Frontend) 层,😄
借助 WASM 暴露系统能力给 JS 还是存在一定局限性的,例如对于 TCP/UDP 流量的处理,目前就做不到,倒是可以考虑通过 Websocket 包装 TCP/UDP 流量,然后再转发到代理服务器上进行处理;再例如在 high-level 的 JavaScript 中无法处理 low-level 的 C/C++ 网络请求,JS 是异步循环,而 C/C++ 执行的请求是同步的,天然就会出问题,不过社区也有人搞了一个 Asyncify 来实现兼容,算的上一个能力补偿库。类似的问题还比较多,需要靠更丰富的应用层的发展来驱动解决。
实际上,WASM 并不单单为 Web 设计,它也可以跑在各种 IoT 设备和后端环境中,也就是说,使用 Node.js 调用一个使用 WASM 包装的 PHP 应用能力将会变成一件十分轻松的事情。按照这个思路来看,未来软件的分发就变得更加简单了,它将不再受到语言的限制。
还是很值得投入研究的,感兴趣的朋友可以进来看看。