我正在尝试托管一个网站,我使用了一个.wasm文件和wasm包工具创建的.js脚本。
我用npm和node.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
(