我已经阅读了 Rust Game of Life 的教程,并且在 Web 浏览器中有一个可以运行的游戏,但它只能在与它捆绑的演示 Web 服务器上运行。我可以启动服务器,npm start
它在端口 8080 上运行 webpack-dev-server。当我通过该端口访问该站点时,它工作正常。但是,如果我尝试将该站点复制到 Apache 之类的 Web 服务器,它就无法正确加载。我目前从中得到的错误是:
Error importing `index.js`: TypeError: Error resolving module specifier “wasm-game-of-life”. Relative module specifiers must start with “./”, “../” or “/”. bootstrap.js:5:23
<anonymous> http://www.north-winds.org/gol/bootstrap.js:5
在教程中,网站的根目录是www/
存储库中调用的文件夹,并且从 Rust 程序生成的 wasm 模块放置在pkg/
. 有一个符号链接www/node_modules/wasm-game-of-life
,../../pkg/
我已经用顶级pkg/
文件夹的实际副本替换了该符号链接,以便网站完全包含在www/
文件夹中,然后将该文件夹放在我的网站上http:// www.north-winds.org/gol/但是,访问它会返回上述错误。我需要修改什么才能使其独立工作?
据我了解,这个 WebAssembly Game-of-Life 基本上是一个独立的客户端应用程序,除了可以提供带有适当 mime 类型的静态文件的 Web 服务器之外,不需要任何东西。我看不出有什么特别的要求。我确实在某处看到提到 WebSockets,但我不知道为什么这个应用程序需要这样做。我将此与来自https://webassembly.org/的 C 的“Hello, World”WebAssembly 示例进行了比较,最终得到了一个.wasm
从 C 源代码生成的文件,以及一个用于执行它的 JavaScript 和 HTML 支持文件。当简单地复制到静态 Web 服务器位置时,这些文件可以正常工作。这就是我想要的 Rust 示例。
Rust Game-of-Life 中的一些相关代码如下。顶级 HTML 文件包括以下几行:
<script src="./bootstrap.js"></script>
引导 JavaScript 文件仅包含以下内容:
import("./index.js")
.catch(e => console.error("Error importing `index.js`:", e));
它引用的 index.js 文件在 Wasm 的其他粘合逻辑中包含以下内容:
import { Universe, Cell } from "wasm-game-of-life";
// Import the WebAssembly memory at the top of the file.
import { memory } from "wasm-game-of-life/wasm_game_of_life_bg";
使这项工作独立起来缺少什么?