簡體   English   中英

如何使用 wasm-bindgen 調用作為模塊的 JavaScript 函數?

[英]How can I call a JavaScript function that is a module with wasm-bindgen?

我正在嘗試使用 Rust 的 Web3 JavaScript 庫,但被卡住了。 庫的標准用法開始於:

// In Node.js use: const Web3 = require('web3');

let web3 = new Web3(Web3.givenProvider || "ws://localhost:8545");

您應該導入的模塊是一個構造函數,它還有一些其他屬性。 我應該綁定此 API 的 Rust 代碼如下所示:

#[wasm_bindgen(module = "web3")]
extern "C" {
    type Web3;

    #[wasm_bindgen(constructor)]
    fn new(_: &Provider) -> Web3;

    type Provider;

    static givenProvider: Provider;
}

最終輸出import { Web3, givenProvider } from 'web3'; 並嘗試運行失敗的new Web3(...) 它應該做一些類似import * as Web3 from 'web3'; ,運行new Web3(...)並引用Web3.givenProvider

我怎樣才能讓 wasm-bindgen 輸出這樣的代碼?

編輯:原來的答案是錯誤的。 可以使用wasm-bindgen導入類似定義wasm-bindgen ,它們合法的 ES6。 或者至少在 ES6 模塊中可以使用相同的概念。 他們稱它們為默認的導出/導入 有點尷尬,但是導入它們的方法是使用js_name = "default" 像這樣:

#[wasm_bindgen(module = "web3")]
extern "C" {
    #[wasm_bindgen(js_name = "default")]
    type Web3;

    #[wasm_bindgen(constructor, js_class = "default")]
    fn new(_: &Provider) -> Web3;

    #[wasm_bindgen(static_method_of = Web3, getter, js_class = "default")]
    fn givenProvider() -> Provider;

    type Provider;
}

您需要在方法上使用js_class參數,它不記得Web3js_namedefault


舊的,錯誤的答案

你不能讓wasm-bindgen生成這樣的代碼的原因是因為它不合法的 ES6。 ECMAScript 模塊對所有內容都使用命名導出。 Web3 實際上是一個 CommonJS 模塊,它們確實支持具有單個匿名導出。

幾乎有效的原因是因為我使用的是 webpack,而 webpack 允許您使用 ES6 語法導入 CommonJS 模塊,即使語義略有不同。

解決方案是做一點墊片,從 ES6 模塊導出 CommonJS 模塊:

export let Web3 = require('web3');

然后此綁定將起作用:

#[wasm_bindgen(module = "/src/web3-wrapper.js")]
extern "C" {
    type Web3;

    #[wasm_bindgen(constructor)]
    fn new(_: &Provider) -> Web3;

    #[wasm_bindgen(static_method_of = Web3, getter)]
    fn givenProvider() -> Provider;

    type Provider;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM