【Rust 实战】Rust 与 Wasm (2) —— 操作 Dom

简介: 【Rust 实战】Rust 与 Wasm (2) —— 操作 Dom

0x00 开篇


通过文章 Rust 与 Wasm 我们基本了解了 JavaScript 是如何调用 Rust 的函数,那本篇文章将带你了解使用 Rust 来调用 JavaScript 函数以及操作 Dom。


0x01 调用 JavaScript 函数


由于 Rust 是一门静态语言,所以在 Rust 中调用的 JavaScript 函数时必须声明。声明的方法如下:

#[wasm_bindgen]
extern "C" {
    // js 函数
    pub fn demo()
}

假如我们声明一个 alert 函数,示例代码如下:

use wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern {
    // js 函数
    fn alert(msg: &str);
}
#[wasm_bindgen]
pub fn alert_by_rust(msg: &str) {
    return alert(msg);
}


0a2653c851af460fa595bd959398a8f1.png


所以,只要我们能够正确的声明 JavaScript 的函数,我们可以调用任意的 JavaScript 函数。


0x03 使用 web_sys 调用 JavaScript 函数


看了上面的方法,不知道大家有没有发现缺点。JavaScript 的函数太多了,我们该如何正确声明 JavaScript 的函数呢?即使我们正确声明了,后期维护起来可能也会很难。所以我们可以借助这两个 crate —— js-sysweb-sys。这个库已经帮我们都声明好了,拿来用即可。

  • js-sys :包含 ECMAScript 标准的全局范围一些变量和方法,不包括 Html节点操作,Web接口等其它环境的API。
  • web-sys :基于 js-sys 并提供在浏览器内的接口,包括Web、Html节点操作等。

所以,在浏览器里上面两个 crate 要一起导入。先演示下用法:

use js_sys::Function;
use wasm_bindgen::prelude::*;
use web_sys::window;
/// 调用 setTimeout
#[wasm_bindgen]
pub fn test_setTimeout() {
    // 声明一个函数
    let func = Function::new_no_args(r#"alert("hello wasm")"#);
    // 获取 window
    let window = window().unwrap();
    // window 调用setimeout
    window.set_timeout_with_callback_and_timeout_and_arguments_0(&func, 1000);
}

注:由于 web-sys 存在多个 feature ,所以要参照文档,用到哪个类或者函数,就要声明哪个 feature。

上面的代码我就不演示了,有没有突然感觉到变得容易了起来。其实我们可以看下 js-sys 的源码,确实是给我们已经声明好了,已经省去了我们很多开发时间了。


2d65d23f6d4748949b924e4057485923.png


0x04 使用 web_sys 操作 Dom


我们继续来感受下 web_sys 的强大吧,使用  web_sys  操作 Dom 同我们使用 JavaScript 大同小异,直接上代码:

/// 操作Dom
#[wasm_bindgen]
pub fn dom() {
    // 获取window
    let window = window().unwrap();
    // 获取document
    let doc = window.document().unwrap();
    // 获取test节点(我在html声明了一个div)
    let test_node = doc.get_element_by_id("test").unwrap();
    // 在节点里添加内容
    test_node.set_text_content(Some("Rust 操作 Dom"));
    // 最后再来个alert
    window.alert_with_message("我是通过 web_sys 生成的");
}

注:上面的代码用到的 feature 有 Window, Document, Element, Node。所以要在 .toml 文件里需要声明。

web-sys = { version = "0.3.60", features = ["Window", "Document", "Element", "Node"] }

Html 代码也贴一下吧:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Rust Wasm 测试</title>
</head>
<script type="module">
    import init, {alert_by_rust, dom, test_setTimeout} from "./pkg/rust_wasm_dom.js";
    init().then(() => {
        // alert_by_rust("hello world!")
        dom()
    });
</script>
<body>
    <!-- 声明的div节点 -->
    <div id="test"></div>
</body>
</html>

编译直接看效果。


6de278e6d6694ce5bb08e7e842b7e74b.png


0x05 小结


看完文章了,有没有感觉到很简单。其实本篇文章的内容也比较少,关键是掌握 js-sysweb-sys 这两个 crate。可以说如果你学会了 Rust,那么你又掌握了一门可以写 wasm 的语言,而且可能写起来变得更加容易。说这里可能有读者会考虑到,如果这个 web 端我全部使用 Rust 构建的 wasm 来写,是不是就不需要 JavaScript 了。其实上一篇文章我也提到过,感兴趣的读者可以研究下 Yew 这个框架。

最后说句题外话吧,近几年我发现前端的技术是更新最快的,每几个月就会出现新的前端框架,感觉每个语言都想取代 JavaScript,取代前端,我可以说前端是最卷的IT职业,没有之一。哎,心疼各位前端开发工程师们了。

相关文章
|
6月前
|
缓存 JavaScript 前端开发
【JavaScript 技术专栏】DOM 操作全攻略:从基础到进阶
【4月更文挑战第30天】本文深入讲解JavaScript与DOM交互,涵盖DOM基础、获取/修改元素、创建/删除元素、事件处理结合及性能优化。通过学习,开发者能掌握动态改变网页内容、结构和样式的技能,实现更丰富的交互体验。文中还讨论了DOM操作在实际案例、与其他前端技术结合的应用,助你提升前端开发能力。
243 0
|
8天前
|
Rust 安全 Java
编程语言新宠:Rust语言的特性、优势与实战入门
【10月更文挑战第27天】Rust语言以其独特的特性和优势在编程领域迅速崛起。本文介绍Rust的核心特性,如所有权系统和强大的并发处理能力,以及其性能和安全性优势。通过实战示例,如“Hello, World!”和线程编程,帮助读者快速入门Rust。
21 1
|
9天前
|
Rust 安全 编译器
编程语言新宠:Rust语言的特性、优势与实战入门
【10月更文挑战第26天】Rust语言诞生于2006年,由Mozilla公司的Graydon Hoare发起。作为一门系统编程语言,Rust专注于安全和高性能。通过所有权系统和生命周期管理,Rust在编译期就能消除内存泄漏等问题,适用于操作系统、嵌入式系统等高可靠性场景。
21 2
|
25天前
|
Rust 编译器 开发者
Rust宏之derive的设计及实战
【10月更文挑战第18天】在 Rust 中,`derive` 宏是一种自动生成代码的工具,可为结构体和枚举类型自动实现特定 trait,减少重复代码。它通过语法糖简化代码,支持 Debug、Clone、PartialEq 等 trait 的自动实现,并允许开发者自定义 `derive` 宏以扩展功能。
|
2月前
|
JSON Rust 安全
30天拿下Rust之实战Web Server
30天拿下Rust之实战Web Server
52 7
|
5月前
|
JavaScript 前端开发 UED
JavaScript基础-DOM操作:查找、创建、修改
【6月更文挑战第12天】本文介绍了DOM基础,包括查找元素(getElementById、getElementsByClassName等)、创建新节点(createElement、createTextNode)和修改节点(innerText、innerHTML、setAttribute等)。强调了易错点,如ID唯一性、性能考量和安全问题,并提供了代码示例。熟练掌握DOM操作对前端开发至关重要,但应注意性能优化,适时使用框架或库。
58 2
JavaScript基础-DOM操作:查找、创建、修改
|
5月前
|
JavaScript 前端开发
DOM操作有哪些方法可以改变元素的样式?
【6月更文挑战第30天】DOM操作有哪些方法可以改变元素的样式?
38 2
|
5月前
|
JavaScript 前端开发 开发者
DOM操作
【6月更文挑战第30天】DOM操作
34 1
|
5月前
|
Rust 图形学
【unity实战】使用unity制作一个类似Rust的3D生存建造建筑系统,具有很好的吸附性(附项目源码)
【unity实战】使用unity制作一个类似Rust的3D生存建造建筑系统,具有很好的吸附性(附项目源码)
122 1
|
4月前
|
JavaScript 前端开发 API
前端框架与库 - jQuery基础与DOM操作
【7月更文挑战第18天】jQuery 是一个简化JavaScript任务的库,以其“write less, do more”理念著称。核心功能包括DOM操作、事件处理和Ajax。DOM操作如选择元素(`$(&quot;p&quot;)`、`$(&quot;#myDiv&quot;)`、`$(&quot;.myClass&quot;)`)、创建及添加元素、修改属性和内容。事件处理如绑定(`click`)和触发(`trigger`)。常见问题涉及`$`符号冲突(使用`jQuery`代替)、异步加载管理和选择器性能优化。了解并规避这些问题能提升jQuery使用效率。
32 0