【问题标题】:How to bundle Go and its asset files into WASM?如何将 Go 及其资产文件捆绑到 WASM 中?
【发布时间】:2022-11-10 21:33:35
【问题描述】:

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

我怎样才能做到这一点?

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

编辑:最后我们尝试了https://pkg.go.dev/embed 提到的NobbyNobbs,它运行良好。

【问题讨论】:

  • 你试过embed吗?
  • 我刚刚尝试嵌入,它正在工作

标签: go webassembly


【解决方案1】:

如果您想捆绑任何类型的文件/目录带有编译代码(像二进制/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",
      "GlossList": {
        "GlossEntry": {
          "ID": "SGML",
          "SortAs": "SGML",
          "GlossTerm": "Standard Generalized Markup Language",
          "Acronym": "SGML",
          "Abbrev": "ISO 8879:1986",
          "GlossDef": {
            "para": "A meta-markup language, used to create markup languages such as DocBook.",
            "GlossSeeAlso": ["GML", "XML"]
          },
          "GlossSee": "markup"
        }
      }
    }
  }
}

而不是使用go run main.go 运行代码。 如果您将其编译为二进制文件json文件附带二进制代码 go build main.go

如果你把它编译到瓦斯姆,文件夹的行为方式相同 GOOS=js GOARCH=wasm go build -o main.wasm main.go

【讨论】:

  • 它可以工作,但是当编译为 wasm 时,我得到 ......gopkgmodgithub.comkarrickgodirwalk@v1.17.0 eaddir_unix.go:58:6: undefined: inoFromDirent 错误
  • 我们得到了同样的错误。
猜你喜欢
  • 1970-01-01
  • 2013-03-11
  • 2018-03-22
  • 2016-10-31
  • 2020-11-29
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多