美文网首页Web前端之路
2020 zig go webassembly (1)

2020 zig go webassembly (1)

作者: zidea | 来源:发表于2020-05-14 20:32 被阅读0次
go_webassembly.jpeg

想写一个自己框架,去年这个时候我就筹备,不过因为种种原因还是放弃了,主要是当时的实力还是不足,随着学习了一段时间,学习了 go 和 rust 这些底层语言,让我们多计算机和语言设计有一定高度认识,回头再看 javascript ,有了新的感觉。

上一次说过了 zig 中 g 代表了 go,希望 zig 称为一个在 web 端支持 3D 渲染的框架,因为 react 和 vue 他们已经把 javascript 框架玩到极致,javascript 框架已经固化,没有任何缝隙能够进入这个角逐场。

既然无力与其争夺一席之地,就需要借助外力,go 和 rust 随即登场。

package main
import "fmt"
func main(){
  fmt.Println("hellow wasm")
}

我们项目最好在 go 的 src 文件夹下创建一个项目文件夹,写好了上面代码我们就可以使用下面命令进行编译出 wasm

GOOS=js GOARCH=wasm go build -o test.wasm

然后在 go 安装目录下/misc/wasm/ 目录下,创建一个 test 然后把生成的 test.wasm 放置到这个创建好的 test 文件夹下,并且将 wasm_exec.js 复制到 test 文件夹下。接下来就写我们的 html 文件

005.JPG
<html>
    <head>
        <meta charset="utf-8"/>
        <script src="wasm_exec.js"></script>
        <script src="index.js"></script>
    </head>
    <body>
        <div></div>
    </body>
</html>

在 index.js 中,将 test.wasm 读取,使用 instantiateStreaming 加载 wasm 文件,加载完成后会回调函数 result 得到 wasm 内容,然后用 go 的 run 来运行我们上面写 go 编译字节码的 wasm 文件,

const go = new Go();
WebAssembly.instantiateStreaming(fetch("test.wasm"), go.importObject).then((result) => {
    go.run(result.instance);
});

这的注意的是我开始用 nodejs 写了一个服务启动时,会报一个 wasm/application 的错误,需要我们用 go 写一个服务器加载静态页面。下面写一个比较复杂的例子。

package main

import (
    "fmt"
    "syscall/js"
)

func add(a, b int) int {
    return a + b
}

func foo(this js.Value, args []js.Value) interface{} {
    fmt.Println("hellow wasm")
    fmt.Println(args)
    return nil

}

func main() {
    js.Global().Set("foo", js.FuncOf(foo))
    js.Global().Set("value", 100)
    select {}
}

上面代码也不算复杂,估计大家一看就懂,我们 js.Global 也就是 window 对象上挂载全局方法和变量,this js.Value, args []js.Value便于我们在 js 调用 go 方法传入参数。

006.JPG

相关文章

网友评论

    本文标题:2020 zig go webassembly (1)

    本文链接:https://www.haomeiwen.com/subject/dcutohtx.html