使用汇总,我试图捆绑一个 typescript 库,该库导入和调用包含 wasm 文件的 npm 模块。
只有生成的包不包含 wasm 文件内容的痕迹。我怎样才能强制它也捆绑 webassembly?
这是我尝试过的关键文件:
// typescript/src/index.ts
import * as libEd from "ed25519-raw";
export const seed_from_phrase = libEd.seed_from_phrase;
export const gen_keypair = libEd.gen_keypair;
Run Code Online (Sandbox Code Playgroud)
我的 package.json 是
{
"name": "ed25519",
"version": "0.1.0",
"description": "ed25519",
"main": "typescript/dist/bundle.cjs.js",
"types": "typescript/src/index.ts",
"dependencies": {
"ed25519-raw": "git+https://github.com/cmanteiga/ed25519-raw"
},
"devDependencies": {
"@types/node": "^13.7.1",
"typescript": "^3.7.5",
"@rollup/plugin-commonjs": "^11.0.2",
"@rollup/plugin-multi-entry": "^3.0.0",
"@rollup/plugin-node-resolve": "^7.1.1",
"@rollup/plugin-wasm": "^3.0.0",
"rollup": "^1.31.1",
"rollup-plugin-typescript2": "^0.26.0"
}
}
Run Code Online (Sandbox Code Playgroud)
最后汇总配置是
{
"name": "ed25519",
"version": "0.1.0",
"description": "ed25519",
"main": "typescript/dist/bundle.cjs.js",
"types": …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Rust 中的 Web3 JavaScript 库,但我陷入了困境。该库的标准用法始于:
// In Node.js use: const Web3 = require('web3');
let web3 = new Web3(Web3.givenProvider || "ws://localhost:8545");
Run Code Online (Sandbox Code Playgroud)
您应该导入的模块是一个构造函数,它还有一些其他属性。我的 Rust 代码应该绑定这个 API,如下所示:
#[wasm_bindgen(module = "web3")]
extern "C" {
type Web3;
#[wasm_bindgen(constructor)]
fn new(_: &Provider) -> Web3;
type Provider;
static givenProvider: Provider;
}
Run Code Online (Sandbox Code Playgroud)
最终输出import { Web3, givenProvider } from 'web3';
并尝试运行new Web3(...)
失败。它应该执行诸如import * as Web3 from 'web3';
运行new Web3(...)
和引用之类的操作Web3.givenProvider
。
我怎样才能让 wasm-bindgen 输出这样的代码?
我正在尝试在webview中托管一个 React 应用程序,它使用已编译的 Rust -> WebAssembly 模块。
我收到此错误:
Unhandled promise rejection: TypeError: URL is not valid or contains user credentials.
Run Code Online (Sandbox Code Playgroud)
WASM 模块在组件之一中被调用:
const { mymod } = require("../../wasm/mymod");
Run Code Online (Sandbox Code Playgroud)
然后我使用 webpack 将其全部打包。
const webpackConfig = {
entry: "./frontend/bootstrap.js",
output: {
path: path.resolve(__dirname, "dist"),
filename: "bundle.js",
},
mode: "development",
module: {
rules: [
]
},
plugins: [
new HtmlWebPackPlugin({
template: "./frontend/index.html"
}),
new MiniCssExtractPlugin(),
]
};
Run Code Online (Sandbox Code Playgroud)
然后我将其加载到 webview 中:
fn main() {
let html = format!(r#"...");
web_view::builder()
.title("my app")
.content(Content::Html(html))
.size(320, …
Run Code Online (Sandbox Code Playgroud) 我正在努力追随
如何在 WebAssembly 中从 Rust 返回字符串(或类似的字符串)?
它允许访问 wasm 模块内的字符串数据。
我曾经wasm-pack build
构建过 RUST 模块,我可以访问导出的方法,但不能直接访问内存。
webpack 生成的 JavScript 有一个方法可以让我读取字符串
function getStringFromWasm(ptr, len) {
return cachedTextDecoder.decode(getUint8Memory().subarray(ptr, ptr + len));
}
Run Code Online (Sandbox Code Playgroud)
但如果我将这个生成的 .js 文件破解为
export function getStringFromWasm(ptr, len)
Run Code Online (Sandbox Code Playgroud)
我可以访问 RUST 代码返回的字符串。
如何配置 webpack 代码生成器以提供类似的访问权限,或者以其他方式公开模块的exports.memory
?
Webpack 似乎没有给我模块本身的处理。.wasm
我找不到加载webpack 生成的文件的方法WebAssembly.instantiateStreaming()
,因为它似乎依赖于其他生成的文件。
我有两个导出到 Javascript 的结构。我可以创建实例并在 JavaScript 中使用它们,不会出现任何错误,但是当我将实例推入 Rust 端的向量时,出现错误“未捕获错误:空指针传递给 rust”
由于所有权已更改,JS 对象变为 null 是完全正常的,但我还需要保留 JavaScript 对象以便在 JavaScript 端更改内容。
有没有正确的方法来保持“vect”对象不为空并接受更改?
我添加了一个工作示例。您可以在浏览器的控制台中看到错误。
Rust 代码
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
struct Vector3 {
x: f32,
y: f32,
z: f32,
}
#[wasm_bindgen]
impl Vector3 {
#[wasm_bindgen(constructor)]
pub fn new() -> Vector3 {
return Vector3 {
x: 0.0,
y: 0.0,
z: 0.0,
};
}
pub fn get_x(&self) -> f32 {
self.x
}
}
#[wasm_bindgen(extends = Object)]
struct Group {
list: Vec<Vector3>,
}
#[wasm_bindgen]
impl Group {
#[wasm_bindgen(constructor)] …
Run Code Online (Sandbox Code Playgroud) 目前我有一些类似于以下的代码:
// Lifetime of child is enforced to be valid as far as Parent is valid
struct Child<'a> {
some_data : i32,
phantom_lifetime: PhantomData<&'a Parent>
}
struct Parent {
}
#[wasm_bindgen]
pub struct Foo<'a> {
parent: Parent,
children: Vec<Child<'a>>
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是我必须摆脱生命周期,Foo
因为wasm_bindgen
不允许这样做。
直观上,生命周期应该仅通过 struct 的创建来强制执行Foo
。然而编译器还是要求我提供生命周期。
无论如何,我不知道如何实现这一点。有人可以帮助我吗?
我有一个 Rust 库,我正在尝试交叉编译并打包到 npm 脚本中。我一直在关注wasm包的使用过程。该过程构建了 es6 js,我编写了一些粗略的测试,然后决定尝试使用 jest 作为测试运行程序,因为我在另一个项目中使用它,没有什么问题。
我在尝试运行测试时遇到这个问题
/Users/nsh/WebstormProjects/wasm-ed25519ph/pkg/index_bg.wasm:1
({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){
SyntaxError: Invalid or unexpected token
> 1 | import * as wasm from './index_bg.wasm';
Run Code Online (Sandbox Code Playgroud)
我运行笑话
jest --config ./jest.config.json --detectOpenHandles --debug
Run Code Online (Sandbox Code Playgroud)
笑话调试配置输出
{
"configs": [
{
"automock": false,
"browser": false,
"cache": true,
"cacheDirectory": "/var/folders/w1/hmxby_9x2h18qmm4fbgq3x1m0000gn/T/jest_dx",
"clearMocks": false,
"coveragePathIgnorePatterns": [
"/node_modules/"
],
"detectLeaks": false,
"detectOpenHandles": true,
"errorOnDeprecated": false,
"filter": null,
"forceCoverageMatch": [],
"globals": {
"NODE_ENV": "test"
},
"haste": {
"providesModuleNodeModules": []
},
"moduleDirectories": [
"node_modules",
"pkg"
],
"moduleFileExtensions": [
"js"
], …
Run Code Online (Sandbox Code Playgroud) 我想编译以下代码。
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub struct Dummy {}
#[wasm_bindgen]
pub fn test() -> Vec<Dummy> {
vec![]
}
Run Code Online (Sandbox Code Playgroud)
但是,编译器不允许我这样做。
error[E0277]: the trait bound `std::boxed::Box<[Dummy]>: wasm_bindgen::convert::traits::IntoWasmAbi` is not satisfied
--> xxxx
|
XX | #[wasm_bindgen]
| ^^^^^^^^^^^^^^^ the trait `wasm_bindgen::convert::traits::IntoWasmAbi` is not implemented for `std::boxed::Box<[Dummy]>`
|
= help: the following implementations were found:
<std::boxed::Box<[f32]> as wasm_bindgen::convert::traits::IntoWasmAbi>
<std::boxed::Box<[f64]> as wasm_bindgen::convert::traits::IntoWasmAbi>
<std::boxed::Box<[i16]> as wasm_bindgen::convert::traits::IntoWasmAbi>
<std::boxed::Box<[i32]> as wasm_bindgen::convert::traits::IntoWasmAbi>
and 9 others
= note: required because of the requirements on the impl of `wasm_bindgen::convert::traits::IntoWasmAbi` for `std::vec::Vec<Dummy>` …
Run Code Online (Sandbox Code Playgroud) 也许这是一个简单的问题,但我还没有在任何地方找到答案。我已经搜索了文档,但是我在整个互联网上找到的用于 web-sys fetch 的单个示例仍然没有解决这个问题(官方文档也同样如此)。
如何从 web-sys 请求中获取响应正文?它具有 JsFutures 和展开的所有开销,而且我实际上似乎无法找到正确的方法来将我的数据放入字符串中。我只是尝试从(localhost dev)服务器检索文件,然后将其解析为 WebGL 程序的顶点着色器,但我什至无法获取它的字符串或以任何方式从中读取。
我正在玩wasm-bindgen
(https://github.com/rustwasm/wasm-bindgen),只是出于好奇。
在玩Navigator
(web_sys
板条箱)时,我偶然发现了这个方法:
https://docs.rs/web-sys/0.3.36/web_sys/struct.MediaDevices.html#method.enumerate_devices
它返回一个Result<Promise, JsValue>
..now,我是 Rust 新手,我的问题是如何获取 的值Promise
?
效果如何Closure::wrap
?如何使用then方法来获取结果?
我想知道是否有人可以好心地向我解释如何处理Promise
这是一个返回 a 的示例Promise
:
let window = web_sys::window().expect("no global `window` exists");
let navigator = window.navigator();
if let Ok(devs) = navigator.media_devices() {
if let Ok(prom) = devs.enumerate_devices() {
//..??? how to list all devices
}
}
Run Code Online (Sandbox Code Playgroud)
祝你一切顺利,卢卡
wasm-bindgen ×10
rust ×7
webassembly ×5
webpack ×2
javascript ×1
jestjs ×1
promise ×1
reactjs ×1
rollup ×1
typescript ×1
wasm-pack ×1
webview ×1