我想在我的 Astro 应用程序中使用我用 Rust 编写的 Web-Assembly 模块。我正在使用 TypeScript 和以下内容astro.config.mjs:
import { defineConfig } from "astro/config";
import wasm from "vite-plugin-wasm";
import topLevelAwait from "vite-plugin-top-level-await";
import tailwind from "@astrojs/tailwind";
import react from "@astrojs/react";
export default defineConfig({
integrations: [wasm(), tailwind(), react()],
vite: {
plugins: [wasm(), topLevelAwait()],
},
});
Run Code Online (Sandbox Code Playgroud)
在文件中使用 wasm 的代码functions.ts如下所示:
import { greet } from "dices";
export function hello(): void {
let g: string = greet();
console.log(g);
}
Run Code Online (Sandbox Code Playgroud)
类型检查一切正常,但是在运行时npm run dev遇到以下错误:
error WebAssembly.instantiate(): BufferSource argument is …Run Code Online (Sandbox Code Playgroud) 我是网络组装新手。我想使用 canvas 和 来创建一个简单的贪吃蛇游戏wasm_bindgen。
我的生锈代码:
#[wasm_bindgen]
impl CanvasData {
pub fn index_to_coordinate(&self, index: usize) -> (usize, usize) {
(index % self.cell_count, index / self.cell_count)
}
}
Run Code Online (Sandbox Code Playgroud)
CanvasData是一个保存画布数据的结构体,cell_count属性为usizetype,代表方形画布上水平和垂直格子的数量。这里我把画布上所有的网格从左到右、从上到下看成一个一维数组。该方法的目的是将数组索引映射到x、y坐标。我想返回一个元组并在前端调用它,如下所示:
const [x, y] = canvasData.index_to_coordinate(100)
Run Code Online (Sandbox Code Playgroud)
然而,在构建过程中出现了错误。
构建脚本:
wasm-pack build -t web
Run Code Online (Sandbox Code Playgroud)
错误:
error[E0277]: the trait bound `(usize, usize): IntoWasmAbi` is not satisfied
[0] --> src\lib.rs:16:1
[0] |
[0] 16 | #[wasm_bindgen]
[0] | ^^^^^^^^^^^^^^^ the trait `IntoWasmAbi` is not implemented for `(usize, usize)`
[0] |
[0] …Run Code Online (Sandbox Code Playgroud) 这是一个基本汇编脚本项目。但我在 tsconfig.json 文件中遇到此错误消息。
{
"extends": "assemblyscript/std/assembly.json",
"include": [
"./**/*.ts"
]
}
Run Code Online (Sandbox Code Playgroud)
这是我的 package.json
{
"devDependencies": {
"assemblyscript": "^0.27.1"
}
Run Code Online (Sandbox Code Playgroud) 我使用以下命令将 Golang 代码编译为 wasm
GOOS=js GOARCH=wasm go build -o main.wasm
Run Code Online (Sandbox Code Playgroud)
尝试使用 wasmtime 执行时出现以下错误
wasmtime main.wasm
Error: failed to run main module `main.wasm`
Caused by:
0: failed to instantiate "main.wasm"
1: unknown import: `go::debug` has not been defined
Run Code Online (Sandbox Code Playgroud)
当使用 wasm3 执行时,我得到
wasm3 main.wasm
Error: function lookup failed ('_start')
Run Code Online (Sandbox Code Playgroud)
这些错误意味着什么以及如何修复它们?
在较高级别上,我尝试创建一个 Rust 主机程序,该程序在运行时使用 Wasmtime 加载 WASM 模块并调用返回字符串的 WASM 函数。我可以使用数字类型(例如 )来实现此功能usize,但无法弄清楚如何处理字符串(或其他复杂类型)。
在我的插件箱中,我有一个lib.rs编译用的cargo build --target=wasm32-unknown-unknown --release:
use std::ffi::CString;
use std::os::raw::c_char;
static PLUGIN_NAME: &'static str = "Test Plugin";
#[no_mangle]
pub extern "C" fn plugin_name() -> *mut c_char {
let s = CString::new(PLUGIN_NAME).unwrap();
s.into_raw()
}
#[no_mangle]
pub fn plugin_name_len() -> usize {
PLUGIN_NAME.len()
}
Run Code Online (Sandbox Code Playgroud)
这是基于这个问题的答案之一中的代码,该代码与我正在寻找的内容很接近,但在主机端使用 JavaScript。
在我的主机箱中我有一个main.rs:
use wasmtime::{Engine, Linker, Module, Store};
use wasmtime_wasi::WasiCtxBuilder;
fn main() -> anyhow::Result<()> {
let engine = Engine::default();
let …Run Code Online (Sandbox Code Playgroud) 我一直在寻找WebAssembly网站和教程,我觉得有点迷茫.
我有以下C代码:
void EMSCRIPTEN_KEEPALIVE hello(char * value){
printf("%s\n", value);
}
Run Code Online (Sandbox Code Playgroud)
我编译它(我也不确定这部分是最好的方法):
emcc demo.c -s WASM=1 -s NO_EXIT_RUNTIME=1 -o demo.js
Run Code Online (Sandbox Code Playgroud)
根据我的理解,我现在可以在我的javascript类中使用demo.js粘合代码并以这种方式调用方法:
...
<script src="demo.js"></script>
<script>
function hello(){
// Get the value
var value = document.getElementById("sample");
_hello(value.innerHTML);
}
</script>
...
Run Code Online (Sandbox Code Playgroud)
当我调用方法时,我看到在控制台中打印的内容是:
(null)
Run Code Online (Sandbox Code Playgroud)
有什么我缺少将字符串值传递给使用WebAssembly编译的C代码吗?
非常感谢
没有dup指令,可以让我复制堆栈顶部的指令。我可以使用哪个指令序列来复制此行为?
我和Wasm都是新手,看来这些项目进展很快。我正在阅读有关在旅途中使用wasm的介绍,看来虽然它是在一月份编写的,但已经过时了。
我正在尝试在调用JavaScript函数时调用单个go函数。该示例说要执行以下操作:
js.Global().Set("jsFunctionName", js.NewCallback(goCallback))
Run Code Online (Sandbox Code Playgroud)
虽然在尝试编译时,会出现以下错误:
./webassembly.go:54:35: undefined: js.NewCallback
Run Code Online (Sandbox Code Playgroud)
我检查了文档,看不到参考NewCallback。当前应该执行的“正确”方法是什么?
即,对于一个而言,预编译的代码更难阅读,因此很难有效地更改浏览器代码。
它比JS更“沙盒”化了,这使其更不容易被黑客入侵了吗?
“ WebAssembly被指定为在安全的沙盒执行环境中运行。” - https://developer.mozilla.org/en-US/docs/WebAssembly/Concepts
WASM VM内存格式的属性是否使其更具客户端抵抗性?
还要别的吗?
webassembly ×10
javascript ×3
go ×2
rust ×2
wasm-pack ×2
astrojs ×1
browser ×1
bytecode ×1
drm ×1
frontend ×1
reactjs ×1
rust-wasm ×1
typescript ×1
vite ×1
wasm-bindgen ×1
wasmtime ×1