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

  • wasm-pack
  • webpack
  • wasm-bindgen

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

    在我的防 rust crate (即--lib crate )中,我仅调用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开发服务器。

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

    当我开始使用提到的 crate (example)中的某些功能(而不是任何)时,一切都中断了。不幸的是,我收到的错误消息非常无用,根本没有帮助:
    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 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)
    }
    
    

    最佳答案

    here所述,看来这可能是clear_on_drop依赖项所使用的C代码的问题。

    尝试启用nightly crate 上的schnorrkel功能,这又会启用nightly上的clear_on_drop功能,从而禁用C的用法。在您的Cargo.toml上:

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

    另外,您可以在编译后的wasm2wat二进制文件上使用.wasm(存在an online version)来检查哪些env导入失败。

    关于webpack - Rust/Wasm : Module not found: Error: Can't resolve 'env' in,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54598317/

    10-10 18:33