本篇文章为大家展示了golang语言中wasm 环境搭建的过程是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Golang 安装通过官方地址 下载。MacOS 也可通过 brew 快速安装:$
本篇文章为大家展示了golang语言中wasm 环境搭建的过程是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
通过官方地址 下载。MacOS 也可通过 brew
快速安装:
$ brew install golang$ go versiongo version go1.17.2 darwin/arm64
新建文件 main.go ,写入:
package mainimport "fmt"func main() { fmt.Println("Hello World!")}
执行 go run main.go ,将输出:
$ go run main.go
Hello World!
如果启用了 GO MODULES ,则需要使用 go mode init 初始化模块,或设置 GO111MODULE=auto 。
通常有两种打包方式,一种是 golang 自带的,另外是使用 tinygo 。推荐使用 tinygo ,因为编译出的 wasm 模块更小。
使用 golang 原生编译
在编译 wasm 模块前,需要设置 golang 交叉编译参数,目标系统 GOOS=js 和目标架构 GOARCH=wasm ,编译 wasm 模块:
// macos$ GOOS=js GOARCH=wasm go build -o main.wasm// windows 临时设置 golang 环境参数(仅作用于当前CMD)$ set GOOS=js $ set GOARCH=wasm$ go build -o main.wasm
使用 tinygo 编译
直接按照官方文档安装即可,MacOS 如下:
$ brew tap tinygo-org/tools$ brew install tinygo$ tinygo versiontinygo version 0.20.0 darwin/amd64 (using go version go1.17.2 and LLVM version 11.0.0)
使用以下命令对 main.go 再次进行打包:
$ tinygo build -o main-tiny.wasm
打包文件大小对比
$ du -sh ./*.wasm228K ./main-tiny.wasm1.9M ./main.wasm
要想在浏览器中跑 main.wasm ,首先需要 JS 胶水代码,golang 已经为我们提供了,直接复制过来。需要注意的是,使用 tinygo 和 原生编译的胶水代码是有差异的,根据具体情况拷贝对应的:
// 原生编译$ cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" .// tinygo编译$ cp "$(tinygo env TINYGOROOT)/targets/wasm_exec.js" ./wasm_exec_tiny.js
其次,需要一个 html 入口文件,创建 index.html 文件,并写入以下代码:
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta Http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./wasm_exec_tiny.js"></script></head><body> <script> const go = new Go(); // wasm_exec.js 中的定义 WEBAssembly.instantiateStreaming(fetch('./main-tiny.wasm'), go.importObject) .then(res => { go.run(res.instance); // 执行 go main 方法 }); </script></body></html>
最后,起一个 http server 让它跑起来吧~
// python$ python3 -m http.server$ Python2 -m Simplehttpserver// node$ npm i -g http-server$ hs// gp$ go get -u GitHub.com/shurcooL/goexec$ goexec 'http.ListenAndServe(`:8080`, http.FileServer(http.Dir(`.`)))'
通过 node 的 http-server 起的服务,加载会报错:
> TypeError: Failed to execute 'compile' on 'WebAssembly': Incorrect response MIME type. Expected 'application/wasm'.
原因是 wasm 文件响应头的 content-type 为 application/wasm; charset=utf-8 ,应该为 application/wasm 。已知的解决方法为修改 HTML 中 wasm 的初始化方式为:
fetch('./main-tiny.wasm') .then(res => res.arrayBuffer()) .then(buffer => { WebAssembly.instantiate(buffer, go.importObject) .then(res => { go.run(res.instance); }) })
上述内容就是golang语言中wasm 环境搭建的过程是怎样的,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网GO频道。
--结束END--
本文标题: golang语言中wasm 环境搭建的过程是怎样的
本文链接: https://www.lsjlt.com/news/305220.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-05
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0