主要观点:作者在一些小型项目中将 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。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。