在Web应用程序中加载wasm文件失败



我正在尝试托管一个网站,我使用了一个.wasm文件和wasm包工具创建的.js脚本。

我用npmnode.js在本地测试了这个项目,一切都很好。

但后来我在树莓(apache2(上托管了它,当我试图访问它时,我遇到了以下错误:

Failed to load module script: The server responded with a non-JavaScript MIME type of "application/wasm". Strict MIME type checking is enforced for module scripts per HTML spec.

详细信息

有多个文件,但这里有一个想法:

my index.html加载模块bootstrap.js

// bootstrap.js content
import("./index.js").catch(e => console.error("Error importing `index.js`:", e));

我的主要代码在index.js中,它调用test_wasm_bg.js

最后,test_wasm_bg.js用以下行加载wasm文件:

// test_wasm_bg.js first line
import * as wasm from './test_wasm_bg.wasm';

问题出在哪里?

加载web部件文件的正确方法是什么?

我终于找到了在wasm-bindgen项目中加载wasm应用程序的正确方法!

事实上,所有的东西都在这个页面上

当您编译项目而不想使用bundler运行它时,您必须使用--target标志运行wasm-pack-build。

wasm-pack build --release --target web

这将创建一个.js文件(在我的示例中为pkg/test_wasm.js(,其中包含加载wasm应用程序所需的所有内容。

然后这就是如何使用wasm-bindgen(index.js(创建的函数:

import init, {ex_function, ex_Struct ...} from './pkg/test_wasm.js';
function run() {
// use the function ex_function1 here
}
init().then(run)

您将index.js包含在HTML文件中

<script type="module" src="./index.js"></script>

然后它就工作了!

编辑:

现在我对javascript生态系统有了更多的了解,我可以试着解释我所理解的:有很多方法可以在js中进行导入,下面是一个列表:https://dev.to/iggredible/what-the-heck-are-cjs-amd-umd-and-esm-ikm

除了wasm包的默认目标是节点样式的ecmascript模块之外,您不需要对此了解太多。此导入将在node.js中工作,但不能直接在浏览器中工作。所以在node中,您可以直接从wasm文件导入函数,如下所示:import {ex_function} from "./test.wasm"

但是这些导入样式目前在浏览器中不起作用。也许这在未来是可能的但目前,您的浏览器只知道js模块。因此,如果你试图直接在浏览器中导入.wasm文件,它会抛出一个mime类型的错误,因为它不知道如何处理webassembly文件。

从ecmascipt模块(例如,有很多nmp包(到单个js文件的工具被称为web bundler(webpack、rollup、snowpack…(。如果你用npm处理一个大项目,你可能需要一个。否则--目标网页";会对wasm-bindgen说以正确的方式实例化wasm模块(看看pkg/test_wasm.js(

相关内容

  • 没有找到相关文章

最新更新