go - 如何将 Go 及其 Assets 文件捆绑到 WASM 中?

标签 go webassembly

我有一个 Go 程序,它使用一些 json 文件(如 15)作为数据。我想把它编译成一个 WebAssembly 文件。

我该怎么做?

注意:我知道我可以将那些 json 值从我的 JS 代码传递到 WASM,但如果我可以有效地将它们与 WASM 捆绑在一起,我不希望这样做。

编辑:最后我们尝试了 https://pkg.go.dev/embed作为NobbyNobbs提到过,并且运行良好。

最佳答案

如果您想将任何类型的文件/目录 与编译代码(如binary/wasm)捆绑在一起,有一个很棒的Golang 库packr .它易于使用,当您将源代码编译为二进制或 webassembly packr 时,它会加载文件/目录并以与以前相同的方式工作。

这里我使用的是项目根目录下的main.go。和存储 json 数据的目录(如 /jsondata/mydata.json)

main.go

package main

import (
    "fmt"

    "github.com/gobuffalo/packr/v2"
)

func main() {
    box := packr.New("myBox", "./jsondata")

    s, err := box.FindString("mydata.json")
    if err != nil {
        fmt.Println("🚀 ~ file: main.go ~ line 14 ~ funcmain ~ err : ", err)
    }
    fmt.Println(s)

}

/jsondata/mydata.json

{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
        "title": "S"
        }
    }
}

使用 go run main.go 运行代码。 如果您将其编译为二进制文件,json 文件随二进制代码一起提供 go 构建 main.go

如果您将其编译为 wasm ,该文件夹将以相同的方式运行 GOOS=js GOARCH=wasm go build -o main.wasm main.go

第二种方法(使用“嵌入”)

使用标准库中的embed库。

这里我使用的是项目根目录下的main.go。并在同一目录中创建文件(如 /sample.json)

main.go

package main

import (
  "embed"
)

//go:embed sample.json
var f embed.FS

func main(){
data, _ := f.ReadFile("sample.json")
print(string(data))

}

/sample.json

{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
        "title": "S"
        }
    }
}

使用 go run main.go 运行代码。 如果您将其编译为二进制文件,json 文件随二进制代码一起提供 go 构建 main.go

如果您将其编译为 wasm ,该文件夹将以相同的方式运行 GOOS=js GOARCH=wasm go build -o main.wasm main.go

关于go - 如何将 Go 及其 Assets 文件捆绑到 WASM 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74113979/

相关文章:

ssh - 将 ssh 公钥复制到服务器

go - 如何使用 golang 在本地主机系统中创建临时目录

go - 为什么 Go 中的包级别不允许短变量声明?

linux - 这是一个有效的 Go 路径配置吗?

c++ - Emscripten - cmake - 在 CMakeList 文件中传递 emscripten 选项

javascript - Web Worker 使用 Web Assembly 时出错

html - 如何在 Go 服务器上运行 html

azure-functions - 在我的 UNO WASM 项目中,HTTP POST 调用在我的本地 Azure Functions 上变成了 HTTP OPTIONS

javascript - 将 C 编译为 wasm,使用与 WasmFiddle 相同的设置

javascript - 为什么asm.js比普通js(素数生成)慢?如何加快速度?