![](/img/trans.png)
[英]How to call an arbitrary previously defined javascript function Rust using wasm-bindgen?
[英]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
參數,它不記得Web3
的js_name
是default
。
舊的,錯誤的答案:
你不能讓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.