我正在尝试使用Web3 JavaScript库,因为我被困在了锈病中。库的标准使用从以下几个方面开始:
// In Node.js use: const Web3 = require('web3');
let web3 = new Web3(Web3.givenProvider || "ws://localhost:8545");您应该导入的模块是一个构造函数,它还具有其他一些属性。我应该绑定这个API的锈蚀代码如下所示:
#[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输出这样的代码?
发布于 2020-11-21 06:26:48
编辑:原来的答案是错误的。您可以使用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语法导入ES6模块,尽管语义略有不同。
解决方案是创建一个小空间,从一个CommonJS模块导出ES6模块:
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;
}https://stackoverflow.com/questions/64851681
复制相似问题