Skip to content

1. 什么是WebAssembly

WebAssembly 或者 wasm 是一个可移植、体积小、加载快并且兼容 Web 的全新格式。即像Java的一样的类虚拟机,任何语言都可以编译为wasm,并运行在浏览器或者web环境中。

2. 入门Demo

2.1. 本机环境

  • windows11
  • golang1.20.1
  • goland2023.3.2

2.2. 工程目录结构

html/
  -- index.html
  -- wasm.js
server/
  -- main.go
main.go
README.md

2.3. golang demo

工程根目录新建文件main.go,填入如下内容:

package main

import "fmt"

func main() {
    fmt.Println("Hello, WebAssembly!")
}

2.4. 编译代码

go env -w GOOS=js  
go env -w GOARCH=wasm
go build -o main.wasm

注:windows在设置环境变量出现如下错误:

PS E:\2project\golang\001\wasmg-go> go env -w GOOS=js
go: unsupported GOOS/GOARCH pair js/amd64

请将终端编辑器更换成:cmd, 执行如下切换编译环境

set GOOS=js
set GOARCH=wasm

3. 新建Web服务器

3.1. 复制wasm.js

注意:测试时请从golang安装目录复制JS
从 golang安装目录/misc/wasm/wasm_exec.js 复制到 工程目录/html中

3.2. 新建index.html

<!DOCTYPE html>  
<html lang="zh">  
<head>
    <meta charset="UTF-8">  
    <title>WebAssembly学习</title>  
    <script src="./wasm_exec.js"></script>  
    <script>
		const go = new Go();  
        WebAssembly.instantiateStreaming(fetch("test.wasm"), go.importObject).then((result) => {
            go.run(result.instance);
        });
    </script>  
</head>  
<body>  
测试golang的WebAssembly  
</body>  
</html>

3.3. 新建server/main.go服务

package main  
  
import (  
    "fmt"  
    "log"    
    "net/http"
)  
  
const dir = "./html"  
  
func main() {  
    fs := http.FileServer(http.Dir(dir))  
    log.Print("Serving " + dir + " on http://localhost:8082")  
    err := http.ListenAndServe(":8082", fs)  
    if err != nil {  
       fmt.Println("Failed to start server", err)  
       return  
    }  
}

3.4. 启动Web服务

浏览器访问:http://localhost:8082 F12打开调试模式,控制台输出: Hello, WebAssembly! 就成功了

4. 建立一个带方法的wasm

4.1. 改写main.go带方法

package main  
  
import (  
    "fmt"  
    "syscall/js")  
  
func add(this js.Value, args []js.Value) interface{} {  
    fmt.Println("接收的参数", args)  
    a := args[0].Int()  
    b := args[1].Int()  
    return js.ValueOf(a + b)  
}  
  
func main() {  
    fmt.Println("func add初始化成功......")  
    js.Global().Set("add", js.FuncOf(add))  
    select {}  
}

编译为add.wasm

go build -o html/add.wasm main.go

4.2. 建立add.html

<!DOCTYPE html>  
<html lang="zh">  
<head>  
    <meta charset="UTF-8">  
    <title>WebAssembly学习</title>  
    <script src="./wasm_exec.js"></script>  
    <script>        const main = async () => {  
            const go = new Go()  
            const importObject = go.importObject  
            const { instance } = await WebAssembly.instantiateStreaming(  
                fetch('add.wasm'),  
                importObject  
            )  
            go.run(instance)  
            const add = new Function('a', 'b', 'return add(a, b);')  
            let add1 = add(3, 3)  
            console.log("加结果", add1)  
        }  
  
        main()  
    </script>  
</head>  
<body>  
测试golang的WebAssembly  
</body>  
</html>

4.3. 运行测试

成功。。。
可以通过Wasm做很多事了哦,比如获取本机唯一ID, 适用于企业强客户端场景等。

最后更新:

个人博客记录个人技术, 管理相关