wasm-pack 代码中的 Rust 导入导致 JS 错误
Posted
技术标签:
【中文标题】wasm-pack 代码中的 Rust 导入导致 JS 错误【英文标题】:Rust imports in wasm-pack code causing JS error 【发布时间】:2021-09-17 16:58:05 【问题描述】:我收到一个 JS 错误:Uncaught (in promise) TypeError: WebAssembly.instantiate(): Import #0 module="env" error: module is not an object or function
当我在 Chrome 开发工具中查看 wasm 文件时,我在顶部看到这样的导入语句:
(module
(func $blst_hash_to_g2 (;0;) (import "env" "blst_hash_to_g2") (param i32 i32 i32 i32 i32 i32 i32))
(func $blst_sign_pk2_in_g1 (;1;) (import "env" "blst_sign_pk2_in_g1") (param i32 i32 i32 i32))
(func $blst_scalar_from_bendian (;2;) (import "env" "blst_scalar_from_bendian") (param i32 i32))
(func $blst_sk_check (;3;) (import "env" "blst_sk_check") (param i32) (result i32))
是什么导致了这些导入语句?如何删除或修复它们?我可以看到它们是blst
Rust 包的一部分,该包包含在blsttc
包中。 blst
包使用 bindgen 生成与 blst.h 的 FFI 绑定,所以可能与它有关?
这个Github repo 有代码。我正在使用 wasm-pack build --target=web
【问题讨论】:
据我了解,问题在于env
应该是,但不是由wasm-pack
生成的。如果构建工件损坏,这通常会发生在我身上,如果我在代码生成期间中止构建过程,就会发生这种情况。然后解决方案是运行cargo clean
以删除损坏的构建工件并从头开始重新构建整个项目。
既然你有一个 C 依赖,你是用 emscripten 的最新 sdk 用CC=emcc wasm-pack build --target=web
构建的吗?我已经使用该命令成功构建了您的 github 存储库。
@glennsl Cargo clean 没用,但谢谢
@MathieuRene 它不适合我,即使使用最新的 emscripten 和 CC=emcc。 blst 包上的构建过程正在终止,并出现错误“错误:无法构建存档:部分太大”
emcc 2.0.25 rustc 1.53.0 wasm-pack 0.10.0 on ubuntu20.04 here,你的操作系统/组件版本是什么?
【参考方案1】:
我通过切换到具有最新功能的 Ubuntu 20.04 解决了这个问题,现在它运行良好。我在 mac os 10.15.7 上。
【讨论】:
以上是关于wasm-pack 代码中的 Rust 导入导致 JS 错误的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Wasm-Bindgen Web_sys Wasm-pack 将字符串从 Js 传递到通过 Rust 生成的 Wasm