Golang WebAssembly(wasm) 优化 | 减少 wasm 大小
最近项目使用到第三方项目作为 H5 IM 部分的实现,其中前端引入其提供的 SDK,经研究发现 H5 前端 SDK 是基于 Golang 实现的 WASM 用于处理实时消息。
由于 Golang WASM 部分的逻辑复杂,在使用过程中发现 WASM 体积偏大,导致前端加载速度比较慢,因此尝试缩减 WASM 体积。
经过优化,可以将编译后的 WASM 从原本的 31.6MB 优化到 14.56MB,约 53% 的大小,经 Gzip 压缩之后的体积从 6MB 压缩到 3.5MB。
优化步骤
在优化的过程中,我们可以使用 go-weight 查看打包出来的 WASM 中各个包所占用大小。
命令行如下:
GOOS=js GOARCH=wasm goweight
尝试使用 tinygo 直接替换原生编译器。
tinygo 是一款针对微型硬件和 WASM 运行环境的 Go 编译器。
使用 tinygo 编译出的 WASM 体积比原生编译器要小很多,经过尝试验证确实如此。
但编译出来的 WASM 无法直接替换原生编译出的 WASM,经过测试发现,原因是 tinygo 不支持 reflect,甚至任何依赖 reflect 的库都无法运行(可以编译)。
该问题详