如何提供WASM文件

时间:2020-10-06 21:29:54

标签: go

我有一个小的WASM程序,我想在我的专用LAN(主要是移动设备)上进行测试。我可以在本地环回中提供服务。我希望在go中创建一个简单的页面路由,该页面路由可以处理WASM并将其提供给网络上的设备。不幸的是,应用程序/ wasm内容类型无法识别(我认为)。

是否有一种简单的方法来提供嵌入WASM的index.html?

我不确定如何修改它以允许使用Content-Type:

package main

import (
    "io/ioutil"
    "log"
    "net/http"
    "os"
)

func main() {
    port := os.Getenv("PORT")
    if port == "" {
    port = "5000"
    }

    f, _ := os.Create("/var/log/golang/golang-server.log")
    defer f.Close()
    log.SetOutput(f)

    const indexPage = "public/index.html"
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        log.Printf("Serving %s to %s...\n", indexPage, r.RemoteAddr)
        http.ServeFile(w, r, indexPage)
    })

    log.Printf("Listening on port %s\n\n", port)
    http.ListenAndServe(":"+port, nil)
}

1 个答案:

答案 0 :(得分:0)

“嵌入WASM的index.html”是什么意思?

我想您有一个单独的WASM文件,位于文件系统中的某个位置。 在go文档中,建议使用WASM文件,如下所示:

WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject).
    then((result) => {
            go.run(result.instance);
    });

因此,浏览器在加载index.html时也会向您的网络服务器询问main.wasm文件。您必须明确处理它(在上次调用http.HandleFunc之后添加此调用):

http.HandleFunc("/main.wasm", func(w http.ResponseWriter, r *http.Request) {
    log.Printf("Serving WASM to %s...\n", r.RemoteAddr)
    http.ServeFile(w, r, "path/to/wasm/file")
})

但是,提供静态内容(包括.wasm文件)的更简单方法是使用资产提供漏洞目录(通常我将所有必需的资源放入此文件夹-js,css,图像等):

http.Handle(
    "/assets/", 
    http.StripPrefix("/assets/", http.FileServer(http.Dir("path/to/assets/folder")))
)

在这种情况下,将JavaScript代码instantiateStreaming(fetch("main.wasm"), go.importObject)替换为instantiateStreaming(fetch("/assets/main.wasm"), go.importObject),然后将wasm文件放入资产文件夹中。