分享

Go WebAssembly 入门(一)

 F2967527 2020-02-21

有关WebAssembly的介绍可以参考 几张图让你看懂WebAssembly
简单来说WebAssembly就是将其他语言C/Go/Rust等语言编译成wasm可执行二进制文件,浏览器来执行wasm。wasm相比JS,拥有体积更小,执行更快,因为最终编译成二进制文件,所以一些安全策略代码也更适合wasm。
经过尝试C和Go分别编写WebAssembly,相较而言我认为Go无论从语言层面还是工具链,用起来都更加方便一些。
本文使用原生go build,生成的wasm文件大约在1.4M左右,在生产环境中这个体积是很大的,优化go的wasm体积可以使用tinygo来build,同样的代码使用tinygo构建之后约为22K,甚至比C语言构建wasm的体积还要小(C语言 build后约为44K,不同版本不同环境可能略有差异)。参考https:///

本文介绍Go WebAssembly入门,前提已经安装Go 1.11及以上版本。
系列文章 Go WebAssembly 入门(二)

Getting Started

编辑main.go

package mainimport 'fmt'func main() { fmt.Println('Hello, Go WebAssembly!')}

把main.go build成WebAssembly(简写为wasm)二进制文件

GOOS=js GOARCH=wasm go build -o lib.wasm main.go

把JavaScript依赖拷贝到当前路径

cp '$(go env GOROOT)/misc/wasm/wasm_exec.js' .

创建一个index.html文件,并引入wasm_exec.js文件,调用刚才build的lib.wasm

<html>    <head>        <meta charset='utf-8'>        <script src='wasm_exec.js'></script>        <script>            const go = new Go();            WebAssembly.instantiateStreaming(fetch('lib.wasm'), go.importObject).then((result) => {                go.run(result.instance);            });        </script>    </head>    <body></body></html>

创建server.go监听8080端口,serve当前路径

package mainimport ( 'flag' 'log' 'net/http')var ( listen = flag.String('listen', ':8080', 'listen address') dir = flag.String('dir', '.', 'directory to serve'))func main() { flag.Parse() log.Printf('listening on %q...', *listen) err := http.ListenAndServe(*listen, http.FileServer(http.Dir(*dir))) log.Fatalln(err)}

启动服务

go run server.go

在浏览器访问localhost:8080,打开浏览器console,就可以看到输出Hello, Go WebAssembly!

系列文章 Go WebAssembly 入门(二)

reference

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多