golang语言中wasm|golang语言中wasm 环境搭建的过程详解
golang 安装
通过官方地址 下载。MacOS 也可通过 brew
快速安装:
$ brew install golang$ go versiongo version go1.17.2 darwin/arm64
golang 环境测试 新建文件 main.go ,写入:
package mainimport "fmt"func main() {fmt.Println("Hello World!")}
执行 go run main.go ,将输出:
$ go run main.go如果启用了 GO MODULES ,则需要使用 go mode init 初始化模块,或设置 GO111MODULE=auto 。
Hello World!
将 golang 打包为 WASM 通常有两种打包方式,一种是 golang 自带的,另外是使用 tinygo 。推荐使用 tinygo ,因为编译出的 wasm 模块更小。
- 使用 golang 原生编译
// 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 编译
$ 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 文件,并写入以下代码:
Document - 锐客网
最后,起一个 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 起的服务,加载会报错:
【golang语言中wasm|golang语言中wasm 环境搭建的过程详解】> 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 环境搭建的文章就介绍到这了,更多相关golang wasm 环境搭建内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 夜游宫|夜游宫 心语
- 跌跌撞撞奔向你|跌跌撞撞奔向你 第四章(你补英语,我补物理)
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 子龙老师语录
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 小学英语必考的10个知识点归纳,复习必备!
- 六步搭建ES6语法环境
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗