注:不是所有内容均原创,而是网文加上自己的学习和理解。
WebAssembly:简称wasm,加强JavaScript,下载后运行于本地设备上,不象JavaScript那样原代码解释运行,而是编译为二进制机器码。据说它是一种小体积(暂时看起来Go编译后的还不够小),高加载速度的二进制编码格式。
webassembly.org 将其定义为“基于堆栈的虚拟机的二进制指令格式”。从本质上讲,wasm是一种二进制格式; 就像ELF,Mach和PE一样。唯一的区别是它适用于虚拟编译目标,而不是实际的物理机器。
还是看网上专业点的解释:
我感觉就是利用它的跨平台性,高速,本地化运行,可以将更多需要本地资源的应用搞起来。
从多方面的信息来说,它似乎将成为一个趋势。学习也就成为必须。
go关于WebAssembly: https://github.com/golang/go/wiki/WebAssembly
syscall/js: https://tip.golang.org/pkg/syscall/js/
这两个资源需要认真学习一下。
Hello wasm World
- 首先直接复制一个Go和JS的“桥接器”,它本存在于Go中
cp “$(go env GOROOT)/misc/wasm/wasm_exec.js” .
JS代码有点多,我并没有细看。希望有地方可以看它对它的拆解。
- 在html中引入
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Go + WebAssembly</title>
<script src="wasm_exec.js"></script>
</head>
<body>
<canvas id='canvas'></canvas>
</body>
<script>
// 加载 wasm
const go = new Go();
WebAssembly.instantiateStreaming(fetch("lib.wasm"), go.importObject)
.then((result) => {
go.run(result.instance);
});
</script>
</html>
这也就是加载了此js,并添加了一个画板,引用将添加的lib.wasm文件。lib.wasm就是靠go代码编译的。
- Go文件
package main
func main() {
println("wasm app works")
}
代码很简单,然后编译:GOARCH=wasm GOOS=js go build -o lib.wasm main.go
操作系统为js,机器为wasm,输出为lib.wasm文件。其实我们平时使用GOOS=linux GOARCH=arm等。
- 访问
通过浏览器访问,我们将在调试控制台看到打印输出 wasm app works
为了访问html文件,我们一般建立一个web服务
package main
import (
"flag"
"log"
"net/http"
"strings"
)
var (
listen = flag.String("listen", ":8080", "listen address")
dir = flag.String("dir", ".", "directory to serve")
)
func main() {
flag.Parse()
log.Printf("listening on %q...", *listen)
log.Fatal(http.ListenAndServe(*listen, http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
if strings.HasSuffix(req.URL.Path, ".wasm") {
resp.Header().Set("content-type", "application/wasm")
}
http.FileServer(http.Dir(*dir)).ServeHTTP(resp, req)
})))
}
对于wasm文件,有指定的文件类型。