Webpack 5 支持访问 Rust WebAssembly 线性内存

前面在《解决 Rust WebAssembly 启动 Web 程序报错》 一文中讲到,将 Webpack 升级到 5.54.0+。其实问题并未彻底解决,还潜藏另一个问题。当我们像原先那样,通过导出 memory 来访问 WebAssembly 线性内存:

javascript 复制代码
import { memory } from "wasm-game-of-life/wasm_game_of_life_bg";

npm run start 时会报警,结果是程序无法正常运行:

bash 复制代码
export 'memory' (imported as 'memory') was not found in 'wasm-game-of-life/wasm_game_of_life_bg'
 (possible exports: Universe, __wbg_error_f851667af71bcfc6, 
__wbg_new_abda76e883ba8a5f, __wbg_set_wasm, __wbg_stack_658279fe44541cf6, 
__wbindgen_object_drop_ref, __wbindgen_throw)

在 github 上 wasm-bindgenwasm-packwebpack 的 Issues 中搜了一通。发现都有报告类似问题,不知为何过了两三年仍处于 Open 状态。不过评论中也有提出可供参考的解决办法。

总结了评论中的方法,我自己做了这样的修改:

首先,在 www 目录中创建一个源文件 memory.js,用以从 wasm 文件中导出 memory,内容如下:

javascript 复制代码
// 从 `wasm`  文件中导出 `memory`
export { memory } from "wasm-game-of-life/wasm_game_of_life_bg.wasm";

然后,在我们需要访问 memory 的源文件中导入:

javascript 复制代码
// 导入 `memory`
import { memory } from './memory';

...

// 访问线性内存中的宇宙细胞数据
const cellsPtr = universe.cells();
const size = Math.ceil((width * height) / 8);
const cells = new Uint8Array(memory.buffer, cellsPtr, size);

再次 npm run start,正常运行!

对了,别忘记我们之前升级 Webpack 5 时,修改了 webpack.config.js

javascript 复制代码
const CopyWebpackPlugin = require("copy-webpack-plugin");
const path = require('path');

module.exports = {
  entry: "./bootstrap.js",
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "bootstrap.js",
  },
  mode: "development",
  plugins: [
    new CopyWebpackPlugin({
      patterns: [
        { from: "index.html" },
      ]
    })
  ],
  // 支持 WebAssembly 打包
  experiments: {
    asyncWebAssembly: true,
    syncWebAssembly: true
  },
};
相关推荐
Moment1 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
爱敲代码的小鱼2 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax
铅笔侠_小龙虾4 小时前
Flutter 实战: 计算器
开发语言·javascript·flutter
大模型玩家七七4 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
2501_944711434 小时前
JS 对象遍历全解析
开发语言·前端·javascript
发现一只大呆瓜5 小时前
虚拟列表:支持“向上加载”的历史消息(Vue 3 & React 双版本)
前端·javascript·面试
阔皮大师5 小时前
INote轻量文本编辑器
java·javascript·python·c#
lbb 小魔仙5 小时前
【HarmonyOS实战】React Native 表单实战:自定义 useReactHookForm 高性能验证
javascript·react native·react.js
_codemonster5 小时前
Vue的三种使用方式对比
前端·javascript·vue.js
暴躁小师兄数据学院5 小时前
【WEB3.0零基础转行笔记】Rust编程篇-第一讲:课程简介
rust·web3·区块链·智能合约