WebAssembly InstantiateStreaming 错误的 MIME 类型

2024-07-04

我正在尝试获取本教程(此处:https://www.hellorust.com/demos/add/index.html 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 https://developer.mozilla.org/en-US/docs/WebAssembly/Using_the_JavaScript_API).

MDN 示例要求执行以下操作:

var importObject = {
  imports: { imported_func: arg => console.log(arg) }
};

then

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,但我不确定并且我还没有在网上看到任何示例。

有谁知道如何让它发挥作用?

EDIT:

有人建议,由于这是一个获取请求,因此它必须从后端服务器发出请求。这对我来说很有意义,所以我做了以下事情:

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

Where http://localhost:8000/files/{someFile}是一个为我的文件提供服务的后端路由(我确保将其放在add.wasm当然)。不幸的是,我遇到了同样的错误(即unrecognized MIME type)我不知道为什么。


考虑到你无法更改服务器以正确返回application/wasm for .wasm无论出于何种原因发生文件请求,您都可以通过更改实例化 WebAssembly 模块的方式来解决该问题。而不是这样做:

WebAssembly.instantiateStreaming(fetch("./add.wasm")).then(obj => /* ... */)

Do this:

const response = await fetch("add.wasm");
const buffer = await response.arrayBuffer();
const obj = await WebAssembly.instantiate(buffer);
obj.instance.exports.exported_func();

或者等效使用then()如果你不能使用async/await.

在实践中,我的解决方法是避免调用instantiateStreaming(),在继续之前必须检查服务器返回的 MIME 类型(根据本规格 https://www.w3.org/TR/wasm-web-api-1/#streaming-modules)。相反,我打电话instantiate()通过一个ArrayBuffer并完全避免检查。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebAssembly InstantiateStreaming 错误的 MIME 类型 的相关文章

随机推荐

  • 更改 Django 中的表名称

    我读过 Django 中的表名可以使用自定义元选项 https docs djangoproject com en dev ref models options 我想知道如何使用 db table 选项来继续使用应用程序名称 但稍微修改模型
  • 我应该如何在 Spring Integration 中构建消息?

    我编写了一个应用程序 正在对其进行重构以更好地利用 Spring Integration 应用程序处理文件的内容 问题 据我所知 是我当前的实现通过了Files代替Messages 即 Spring 集成Messages http docs
  • 计算随机生成的六边形的6个顶点

    我需要一些帮助来写方程式 我想生成仍然 完美 成比例 的随机大小的六边形 最左边的顶点将位于 0 0 我想考虑与最左边的顶点相关的其他顶点 从左顶点向上这么多 从它右边这么多 从它向下这么多 这不是那么简单的原因是因为我需要它成比例 目前
  • 如何在列表列表中找到元素和最大的列表?

    我有一个列表列表 x 1 2 3 4 5 6 7 8 9 2 2 0 我想得到列表中元素之和最大的列表 在这种情况下 7 8 9 我宁愿有一个幻想map or lambda或列表理解方法比for while if loop 此致 max提出
  • 如何在 SASS 中定义动态 mixin 或函数名称?

    我想在 SASS 中动态创建 mixin 以列表中的每个项目命名 但它似乎不起作用 我尝试了这个 但出现错误 event icons fair concert art show conference dance show film part
  • 无法使用 SHGetFileInfo 获取“我的电脑”特殊文件夹的图标

    我在用着SHGetFileInfo获取文件夹图标 除了调用时之外 一切正常SHGetFileInfo在 我的电脑 特殊文件夹 CLSID 20D04FE0 3AEA 1069 A2D8 08002B30309D 对于致电后的特殊情况SHGe
  • 是否允许 C 编译器用一种算法替换另一种算法?

    例如你有一个函数sort int numbers size t count 使用冒泡排序实现并且 C 编译器可以识别这种模式 是否允许编译器将其更改为另一个示例 就像快速排序一样 另一个例子是将所有从 0 到的数字相加n 编译器可以将 fo
  • 停止 lapply 从打印到控制台

    当我使用lapply并打印到控制台 它打印出不需要的内容 i NULL虽然我希望将预期的消息打印到控制台 我试过了suppressWarnings and suppressMessages但这些并不能消除不受欢迎的罪犯 我搜索了lapply
  • 有没有办法让每个人都可以访问 firestore 数据库,但只能通过应用程序?

    我正在使用 Firestore 创建 Android 应用程序 我的应用程序不需要身份验证 是否有任何安全规则允许每个人读取和写入 firestore 但只能通过我的应用程序 我试图找到一些规则 但每个规则都基于身份验证 感谢您的帮助 最接
  • Cocoa:在 CGEvent 中模拟 Command+Tab

    我想模拟Application Switcher在我的应用程序中 我认为 CGEvent 也许可以做到这一点 好了 了解了CGEvent的一些基本信息后 我就可以模拟按键了Command Tab 但应用程序切换器窗口只是一闪而过 并立即切换
  • Lua Base64 编码

    我不使用 lua 我尝试在互联网上搜索 这是做什么的 assert load Base64Decode BASE64 Script but is not Encoded like usualy nil bt ENV 每条编码消息都以G0x
  • Android Studio 设计预览是像素化的

    我的 android studio 设计预览很模糊 文本以及小部件 我尝试通过执行以下操作来修复它 Android Studio 属性 gt 兼容性 gt 更改高 DPI 设置 gt 覆盖高 DPI 我关闭了 android studio
  • Visual Studio 2005 内存使用情况

    我发现 Visual Studio 内存使用量通常约为 150 300 MB RAM 作为经常需要在打开多个 Visual Studio 实例的情况下运行的开发人员 是否有任何性能技巧可以优化 VS 使用的内存量 我正在运行带有一个加载项
  • 从方法符号和主体创建方法定义树

    有没有方便的方法来转MethodSymbol http www scala lang org archives downloads distrib files nightly docs library index html scala re
  • 两个带有淘汰赛的日期选择器,一个更新另一个

    我附加了带有剔除自定义绑定处理程序的 jQuery 日期选择器 并且我想在更新第一个字段时将第二个的 minDate 设置为之后的日期 以防其他日期未设置为较晚的日期
  • 配置 Manuel 容器 IntelliJ Arquillian Wildfly

    我正在使用 intelliJ 运行 junit arquillian 测试 问题是我的测试适用于 maven 命令 但不适用于 arquillian mvn package P arq wildlfy managed 这是我的 pom
  • 禁用 ListView 上的波纹

    在 Android 5 0 中 我的 ListView 在单击列表项时会产生连锁反应 有没有办法禁用这个效果 查看文档 我没有看到任何方法 https developer android com reference android widg
  • 为什么包含 会破坏 GCC 中的结构化绑定?

    考虑 struct Point int x y int main const auto x y Point 此代码可以在 C 17 模式下使用 gcc 7 1 正常编译 但是这个 include
  • 如何记录 webapi 中控制器中执行的操作方法

    在 WebAPI 中 是否可以记录使用操作过滤器调用或执行的控制器的操作方法的名称 我正在使用 RouteData 属性 如下所示 但操作值不包含任何值 有什么方法可以获取过滤器中的操作名称 public class LogActionFi
  • WebAssembly InstantiateStreaming 错误的 MIME 类型

    我正在尝试获取本教程 此处 https www hellorust com demos add index html https www hellorust com demos add index html 工作 似乎无论我做什么 我都无法