export function __wbg_alert_9ea5a791b0d4c7a3() { return logError(function (arg0, arg1) {alert(getStringFromWasm0(arg0, arg1));}, arguments) };
这是wasm-bindgen提供的「粘合部分」 , 帮助我们在WebAssembly中使用JavaScript函数或DOM 。
最后,让我们看看wasm-bindgen生成的其他文件 。
hello_world.d.ts这个.d.ts文件包含JavaScript粘合的TypeScript类型声明 , 如果我们的现有JavaScript应用程序正在使用TypeScript,它会很有用 。我们可以对调用WebAssembly函数进行「类型检查」,或者让我们的IDE提供自动完成 。如果我们不使用TypeScript,可以安全地忽略这个文件 。
package.jsonpackage.json文件包含有关生成的JavaScript和WebAssembly包的元数据 。它会自动从我们的Rust代码中填充所有npm依赖项 , 并使我们能够发布到npm 。
4. 内容拓展再次看一下以下代码:
hello_world_bg.jsfunction helloworld(name) {const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);const len0 = WASM_VECTOR_LEN;wasm.helloworld(ptr0, len0);}
该代码用于分配和释放内存,这一切都是「由程序自动处理」的 。不需要垃圾回收器或完整的框架引擎,使得使用Rust编写的WebAssembly应用程序或模块变得小巧且优化 。其他需要垃圾回收器的语言将需要包含用于其底层框架引擎的wasm代码 。因此,无论它们有多么优化 , 其大小都不会小于Rust提供的大小 。这使得Rust WebAssembly成为一个不错的选择,如果我们需要将小型WebAssembly模块集成或注入到JavaScript Web应用程序中 。
除了Hello World之外 , 还有一些其他需要注意的事项:
web-sys使用wasm-bindgen,我们可以通过使用extern在Rust WebAssembly中调用JavaScript函数 。请记住src/lib.rs中的以下代码:
#[wasm_bindgen]extern "C" {fn alert(s: &str);}
Web具有大量API,从DOM操作到WebGL再到Web Audio等等 。因此,如果我们的Rust WebAssembly程序增长,并且我们需要对Web API进行多次不同的调用 , 我们将需要花时间编写大量的extern代码 。
?这意味着如果我们使用web-sys,可以节省时间,而不必编写extern代码 。
web-sys充当wasm-bindgen的前端,为所有Web API提供原始绑定 。
?
文章插图
图片
引入web-sys将web-sys添加为Cargo.toml的依赖项:
[dependencies]wasm-bindgen = "0.2"[dependencies.web-sys]version = "0.3"features = []
为了保持构建速度非常快,web-sys将每个Web接口都封装在一个Cargo特性后面 。在API文档中找到我们要使用的类型或方法;它将列出必须启用的特性才能访问该API 。例如,如果我们要查找window.resizeTo函数,我们会在API文档中搜索resizeTo 。我们将找到web_sys::Window::resize_to函数,它需要启用Window特性 。要访问该函数,我们在Cargo.toml中启用Window特性:
[dependencies.web-sys]version = "0.3"features = ["Window"]
调用这个方法:use wasm_bindgen::prelude::*;use web_sys::Window;#[wasm_bindgen]pub fn make_the_window_small() {// 调整窗口大小为500px x 500px 。let window = web_sys::window().unwrap();window.resize_to(500, 500).expect("无法调整窗口大小");}
这段代码的目的是调整浏览器窗口的大小为500x500像素,并演示了如何使用web-sys和启用的Cargo特性来调用Web API 。推荐阅读
- AI 智能体能否取代工程经理?
- 学习Go编程
- 邮政编码的数字代表的都是什么,邮政编码的每一个数字代表什么?
- 部编版小学语文三年级下册第三单元测试卷
- ps能怎么样保存,ps编辑好的图片怎么保存
- C++中的多线程编程:一种高效的并发处理方式
- 利用Java AOP实现面向切面编程的关键技术
- 麻花的毛衣编织方法视频教程 麻花的毛衣编织方法
- 魔兽争霸3怎么编队,魔兽争霸3冰封王座编队快捷键技巧
- 64位和32位的区别,64位与32位编程的数据类型区别