rust - 如何使 Rust Game of Life WebAssembly 作为静态网站工作?

标签 rust webassembly wasm-bindgen wasm-pack rust-wasm

我已经完成了 Rust Game of Life 的教程,并在网络浏览器中拥有了一个可以运行的游戏,但它只能在与其捆绑在一起的演示网络服务器上运行。我可以使用 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 的符号链接(symbolic link)指向 ../../pkg/ 我已经替换了该符号链接(symbolic link)使用顶级 pkg/ 文件夹的实际副本,以便网站完全包含在 www/ 文件夹中,然后将该文件夹放在我的网站上 http://www.north-winds.org/gol/但是,访问它会返回上述错误。我需要修改什么才能使其独立工作?

据我了解,这个 WebAssembly Game-of-Life 基本上是一个独立的客户端应用程序,除了可以提供附加了适当 mime 类型的静态文件的 Web 服务器之外,不需要任何其他东西。我认为没有什么特别需要的。我确实在某处看到了 WebSockets 的提及,但我不知道为什么这个应用程序需要它。我将其与 https://webassembly.org/ 中的 C 语言“Hello, World”WebAssembly 示例进行了比较。最终得到一个从 C 源代码生成的 .wasm 文件,以及一个用于执行它的 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";                

要使这项工作独立进行,还缺少什么?

最佳答案

wwwpkg 文件夹包含您需要的源文件,但您还没有静态站点。 create-wasm-app模板使用 Webpack,因此您需要通过在 www 文件夹中运行 npm run build 来构建最终输出。这将创建一个名为 dist 的子文件夹,其中包含可以放置在 Web 服务器上的实际静态文件。

关于rust - 如何使 Rust Game of Life WebAssembly 作为静态网站工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63388440/

相关文章:

rust - 使用 PhantomData<T> 时不满足 trait bound `T: std::default::Default`

generics - "the trait ` core::marker::Sized ` is not implemented"用于具有通用类型的结构向量

javascript - go 函数内的await js 异步函数(promise)

rust - 在no_std环境中,我该如何替换Vec和HashSet?

arrays - 无法将迭代器转换为 js_sys::Array

rust - Rust 编译器如何知道一个值是否被移动了?

rust - 即使使用::from 我得到预期的类型参数 A 错误

javascript - 如何从 WebAssembly 函数返回 JavaScript 字符串

javascript - 使用 web-sys 而不是普通的旧 JavaScript 是否有性能提升?

rust - 为什么这两个非常相似的异步 Rust 函数之一会触发线程安全错误?