如何从 JavaScript 运行 WASM 模块

mre*_*rre 6 javascript webassembly

我正在使用 wasmer 及其包管理器 wapm 来玩 WASM。我可以轻松安装Figlet WASM 包(如此处所述并在本地运行它:

\n
ubuntu@ip-172-31-1-78:~$ wapm execute figlet it works\n _ _                        _        \n(_) |_  __      _____  _ __| | _____ \n| | __| \\ \\ /\\ / / _ \\| \'__| |/ / __|\n| | |_   \\ V  V / (_) | |  |   <\\__ \\\n|_|\\__|   \\_/\\_/ \\___/|_|  |_|\\_\\___/\n                                     \nubuntu@ip-172-31-1-78:~$ \n
Run Code Online (Sandbox Code Playgroud)\n

作为试验 WASM 的一种方法,我想获取figlet.wasm系统上安装的文件并在浏览器中运行它。

\n

我已经启动了本地 nginx 服务,并将figlet.wasm根文件夹中

\n
    \n
  1. 索引.html
  2. \n
\n
<!doctype html>\n\n<html lang="en">\n<head>\n  <meta charset="utf-8">\n\n  <title>Test</title>\n</head>\n\n<body>\n  <script src="figlet.js"></script>\n</body>\n</html>\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. Figlet.js(取自此处
  2. \n
\n
const importObject = {\n  imports: {\n    imported_func(arg) {\n      console.log(arg);\n    }\n  }\n};\n\nfetch(\'figlet.wasm\').then((response) =>\n  response.arrayBuffer()\n).then((bytes) => {\n  const mod = new WebAssembly.Module(bytes);\n  const instance = new WebAssembly.Instance(mod, importObject);\n  instance.exports.exported_func();\n})\n
Run Code Online (Sandbox Code Playgroud)\n

但我得到了一个import object field \'wasi_snapshot_preview1\' is not an Object.

\n

有没有一种简单的方法来修复 js 文件以便能够运行 wasm 模块并查看输出?接下来的问题是如何传递Figlet渲染所需的参数。

\n

[更新]\n进展非常缓慢。事实证明,特定的错误消息import object field \'wasi_snapshot_preview1\' is not an Object是由于该工件是针对wasi浏览器无法理解的接口进行编译的(有关背景信息,请参阅此处)。我能够通过使用 target 编译 hello-world rust simple 应用程序来重现该问题wasm32-wasi。如果我使用目标wasm32-unknown-unknown(距离 Rust 中的 wasm 目标列表更近)编译简单的应用程序,则在浏览器中加载时会出现不同的错误:Uncaught (in promise) TypeError: result.instance.exports.exported_func is not a function

\n

另外值得注意的是(可能也是预期的),如果我使用wasm32-wasiwasmer 测试该版本,它工作正常,但如果我使用该wasm32-unknown-unknown版本测试它,则会出现错误:

\n
wasmer hello-rust-wasm.wasm\nerror: failed to run `hello-rust-wasm.wasm`\n\xe2\x95\xb0\xe2\x94\x80\xe2\x96\xb6 1: No export `_start` found in the module.\n       Similar functions found: `main`.\n       Try with: wasmer hello-rust-wasm.wasm -i main\n
Run Code Online (Sandbox Code Playgroud)\n

我想知道是否有可能在浏览器和浏览器之外的 wasm/wasi 运行时上运行相同的版本/工件(即 wasi 或 wasm)(或者我只需要为两个单独的目标编译程序)

\n

如果我发现更多信息,我将更新该线程。

\n