关于在浏览器中使用 WebAssembly 运行 Go 的笔记

主要观点:作者在一些小型项目中将 Go 编译为 WebAssembly 在浏览器中运行,花费时间研究 WebAssembly 后总结在浏览器中运行 Go 的有用模式。
关键信息

  • 基本模式:从 JS 调用 Go 函数,如计算调和级数函数calcHarmonic,并将其导出到 JS 中,通过go build生成 WASM 文件,在 JS 中加载并调用。
  • DOM 操作:可将更多代码移到 Go 中进行 DOM 操作,如获取和设置 DOM 元素的值与属性,添加事件监听器等。
  • 使用 TinyGo:作为 Go 的替代编译器,其运行时更轻量,但编译速度慢,代码稍慢,且某些 stdlib 包依赖反射不工作。
  • 保持主线程空闲:利用 Web Workers 使 Go 代码在单独线程中执行,避免页面在计算时冻结,如在计算调和级数时添加 spinner 动画。
  • Web Socket 通信:用 Go 实现服务器与 JavaScript 客户端通过 Web Socket 通信,客户端使用浏览器 API 发送和接收消息,不同 Go 程序可通过不同底层库进行 Web Socket 通信。
  • 本地测试:利用 Node.js 加载和执行 WebAssembly 模块进行本地测试,可通过特殊支持的 Go 工具链实现类似运行常规 Go 程序的效果。
    重要细节
  • 示例代码包含在github 仓库中,不同模式的示例代码分别对应不同目录。
  • 提到 TinyGo 有自己的wasm_exec.js支持文件,与标准 Go 分布的不同。
  • 本地测试通过GOOS=js GOARCH=wasm go test -exec=supportfiles/go_js_wasm_exec -v.命令进行。
  • 对调和级数的注释说明了其发散缓慢的特性。
  • 提到可探索压缩 WASM 二进制等额外缓解措施。
  • 赞赏 JS 作为扩展语言的简单 ABI,能方便访问浏览器 API。
阅读 24
0 条评论