最近发布的Golang 1.11版本,新增了两个非常值得关注的内容:Go Modules 和 WebAssembly。我也是非常后知后觉的了解到此事,立刻去下载了新版尝试了一下。
作为一个偏向后端的语言,大家普遍更关心 Go Modules 的使用方法。不过本人倒是更在意WebAssembly,拿到新版后第一时间对该模块进行了尝试,编写了一个简易的页面3D展示功能。
这是基于Go所编译的wasm代码运行效果截图。
测试地址为
Golangliuqi0826.xicp.net:8888开发目标:
1.诸如暴露几个接口给JS调用之类的无聊轮子就不想再造了,既然尝试就做些大胆点的尝试,选择一个GO不擅长的领域,譬如3D。
2.WASM不能直接调用API,所以开发中肯定会融入JS代码,尽可能少用JS,看看GO能做到什么样的地步。
开发准备:
1.首先获取最新版的GO,本人使用Windows进行开发。
建议编写bat文件方便编译
SET GOOS=js
SET GOARCH=wasm
go build -o xxxxx.wasm xxxxxxxxxxx.go ......
2.查看官方文档,主要是syscall/js包的使用,建议结合源码查看。另外拷贝官方页面模板备用。
golang/gogithub.com3.查看官方示例,以及两个教学视频。
stdiopt/gowasm-experimentsgithub.com4.准备一个足够简单的模型用于展示,这里使用了一个《崩坏3》的杂兵模型。
5.准备一个Web服务器,可能需要为wasm新增MIME类型,也可以用GO自行编写,编写方式参考官方WIKI。
开发过程:
1.细节掠过,该项目代码量不算大,大致文件如图。
2.因为是初次尝试,为避免不必要的复杂度增加,所有代码都归于main包。
3.GO对于web汇编的支持比预想中好,预想网络加载资源需要单开JS函数回调,后来发现可以直接使用HTTP包。
4.对于WebGL的调用还是略显蛋疼,本人最后没忍住,对API包了一层,算是个简单的binding,可以方便日后使用。
5.各种调试,查错,最终模型成功展示出来。
发开总结:
1.GO对于WebAssembly的支持远比我想象中好很多,本以为开发过程会与Flash的炼金术一样痛苦,结果开发过程竟然挺愉悦。
2.最终除了官方页面模板的JS代码外,没有额外编写一行JS,基本上可以在GO内完成整个项目。
3.现阶段开发工具对这类项目支持不算好,syscall/js包引用会报错,调试也很麻烦。
4.GO编译的wasm本体体积(即不包含其他代码,仅含有GO的运行时)大概接近2M,可以说具备一定竞争力。开发难度低于C/C++/Rust,可以适用于前端开发的节奏。但是完败于TS,毕竟人家是专攻这个领域的语言。另外C#以及JAVA等语言估计短期都难以看到在此领域的成果(C#应该根本就不会出,毕竟TS才是干这件事的),毕竟打包虚拟机后体积可能很惊人。
关于GO WebAssembly相关内容,本人也在学习中,如有写错也请多包涵,谢谢。
本文首发于知乎,转载请注明。