2020 zig go webassembly (1)

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
在 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

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):