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

时间:2019-02-08 18:31:09

标签: webpack rust webassembly wasm-bindgen

我正在尝试将wrapper for this crate移植到wasm中。我当前的工具链是:

  • wasm-pack
  • webpack
  • wasm-bindgen

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

在我的防锈箱(--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开发服务器。

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

当我开始使用提到的板条箱(example)中的 some (不是 any )功能时,一切都中断了。不幸的是,我收到的错误消息非常无用,完全没有帮助:

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的,而是到底哪一个,为什么以及错误消息试图说什么?


注释:

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

  • 其余的设置步骤直接来自Rust and Webassembly book

  • Cargo.toml

[package]
name = "schnorrkel-js"
edition = "2018"

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

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

示例代码:

#[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)
}

1 个答案:

答案 0 :(得分:2)

似乎clear_on_drop依赖项使用的C代码可能是个问题,如here所述。

尝试启用nightly板条箱上的schnorrkel功能,这反过来又启用nightly上的clear_on_drop功能,从而禁止使用C。在您的{{1 }}:

Cargo.toml

或者,您可以在已编译的[dependencies] wasm-bindgen = "0.2" schnorrkel = { git = "https://github.com/w3f/schnorrkel.git", features = ["nightly"] } 二进制文件上使用wasm2wat(有an online version)来检查哪些.wasm导入失败。