登录
首页 >  Golang >  Go问答

如何提供 WASM 文件

来源:stackoverflow

时间:2024-03-16 22:21:27 297浏览 收藏

想要在私人局域网上测试小型 WASM 程序,但遇到了应用程序/wasm 内容类型无法识别的困扰。如何创建一个简单的页面路由来处理和提供 WASM,以便在网络上的移动设备上访问?

问题内容

我有一个小型 wasm 程序,我想在我的私人 lan(主要是移动设备)上测试它。我能够在本地环回上提供它。我希望在 go 中创建一个简单的页面路由来处理 wasm 并将其提供给我网络上的设备。不幸的是,应用程序/wasm 内容类型无法识别(我认为)。

是否有一种简单的方法来服务嵌入了 wasm 的index.html?

我不知道如何修改它以允许内容类型:

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)
}

解决方案


“嵌入了 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 文件进入资产文件夹。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>