私はこのチュートリアルを取得しようとしています(ここ: https://www.hellorust.com/demos/add/index.html )が機能し、私が何をしても、取得できませんWebAssembly MDNは、正しく機能するための関数を予約しました。
それで、上のリンクの指示に従って、_add.wasm
_ファイルを取得しました。私の知る限り、これはかなりシンプルで機能するはずです。少し掘り下げた後、最新のWebAssemblyモジュールがストリーミングをインスタンス化することであることがわかりました-そのドキュメントはここにあります:( https://developer.mozilla.org/en-US/docs/WebAssembly/Using_the_JavaScript_API )。
MDNの例では、次のようにしています。
_var importObject = {
imports: { imported_func: arg => console.log(arg) }
};
_
その後
_WebAssembly.instantiateStreaming(fetch('simple.wasm'), importObject)
.then(obj => obj.instance.exports.exported_func());
_
MDNによれば、importObjectはネストされた引数をラップ解除することです。奇妙ですが、大丈夫です。
これをできるだけ簡単にするために、同じディレクトリにインポートする_add.wasm
_ファイルとjs
ファイルを配置してから、([〜 #〜] note [〜#〜]:私はVue.jsを使用していますが、SPAのようなライブラリに精通している人にとっては、これは似ているはずです):
_window.WebAssembly.instantiateStreaming(fetch('./add.wasm', {
headers: {
"Content-Type": "application/wasm",
},
}), importObject)
.then(obj => {
console.log('inside return obj from WebAssembly initiateStreaming')
obj => obj.instance.exports.exported_func()
})
.catch(error=>{
console.log('there was some error; ', error)
});
_
私が返すエラーは:
_there was some error; TypeError: "Response has unsupported MIME type"
_
fetch(add.wasm)
を使用し、_window.
_をドロップし、importObject
を完全にドロップし、単純なロギングobj
をコンソールにフェッチして、ヘッダーをフェッチリクエストに追加しないようにしました。何も動作していないようです。
_application/wasm
_フィールドが広くサポートされていない場合、どういうわけかwebpackに追加する必要があるかもしれませんが、確信が持てず、オンラインで例を見たこともありません。
これを機能させる方法を誰かが知っていますか?
編集:
これはフェッチ要求であるため、バックエンドサーバーから要求を行う必要があると誰かが提案しました。これは理にかなっているので、次のようにしました。
_ WebAssembly.instantiateStreaming(fetch('http://localhost:8000/files/add.wasm'), importObject)
.then(obj => {
console.log('inside return obj from WebAssembly initiateStreaming')
obj => obj.instance.exports.exported_func()
})
.catch(error=>{
console.log('there was some error; ', error)
});
_
ここで、_http://localhost:8000/files/{someFile}
_は、ファイルを提供するバックエンドルートです(もちろん、_add.wasm
_は必ず入れます)。残念ながら、同じエラー(つまり_unrecognized MIME type
_)が発生し、その理由はわかりません。
何らかの理由でサーバーを変更して_application/wasm
_ファイルリクエストに対して_.wasm
_を正しく返すように変更できないことを考慮して、WebAssemblyモジュールのインスタンス化の方法を変更することで問題を回避できます。これを行う代わりに:
_WebAssembly.instantiateStreaming(fetch("./add.wasm")).then(obj => /* ... */)
_
これを行う:
_const response = await fetch("add.wasm");
const buffer = await response.arrayBuffer();
const obj = await WebAssembly.instantiate(buffer);
obj.instance.exports.exported_func();
_
または、_async/await
_を使用できない場合は、then()
を使用して同等のものを使用します。
実際には、私の回避策はinstantiateStreaming()
を呼び出さないようにすることです。これは、続行する前にサーバーから返されるMIMEタイプをチェックする必要があります( この指定 に従って)。代わりに、ArrayBuffer
を渡してinstantiate()
を呼び出し、チェックを完全に回避します。
there was some error; TypeError: "Response has unsupported MIME type"
実行しているWebサーバーはMIMEタイプを理解/提供しませんapplication/wasm
。
Rustベースのhttpサーバー を使用できます。これはwasm MIMEタイプを認識しています。
単にカールを使う
curl -SsL https://cdn.rawgit.com/thecoshman/http/master/install.sh | sh
ダウンロードしたスクリプトを実行するか、または https://crates.io/crates/https で他のエクスプローラーを使用して同じことを実行できます。
ダウンロードしたサーバーを使用して、Webアプリケーション(index.html)をサーバー処理してください。例えば
cd ${YOUR_APPS_PATH}
http