关于webpack:Rust / Wasm:找不到模块:错误:无法解析” env”

Rust/Wasm: Module not found: Error: Can't resolve 'env' in

我正在尝试将此package箱的package器移植到wasm中。我当前的工具链是:

  • 垃圾袋
  • 网页包
  • 瓦斯宾德根

有关构建系统的更多信息:

在我的防锈箱(--lib箱)中,我仅调用wasm-pack build --target browser。这将创建一个pkg文件夹,其中包含wasm blob和相关的js文件。这里没有来自编译器的投诉。

然后在pkg内运行npm link(仅运行一次)。

然后,cargo generate --git https://github.com/rustwasm/wasm-pack-template创建所需的Web应用程序样板。在此命令生成的文件夹内,我运行npm link schnorrkel-js以使其可见。 npm run start运行webpack开发服务器。

初始测试(如绑定简单的计算功能和警报)可以正常工作。

当我开始使用提到的板条箱(示例)中的一些(不是任何)功能时,一切都中断了。不幸的是,我收到的错误消息非常无用,根本没有帮助:

1
2
3
4
5
6
7
8
9
10
11
12
Entrypoint main = bootstrap.js
[../pkg/schnorrkel_js.js] 3.53 KiB {0} [built]
[../pkg/schnorrkel_js_bg.wasm] 93.7 KiB {0} [built]
    + 27 hidden modules

ERROR in ../pkg/schnorrkel_js_bg.wasm
Module not found: Error: Can't resolve 'env' in '.../schnorrkel-js/pkg'
 @ ../pkg/schnorrkel_js_bg.wasm
 @ ../pkg/schnorrkel_js.js
 @ ./index.js
 @ ./bootstrap.js
 @ multi (webpack)-dev-server/client?http://localhost:8080 ./bootstrap.js

这是什么原因?我强烈猜测某些基本功能不是可移植到wasm的,而是到底哪一个,为什么以及错误消息试图说的是什么?

注释:

  • 我正在使用最新的rust夜间版本(rustc 1.34.0-nightly (d17318011 2019-02-07))

  • 其余的设置步骤直接来自Rust和Webassembly书。

  • Cargo.toml

1
2
3
4
5
6
7
8
9
10
[package]
name ="schnorrkel-js"
edition ="2018"

[lib]
crate-type = ["cdylib"]

[dependencies]
wasm-bindgen ="0.2"
schnorrkel = { git ="https://github.com/w3f/schnorrkel.git" }

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#[wasm_bindgen]
pub fn verify(signature: &[u8], message: &[u8], pubkey: &[u8]) -> bool {
    let sig = match Signature::from_bytes(signature) {
        Ok(some_sig) => some_sig,
        Err(_) => return false
    };
    let pk = match PublicKey::from_bytes(pubkey) {
        Ok(some_pk) => some_pk,
        Err(_) => return false
    };

    // works up until here if I return a boolean.
    // calling this breaks everything.
    pk.verify_simple(SIGNING_CTX, message, &sig)
}

这似乎是clear_on_drop依赖项所使用的C代码的问题,如此处所述。

尝试启用schnorrkel板条箱上的nightly功能,这反过来又启用clear_on_drop上的nightly功能,从而禁用其对C的使用。在Cargo.toml

1
2
3
[dependencies]
wasm-bindgen ="0.2"
schnorrkel = { git ="https://github.com/w3f/schnorrkel.git", features = ["nightly"] }

或者,您可以在编译的.wasm二进制文件上使用wasm2wat(有在线版本),检查哪个env导入失败。