【Golang】在TinyGo中使用WebAssembly.instantiate()时,导入#0模块=”wasi_snapshot_preview1″时出现错误:模块不是一个对象或函数

使用Docker中的TinyGo进行疲劳编译。

当使用TinyGo的Docker映像tinygo/tinygo:latest构建和执行WebAssembly二进制文件(wasm)时,在浏览器的开发者工具控制台上会显示”wasi_snapshot_preview1″错误。

控制台日志
WebAssembly.instantiate(): Import #0 module=”wasi_snapshot_preview1″ error: module is not an object or function

虽然我知道没有wasi_snapshot_preview1模块,但我不太理解。

但是在 TinyGo 编译器之外,使用 Go 的标准编译器将其编译为 wasm 也是可以运行的。

想要通过搜索「WebAssembly.instantiate(): Import #0 module= “wasi_snapshot_preview1” error: module is not an object or function」获得有关 Golang 的赞助商信息,但搜索结果中只有有关 node.js 的内容。

在查看TinyGo官方的”wasi_snapshot_preview1″问题时,并没有太多与之相关的信息,反而更多的是关于”wasi_unstable”的内容。那应该怎么办呢?

简而言之,今北產業。

    1. 原因

您所使用的wasm_exec.js与编译器不兼容。

対策

请使用与您所使用的编译器提供的wasm_exec.js相对应的版本。
如果是Go编译器,请不要从Go的主代码分支中获取wasm_exec.js。
wasm_exec.js的位置如下:
如果是Go编译器:
$(go env GOROOT)/misc/wasm/wasm_exec.js
如果是TinyGo编译器:
/usr/local/tinygo/targets/wasm_exec.js

劝君莫玩(快玩刷刷)。

wasm_exec.js は *.wasm バイナリと Javascript の関数を紐づけるスクリプトです。コンパイラが異なるとバイナリも異なり、モジュールの紐付けができなくなります。(モジュールが見つからなくなります)
利用中のコンパイラで提供している wasm_exec.js を使うこと

can’t run wasm module in browser: LinkError: WebAssembly Instantiation | Issue #29827 | Go | Golang @ GitHub

TinyGo の Docker を使う場合は wasm_exec.js も実行環境にコピーするのを忘れないように

Building | Using WebAssembly | Guides | Docs @ TinyGo.org


儿感受到(1号正妻的公式文件被新娘责备)。

「Go で wasm が動くとわっ!Hello, world! で喜びましたが、その喜びは一瞬でした。私の性格がせっかちなので、次の基本を飛ばして「これまで作ったアプリを wasm 化しましょう!」と思ったものの、テストが思うように動かず困っています。わざと失敗させるエラーも見逃してしまっています。」

阅读了一篇名为「在Golang中使用最佳实践的wasm」的文章,其中提到了「将wasm文件使用gzip压缩对浏览器(网络)更友好,但如果使用TinyGo,文件会变得更小」的内容。

    “Best Practices for WebAssembly using GoLang (1.15+)” | GitConnected @ Medium

我确实在网上冲浪时看到过一些类似的东西。然而,由于我没有仔细阅读官方文件而凭自己的想法行动,所以有些东西在我动了也不会动。官方文件上有明确的说明。

既然会忘记,所以作为未来自己的搜索依据,我会把备忘录存放在Qiita上。

广告
将在 10 秒后关闭
bannerAds