rust - 如何使用 wasm-bindgen 调用作为模块的 JavaScript 函数?
问题描述
我正在尝试使用 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
,它们是合法的 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
's js_name
is 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;
}
推荐阅读
- amazon-web-services - 如何在无服务器中为一个处理程序定义多个路径?
- jquery - modal-body 类中的值仅显示 Django 模型“hostels”的第一个对象
- python - 如何从 .mat 文件读入 python 列表?
- r - 如何突出显示 Bioconductor Enhancedvolcano 中的特定基因?
- c# - 如何在使用 TLS 1.3 时为 sslstream 设置签名算法
- html - 将图像高度设置为 100vh 会导致与其他元素重叠
- regex - 正则表达式,仅匹配包含一次出现某些字符的字符串
- java - 从 minecraft 插件运行 traceroute
- forms - resetProgress 可以重置整个表单,包括任何现有的标签吗?
- python - 如何使用 :private-members: 在 Sphinx 中显示损坏的成员值常量