WebAssembly 可以将其他语言C/Go/Rust等语言编译成wasm可执行二进制文件,然后通过浏览器来执行wasm。
本文以 Go 语言为例,介绍 WebAssembly 入门。
1、编写 main.go 文件,在 Go 代码中获取js对象,执行 js 代码。
引入syscall/js
, 通过js.Global().Get()获取js对象。
js.Global().Get()
既可以获取函数、也可以获取DOM元素。类型是js.Value。
如:js.Global().Get(“alert”)
package main
import (
"fmt"
"syscall/js"
)
func main() {
fmt.Println("Hello, Go WebAssembly!")
alert := js.Global().Get("alert")
alert.Invoke("Hello, Go WebAssembly!")
}
2、把 main.go 构建成wasm二进制文件
GOOS=js GOARCH=wasm go build -o lib.wasm main.go
3、把JavaScript依赖拷贝到当前路径
cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" .
4、创建index.html,并引入wasm_exec.js,调用第二步构建的lib.wasm
<html>
<head>
<meta charset="utf-8">
<script src="wasm_exec.js">script>
<script>
const go = new Go();
WebAssembly.instantiateStreaming(fetch("lib.wasm"), go.importObject).then((result) => {
go.run(result.instance);
});
script>
head>
<body>
body>
html>
5、创建 server.go 监听8080端口,serve当前路径
package main
import (
"net/http"
"log"
)
func main() {
err := http.ListenAndServe(":8080", http.FileServer(http.Dir(".")))
log.Fatalln(err)
}
6、启动服务
go run server.go
浏览器访问http://localhost:8080
。
我们可以看到,浏览器控制台打印的有 fmt.Println("Hello, Go WebAssembly!")
输出结果。并且页面弹出了go调用alert的弹窗。