Подтвердить что ты не робот

TypeError: Не удалось выполнить "компиляцию" в "WebAssembly": неверный тип ответа MIME. Ожидаемое "приложение /wasm"

Я пытаюсь загрузить файл .wasm, используя api fetch в Chrome, и обслуживая html файл, используя экспресс. Но Chrome не позволяет мне загрузить файл:

'Uncaught (в обещании) TypeError: Не удалось выполнить' compile 'в' WebAssembly ': неверный тип MIME ответа. Ожидаемое приложение /wasm.

Вот мои файлы:

/public/index.html

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <script type="text/javascript">
          WebAssembly.instantiateStreaming(fetch('http://localhost:3000/simple.wasm'))
      .then(obj => {
       console.log(obj.instance.exports.add(1, 2));  // "3"
      });
    </script>
  </body>
</html>

Обслуживается экспрессом:

/index.js

const express = require('express')
express.static.mime.define({'application/wasm': ['wasm']})
var app = express();

app.use('/', express.static('public'));

app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})

Могу ли я добавить новый тип MIME для выражения при обработке файла .wasm? Или позволить хрому принять это? Я понятия не имею, как это решить ^^

Смотрите: http://kripken.github.io/emscripten-site/docs/compiling/WebAssembly.html

Web server setup
To serve wasm in the most efficient way over the network, make sure your web server has the proper MIME time for .wasm files, which is application/wasm. That will allow streaming compilation, where the browser can start to compile code as it downloads.

In Apache, you can do this with

AddType application/wasm .wasm
Also make sure that gzip is enabled:

AddOutputFilterByType DEFLATE application/wasm

Спасибо всем!

4b9b3361

Ответ 1

Одним из возможных путей решения этой проблемы является использование instantiate() вместо instantiateStreaming(), поскольку первое не заботится о типах MIME (в то время как второе делает). Чтобы использовать instantiate():

async function fetchAndInstantiate() {
    const response = await fetch("http://localhost:3000/simple.wasm");
    const buffer = await response.arrayBuffer();
    const obj = await WebAssembly.instantiate(buffer);
    console.log(obj.instance.exports.add(1, 2));  // "3"
}

Ответ 2

Быстрый поиск дает мне этот ответ

express.static.mime.define({'application/octet-stream': ['csv']})

отсюда