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
  },
};
相关推荐
Rust研习社13 分钟前
使用 Axum 构建高性能异步 Web 服务
开发语言·前端·网络·后端·http·rust
豹哥学前端1 小时前
用猜数字游戏,一口气掌握 JavaScript 核心知识点(附完整代码)
前端·javascript
忆往wu前2 小时前
从0到1一步步拆解搭建,梳理一个 Vue3 简易图书后台全开发流程
前端·javascript·vue.js
shao9185162 小时前
第3章(2)——使用Gradio JavaScript Client
javascript·node.js·cdn·gradio·job·events·playcode
光影少年2 小时前
大屏页面,一次多个请求,请求加密导致 点击 全局时间选择器 时出现卡顿咋解决(面板收起会延迟1~2秒)
前端·javascript·vue.js·学习·前端框架·echarts·reactjs
Mr.mjw2 小时前
vue中封装一个环形进度条组件,根据外部盒子大小自适应变化
前端·javascript·vue.js
无心使然3 小时前
Openlayers调用ArcGis影像服务之一动态地图、地图切片(/exportImage)
前端·javascript·数据可视化
像我这样帅的人丶你还3 小时前
前端监控体系与实践(二):全局监控
前端·javascript·vue.js
顾随3 小时前
(二)kettle--输入与输出
javascript·数据库·kettle
FlyWIHTSKY4 小时前
Vue 3 中 RouteRecord 详解(Vue Router 4)
前端·javascript·vue.js