如何将Go语言及其资产文件捆绑到WASM中?

6vl6ewon  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(110)

我有一个Go程序,它使用一些json文件(比如15)来存储数据。我想把它编译成一个WebAssembly文件。
我该怎么做?
注意:我知道我可以将这些json值从我的JS代码传递给WASM,但是如果我可以有效地将它们与WASM捆绑在一起,我不希望这样做。
编辑:最后,我们尝试了https://pkg.go.dev/embed,正如NobbyNobbs提到的,它的工作完美。

iszxjhcz

iszxjhcz1#

如果你想把任何类型的文件/目录与编译后的代码捆绑在一起(* 比如binary/wasm*),有一个很棒的Golang库packr。它很容易使用,当你把源代码编译成二进制或webassembly时,packr会加载文件/目录,并像以前一样工作。
这里我在项目的根目录中使用***main.go***。和一个存储json数据的目录(如***/jsondata/mydata.json***)

主.开始

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/我的数据.json

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

而不是运行使用go run main.go的代码。如果您将其编译为二进制,json***文件将附带二进制代码go build main.go
如果您将其编译为***wasm
,则该文件夹的行为将与GOOS=js GOARCH=wasm go build -o main.wasm main.go相同

第二种方法(使用“embed”)

使用标准库中embed库。
这里我使用***main.go在项目的根目录中。并在同一目录中创建一个文件(如/sample.json***)

主.开始

package main

import (
  "embed"
)

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

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

}

/示例.json

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

而不是运行使用go run main.go的代码。如果您将其编译为二进制,json***文件将附带二进制代码go build main.go
如果您将其编译为***wasm
,则该文件夹的行为将与GOOS=js GOARCH=wasm go build -o main.wasm main.go相同

相关问题