是否可以将 wasm-bindgen 与 webpack 5 一起使用?

2024-03-26

我跟着你好世界 https://rustwasm.github.io/docs/wasm-bindgen/examples/hello-world.html Guide for wasm-bindgen https://crates.io/crates/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(因为我不关心不支持非基于 Chromium 的版本Edge)并升级@wasm-tool/wasm-pack-plugin没有问题:

Working package.json:

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

Working 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-plugin and webpack itself.

The package.json出现错误的版本:

{
  "scripts": {
    "build": "webpack",
    "serve": "webpack-dev-server"
  },
  "devDependencies": {
    "@wasm-tool/wasm-pack-plugin": "^1.3.3",
    "html-webpack-plugin": "^5.3.1",
    "webpack": "^5.27.1",
    "webpack-cli": "^3.1.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',
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'index.js',
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: 'index.html'
        }),
        new WasmPackPlugin({
            crateDirectory: path.resolve(__dirname, ".")
        })
    ],
    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-bindgen with webpack ^5.27.1?

我很感谢任何提示。

额外观察

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

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

wasm.greet("World");

当我这样做时,控制台中不再出现错误,并且出现一条显示“Hello, !”的警报。 (缺少“世界”)已显示,所以我认为 .wasm 应该仍然没问题......

Update

我能够通过使用以下方法让一切再次正常工作:

experiments: {
    syncWebAssembly: true
},

然而,这已被弃用,所以如果有一种方法仍然可以使用,那就太好了asyncWebAssembly.


是的,现在官方支持了,因为坚定的 https://github.com/rustwasm/wasm-bindgen/blob/eba691f38ca427c9d440b3d4c44217e58c89c661/examples/hello_world/package.json#L102021年8月10日到总店。请注意,截至 2022 年 12 月,如果您从 wasm-bindgen GitHub 克隆,则需要从 wasm-bindgen 根目录复制示例,查看相关问题 https://github.com/rustwasm/wasm-bindgen/issues/1394。别忘了npm i在继续之前npm run serve

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以将 wasm-bindgen 与 webpack 5 一起使用? 的相关文章

随机推荐

  • 信号执行期间的 sigprocmask

    我目前正在研究使用sigprocmask阻止某些信号 在这种情况下 SIGALRM and SIGCHLD 当关键代码段正在执行时 与这些信号关联的两个信号处理程序都将访问和修改中央数据结构 因此在主进程处理该数据结构时阻止它们访问它至关重
  • 将 youtube api 帮助程序集成到 iOS 时出现错误 258

    https developers google com youtube v3 guides ios youtube helper https developers google com youtube v3 guides ios youtu
  • 编写 SQL Server 权限脚本

    我想将我对存储过程和其他内容设置的所有权限从开发数据库复制到生产数据库 通过 SSMS GUI 工具手动完成这一切非常麻烦 更不用说容易出错 因此 我正在寻找一种方法 可以直接转储在一个数据库中设置的权限 并将这些相同的权限应用于单独的数据
  • 编辑所有视图和存储过程,查找和替换?

    有没有一种简单的方法可以在我的 SQL Server 数据库中的每个视图和存储过程中查找和替换字符串 我需要将 X United Kingdom 替换为 X UK 您需要查看sysobjects和syscomments 视图和存储过程的文本
  • 如何在 Google Visualization API 中进行多行注释?

    我正在尝试使用谷歌可视化 API 生成带注释的 LineChart 当我让它工作时 我希望能够在可能的情况下使注释具有换行符 不幸的是 Google 的 API 似乎忽略了任何换行信息并将所有内容显示在一行上 有人想出解决这个问题的办法吗
  • R htmlParse XML 中的编码问题

    我尝试抓取网站但无法处理此编码问题 putting together the url search str lt allintitle amphibian richness OR diversity url lt paste http sc
  • 如何在类库中定位EF生成的元文件?

    我已将 Entity Framework 4 模型移至类库 元文件构建到 bin Debug 我用来在类库中定位元文件的连接字符串是什么 我努力了
  • 将多个谓词函数组合为一个

    是否可以编写例如 defn multiple of three n zero mod n 3 defn multiple of five n zero mod n 5 into multiple of three or five 所以我可以
  • Grails 3 Spring Security 预身份验证

    我的应用程序使用 Grails 3 我正在尝试进行预身份验证 如此处所述article https docs spring io spring security site docs 3 0 x reference preauth html
  • 如何检查 Ruby 对象的方法?

    我想知道是否有一个 Ruby 方法调用仅显示由其调用的 Ruby 对象定义的方法 而不是由其祖先类定义的所有方法 这就是methods似乎是这样 methods采用可选的布尔参数 该参数指定是否还列出对象的类及其超类的方法或仅列出对象的单例
  • SQL“之间”不包含在内

    我有一个这样的查询 SELECT FROM Cases WHERE created at BETWEEN 2013 05 01 AND 2013 05 01 但即使 1 日有数据 也没有给出任何结果 created at好像2013 05
  • 使用 SSH 从 BitBucket pip 安装自定义包,无需输入 SSH 密码

    我正在尝试使用pip install git ssh email protected cdn cgi l email protection my org my package repo git从 BitBucket 安装定制的 python
  • PHP MySQL插入多维关联数组从数组键构建查询[重复]

    这个问题在这里已经有答案了 我已经尝试了这两个链接 但我没有得到 fields 和 newdata 中的预期变量内容 这个问题在这里提出了一个新问题 PHP如何从关联数组中提取键名称和值以进行mysql查询 https stackoverf
  • 无法理解递归

    好的 所以我有一个程序 public class Rec public static void main String args test 5 static void test int n if n gt 0 System out prin
  • 如何将 docker-compose 升级到最新版本

    我已经使用命令安装了 docker compose sudo apt install docker compose 它安装了 docker compose 版本 1 8 0 并构建未知 我需要最新版本的 docker compose 或至少
  • 语法错误:JSON.parse:JSON 第 1 行第 2 列出现意外字符

    我需要将此 div 附加到另一个 div 但它给了我这个错误 语法错误 JSON parse 第 1 行第 2 列出现意外字符 JSON 数据 这是我的 JavaScript 代码 var str message message text
  • 使用 RavenDB 的“传统”一对多查询

    我知道include RavenDB 的功能 它允许我在数据库的一次往返中立即获取引用的文档 但我的问题是 我首先获取的文档不包含对 其他 文档的引用 但 其他 文档引用了当前文档 想象一下我们在世界各地都有站点的设置 每个site可能会触
  • FragmentTransaction 不执行任何操作

    我正在学习片段 下面给出的是我的第一个片段程序 一个简单的项目 我有两个屏幕 当我单击第一个屏幕的下一个按钮时 需要显示第二个按钮 我的目标是 Android 2 1 及更高版本使用兼容包 AppMainFragmentActivity j
  • Laravel 查询构建器在查询中使用 AND

    我想在查询生成器的末尾添加一个 AND 子句 代码如下所示 orderers DB table address gt where function query use term query gt where id LIKE term gt
  • 是否可以将 wasm-bindgen 与 webpack 5 一起使用?

    我跟着你好世界 https rustwasm github io docs wasm bindgen examples hello world html Guide for wasm bindgen https crates io crat