go从1.11版本开始,实验性的加入了WebAssembly
的支持。
hellow world
程序
package main
import "fmt"
func main() {
fmt.Println("Hello, WebAssembly!")
}
设置go编译WebAssembly
环境变量值,GOOS=js
和GOARCH=wasm
。
设置方法有两种:
- 修改默认变量值,执行命令:
go env -w GOOS=js GOARCH=wasm
- 编译的时候指定值:
cd
到项目根目录,执行命令:GOOS=js GOARCH=wasm go build -o main.wasm
这时将生成一个main.wasm
文件,.wasm
后缀的文件可以通过http
设置合适的Content-Type
http头来使用。
需要注意的一点是,只能编译main
包,否则是不能在WebAssembly
里面使用的。
在浏览器里面运行main.wasm
用nginx准备一个http服务器,创建一个index.html
的测试文件,内容如下:
<html>
<head>
<meta charset="utf-8"/>
<script src="wasm_exec.js"></script>
<script>
const go = new Go();
WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject).then((result) => {
go.run(result.instance);
});
</script>
</head>
<body></body>
</html>
复制main.wasm
到根目录,从go
程序的安装目录里面的/misc/wasm/wasm_exec.js
复制wasm_exec.js
文件。
为了能够正确响应wasm
文件的Content_type
头,还需要在nginx
的MIME配置里面增加application/wasm wasm;
,这样nginx才能返回适当的头,浏览器才能识别出wasm
文件。
一切做好之后,我们可以通过浏览器访问index.html
文件,正常的话就能够在浏览器的console
面板看到Hello, WebAssembly
的输出了。
测试
安装wasmbrowsertest
。
go get github.com/agnivade/wasmbrowsertest
然后运行GOOS=js GOARCH=wasm go test -exec="$GOPATH/bin/wasmbrowsertest"
。
与DOM交互
可以使用包syscall/js
,https://godoc.org/syscall/js
这个包还是实验性的,所以随时都有可能会有变更。
我们这里用获取和设置div
内容来测试一下。
在上面hello world
的html文件body
里面加几个div
:
<div id="id1">test web assembly</div>
<div id="id2"></div>
<div id="id3"></div>
main.go
:
package main
import (
"fmt"
"syscall/js"
)
func main() {
fmt.Println("Hello, WebAssembly")
s := js.Global().Get("document").Call("getElementById", "id1").Get("innerHTML").String()
fmt.Println(s);
js.Global().Get("document").Call("getElementById", "id2").Set("innerHTML", "这里是go写入的文本")
js.Global().Get("document").Call("getElementById", "id3").Set("innerHTML", js.ValueOf("这里是go写入的文本2222"))
}
用get
和set
方法可以分别设置js对象的属性。
还有一些第三方的ui库,可以查看:https://github.com/golang/go/wiki/WebAssembly#interacting-with-the-dom
调试
目前WebAssembly
还不支持任何调试器,所以可以通过println()
函数把信息打印到浏览器console
方式了达成。
更多go关于WebAssembly
的示例,可以参考:https://github.com/golang/go/wiki/WebAssembly#further-examples
本文链接:https://360us.net/article/69.html