Как обслуживать файл WASM

#go

#Вперед

Вопрос:

У меня есть небольшая программа WASM, которую я хотел бы протестировать в своей частной локальной сети (в основном на мобильных устройствах). Я могу обслуживать его в локальном цикле. Я надеялся создать простой маршрут страницы в go, который будет обрабатывать WASM и обслуживать его на устройствах в моей сети. К сожалению, тип содержимого application / wasm не распознается (я думаю).

Есть ли простой способ обслуживать index.html что внедрило WASM?

Я не уверен, как изменить это, чтобы разрешить тип содержимого:

 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 %snn", port)
    http.ListenAndServe(":" port, nil)
}

  

Комментарии:

1. возможно, вам также следует опубликовать тег «webassembly»

2. @AJR нет, это не проблема с «webassembly»

Ответ №1:

Что это значит «index.html что внедрило WASM»?

Я полагаю, у вас есть отдельный файл WASM, расположенный где-то в вашей файловой системе. В документации go рекомендуется использовать файлы WASM, подобные этому:

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

итак, браузер при загрузке index.html также запрашивает у вашего веб main.wasm -сервера файл. Вы должны обработать это явно (добавьте этот вызов после вашего предыдущего вызова http.Функция обработки):

 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 файлы) является обслуживание каталога hole с ресурсами (обычно я помещаю все необходимые ресурсы в эту папку — 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 в папку assets.

Комментарии:

1. @jeffspicoli очень странно — я сделал то же самое неделю назад, и мой мобильный телефон хорошо работает с wasm. Возможно, браузер на вашем телефоне не поддерживает wasm? В любом случае — я согласен, что эта технология сейчас не идеальна, и я не рекомендую использовать ее в производстве. Например, файлы wasm слишком тяжелые (если вы не компилируете с помощью tinygo).