Featured image of post 使用 TinyGo 編譯體積更小的 Wasm

使用 TinyGo 編譯體積更小的 Wasm

配上 Docker 達至無痛編譯。

TinyGo 是一款可以直接把 Go 軟體編譯成體積更小的編譯器,通常會使用在一些崁入式裝置(如 Arduino、Raspberry Pi 等)或者是今天想分享的 Wasm (WebAssembly)。

與 Go 的分別

其實在 Go 中原生已經支援編譯 Wasm,但是由於本身體積比較大,如果在前端上的載入速度會比較慢,使用了 TinyGo 所編譯後的 Wasm 檔案大小從 3.8 Mb 下降至了 2 Mb(接近 50%),效果十分明顯。

目前 TinyGo 還是會有一些不支援的 Go 原生 package,另外我在使用上,也遇到了一些 math/big 上的支援問題,因此需要特別留意。

編譯 Wasm

  1. 確保已完成安裝 Go
  2. 安裝 TinyGo
  3. 執行 tinygo build -o main.wasm -target=wasm ./main.go

錯誤排除(已更新)

由於 TinyGo 版本不會隨同 Go 即時更新,因此如果在 Go 推出新版本時而 TinyGo 未能及時更新,將會出現無法使用的情況。例如會出現以下錯誤:

error: could not read version from GOROOT (/usr/local/go): Invalid go version output:

詳見:GitHub: tinygo issue #433

在 Docker 環境無痛編譯

雖然有不少方法能夠讓系統同時安裝兩個或以上版本的 Go,但對於部份有「潔癖」的人來說這不是一個好的選擇,因此可以使用 TinyGo 官方提供的 Docker 映像檔,讓你的專案在 Docker 中直接編譯。

在 TinyGo 官網有一些執行 Docker 編譯的指令例子,但由於那是針對 example 環境的,因此如果想編譯自己的專案時,需要作出一些修改,如加入 -w 修改 Workspace 的路徑。例子:

docker run --rm \
    -v $(pwd):/src \
    -w="/src" \
    tinygo/tinygo:0.19.0 \
    tinygo build -o main.wasm -target=wasm /src/main.go
倪任爾 Ngai Yam Yi / CC BY-NC-SA 4.0