是否可以在 webpack 5 中使用 wasm-bindgen?

如何解决是否可以在 webpack 5 中使用 wasm-bindgen?

我遵循了 Hello World 指南 wasm-bindgen(我使用的是 wasm-bindgen = "0.2.72")。

不幸的是,指南中提到的 npm 包并不是最新的。因为我想有一个干净的起点,所以我尝试升级它们。

这是指南中提到的package.json

{
  "scripts": {
    "build": "webpack","serve": "webpack-dev-server"
  },"devDependencies": {
    "@wasm-tool/wasm-pack-plugin": "1.0.1","text-encoding": "^0.7.0","html-webpack-plugin": "^3.2.0","webpack": "^4.29.4","webpack-cli": "^3.1.1","webpack-dev-server": "^3.1.0"
  }
}

删除text-encoding(因为我不在乎不支持 Edge 的非基于 Chromium 的版本)并升级@wasm-tool/wasm-pack-plugin 没有问题:

工作package.json

{
  "scripts": {
    "build": "webpack","devDependencies": {
    "@wasm-tool/wasm-pack-plugin": "^1.3.3","webpack-dev-server": "^3.1.0"
  }
}

工作webpack.config.js

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin");

module.exports = {
    entry: './index.js',output: {
        path: path.resolve(__dirname,'dist'),filename: 'index.js',},plugins: [
        new HtmlWebpackPlugin({
            template: 'index.html'
        }),new WasmPackPlugin({
            crateDirectory: path.resolve(__dirname,".")
        })
    ],mode: 'development'
};

我接下来要做的是升级 html-webpack-pluginwebpack 本身。

出现错误的版本的package.json

{
  "scripts": {
    "build": "webpack","html-webpack-plugin": "^5.3.1","webpack": "^5.27.1","webpack-dev-server": "^3.1.0"
  }
}

因为我将 webpack 升级到版本 5.27.1,所以我也不得不像这样更改 webpack.config.js

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin");

module.exports = {
    entry: './index.js',experiments: {
        asyncWebAssembly: true
    },mode: 'development'
};

现在,当我运行 npm run serve 时,构建完成且没有错误,但是当我打开网页时不再显示警报。在浏览器控制台中,现在记录以下错误

TypeError: _index_bg_wasm__WEBPACK_IMPORTED_MODULE_0__ is undefined
    greet webpack:///./pkg/index_bg.js?:113
    <anonymous> webpack:///./index.js?:4
    promise callback* webpack:///./index.js?:4
    js http://localhost:8080/index.js:18
    __webpack_require__ http://localhost:8080/index.js:366
    <anonymous> http://localhost:8080/index.js:709
    <anonymous> http://localhost:8080/index.js:712

我该怎么做才能摆脱这个问题,以便我可以将 wasm-bindgenwebpack ^5.27.1 一起使用?

我很感激任何提示

额外的观察

有趣的是,我发现,即使使用不工作的版本,也可以从 m => m.greet('World!')删除 index.js,而是像这样从 pkg/index.js 调用 wasm 函数

import * as wasm from "./index_bg.wasm";
export * from "./index_bg.js";

wasm.greet("World");

执行此操作后,控制台中不再出现错误显示“您好,!”的警报。 (缺少“世界”)显示,所以我认为 .wasm 应该仍然没问题......

更新

我能够通过使用:

experiments: {
    syncWebAssembly: true
},

然而,这已被弃用,所以如果有办法仍然使用 asyncWebAssembly,那就太好了。

解决方法

我能够通过以下方式加载我的应用程序来使其工作。

我的 webpack 入口配置如下:

    entry: {
      wasm: ['./src/bootstrap.js'],vendor: ['react','react-dom'],},

引导文件如下所示:

import('./index.tsx').catch(e =>
  console.error('Error importing `index.getStringX`:',e),);

在我的 React 应用程序中,我加载了使用 npm 安装的 wasm 包,如下所示:

import * as wasm from 'myRustWebAssemblyPackedPackage';

这就是我所做的。我不使用 Webpack 中的任何插件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?