(Tiny)转到 WebAssembly
你好世界
Tiny Go
地鼠不仅长得可爱,而且力气也很大。

Golang 在语法上与 C 类似,但具有内存安全性、垃圾收集和 CSP 风格的并发性。 -维基百科
我们可以将 Go 编译成WebAssembly。这意味着我们可以用 Golang 编写通道并在浏览器上运行它们。
Golang 中的 WebAssembly 仍处于早期阶段。🦄
Golang 编写非常简单。因此,只要现有应用程序不包含任何 WebAssembly 在运行时无法使用的文件路径或系统级功能,就可以很容易地将其直接编译为 WebAssembly 模块。
你好世界
创建一个名为 的文件夹,go-wasm
其中包含子文件夹out
和go
;
go-wasm/
|__ out/
|__ go/
main.go
在文件夹内建立一个名为的文件go
并输入以下内容:
package main
func main() {
println("Hello World!!!")
}
使用 运行 go 文件go run go/main.go
。这将打印Hello World
。是不是很简单?
现在我们可以将其编译成 WebAssembly 模块并作为 WebAssembly 运行。
GOOS=js GOARCH=wasm go build -o out/main.wasm go/main.go
main.wasm
这将在文件夹内生成out
。与 Rust 不同,Golang 不会生成任何绑定文件。我们可以使用 TinyGo 官方仓库中提供的绑定文件。
下载文件并将其移动到out
目录内。
index.html
在目录内创建一个文件out
并添加以下内容:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Go wasm</title>
</head>
<body>
<script src="wasm_exec.js"></script>
<script>
const go = new Go();
WebAssembly.instantiateStreaming(fetch('main.wasm'),go.importObject).then( res=> {
go.run(res.instance)
})
</script>
</body>
</html>
该文件会index.html
加载wasm_exec.js
。请注意,此文件适用于浏览器和 NodeJS 环境。它会导出一个Go
对象。
然后我们添加一个本地脚本。在脚本中我们执行以下操作:
Go
从实例化wasm_exec.js
。- 使用instantiateStreaming获取 WebAssembly 模块
从文件夹运行本地服务器以查看Hello World
。
等等,我们正在写 Golang 代码。用 Golang 写一个简单的 Web 服务器相当容易。那就让我们来写一个吧。
webServer.go
在根目录中创建一个名为的文件,其内容如下。
package main
import (
"log"
"net/http"
"strings"
)
const dir = "./out"
func main() {
fs := http.FileServer(http.Dir(dir))
log.Print("Serving " + dir + " on http://localhost:8080")
http.ListenAndServe(":8080", http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
resp.Header().Add("Cache-Control", "no-cache")
if strings.HasSuffix(req.URL.Path, ".wasm") {
resp.Header().Set("content-type", "application/wasm")
}
fs.ServeHTTP(resp, req)
}))
}
这将为文件夹内的文件提供服务out
。现在使用 运行服务器go run webServer.go
。🎉 是不是很简单?
前往http://localhost:8080
并打开控制台来查看精彩内容Hello World
。
目录结构应如下所示。
├── go
│ └── main.go
└── out
├── index.html
├── wasm_exec.js
└── main.wasm
注意生成的 WebAssembly 模块的文件大小非常重要。仅仅一个 Hello World 代码就高达 1.3MB。这可真是个大工程啊。
-rw-r--r-- 1 sendilkumar staff 482B Jul 5 23:20 index.html
-rwxr-xr-x 1 sendilkumar staff 1.3M Jul 5 23:19 main.wasm
-rw-r--r-- 1 sendilkumar staff 13K Jul 5 23:18 wasm_exec.js
WebAssembly 可能提供的任何性能,如果模块很大,则不需要它。
别担心,我们有 Teeny TinyGO。
Tiny Go
TinyGo 是一个旨在将 Golang 引入微控制器和现代 Web 浏览器的项目。他们拥有一个基于 LLVM 进行编译的全新编译器。使用 TinyGo,我们可以生成经过优化、可在芯片上执行的极简库。
在此处查看如何安装 TinyGo 。
安装完成后,您可以使用 TinyGo 编译任何 Golang 代码。我们可以使用以下命令将 Golang 编译为 WebAssembly 模块。
tinygo build -o out/main.wasm -target wasm ./go/main.go
现在转到浏览器并刷新页面即可看到Hello World
仍然打印的内容。
最重要的是生成的 WebAssembly 模块只有 3.8K 🎉 🎉 🎉
-rw-r--r-- 1 sendilkumar staff 482B Jul 5 23:20 index.html
-rwxr-xr-x 1 sendilkumar staff 3.8K Jul 5 23:29 main.wasm
-rw-r--r-- 1 sendilkumar staff 13K Jul 5 23:18 wasm_exec.js
由于底层使用了 LLVM,我们可以使用该-opt
标志进一步调整它。最大尺寸优化是通过 -opt=z 标志获得的,并且TinyGo
默认使用该标志。因为这些微型设备的内存有限。
敬请期待下篇文章,让我们使用 TinyGo 和 WebAssembly 重新创建经典的 Dev 离线页面。
希望以上内容能激励你开启精彩的 WebAssembly 之旅。如果你有任何问题/建议,或者觉得我遗漏了什么,欢迎随时留言。
您可以在Twitter上关注我。
如果你喜欢这篇文章,请点赞或者留言。❤️
鏂囩珷鏉ユ簮锛�https://dev.to/sendilkumarn/tiny-go-to-web assembly-5168