gpt4 book ai didi

rust - 如何使用 wasm-bindgen 调用作为模块的 JavaScript 函数?

转载 作者:行者123 更新时间:2023-12-03 11:38:42 31 4
gpt4 key购买 nike

我正在尝试使用 Rust 的 Web3 JavaScript 库,但我被卡住了。该库的标准用法从以下内容开始:

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

let web3 = new Web3(Web3.givenProvider || "ws://localhost:8545");
您应该导入的模块是一个构造函数,它还具有一些其他属性。我应该绑定(bind)此 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 导入类似定义的内容。 ,并且它们是合法的 ES6。或者至少在 ES6 模块中可以使用相同的概念。他们称他们为 default exports/imports .有点别扭,不过导入方式是使用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');
然后这个绑定(bind)将起作用:
#[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;
}

关于rust - 如何使用 wasm-bindgen 调用作为模块的 JavaScript 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64851681/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com