Rust 与 WebAssembly 构建前端应用

Yew 是一种用于创建多线程前端网络应用程序的现代Rust框架,其使用 WebAssembly 技术实现性能优化。这个框架支持与 JavaScript 的互操作性,使之不仅能够执行 JS 代码,并且还能够在 Rust 和 JavaScript 之间进行双向通信。Yew 框架具备了类似于 React 和 Elm 的组件化设计模式,并且因为能够利用 Rust 强大的生态系统,所以在构建丰富且高性能的网络应用方面显得特别突出。

在本文中,我们将深入探索如何使用 Yew 框架来构建前端应用,并提供详细的步骤和丰富的示例来帮助你深刻理解如何开发 WebAssembly 前端应用。

创建一个新项目

首先,确保你已经安装了 Rust。然后,通过以下命令创建一个新项目:

cargo new --lib yew-app

切换到创建的项目目录中,并编辑 Cargo.toml 文件,添加 Yew 依赖。

[dependencies]
yew = "0.18"

配置多线程

Yew 框架支持多线程模型,可以通过 Web Workers 实现。这就需要对 index.html 和 Cargo 配置进行如下调整:

<!-- 你的 index.html 文件 -->
<script type="module">import init, { run_app } from './pkg/yew_app.js';async function main() {await init();run_app();}main()
</script>

Cargo.toml 中,你需要使用 wasm-bindgen 包来启用多线程支持。

[dependencies]
wasm-bindgen = "0.2"
wasm-bindgen-rayon = "0.1.0"

构建组件

与 React 类似,Yew 也使用了组件化的模式。下面是一个简单的组件示例:

use yew::prelude::*;pub struct MyComponent;impl Component for MyComponent {type Message = ();type Properties = ();fn create(_ctx: &Context<Self>) -> Self {Self}fn view(&self, _ctx: &Context<Self>) -> Html {html! {<div>{"Hello, Yew!"}</div>}}
}

组件交互性

要让组件具有交互性,你需要定义一些消息类型来处理用户交互。

use yew::prelude::*;pub struct InteractiveComponent {link: ComponentLink<Self>,value: i64,
}pub enum Msg {Increment,Decrement,
}impl Component for InteractiveComponent {type Message = Msg;type Properties = ();fn create(ctx: &Context<Self>) -> Self {Self {link: ctx.link().clone(),value: 0,}}fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {match msg {Msg::Increment => {self.value += 1;true // Rerender this component}Msg::Decrement => {self.value -= 1;true}}}fn view(&self, ctx: &Context<Self>) -> Html {html! {<div><button onclick={ctx.link().callback(|_| Msg::Increment)}>{ "Increment" }</button><p>{ self.value }</p><button onclick={ctx.link().callback(|_| Msg::Decrement)}>{ "Decrement" }</button></div>}}
}

与 JavaScript 互操作

Yew 允许在 Rust 代码中调用 JavaScript 函数和在 JavaScript 中调用 Rust 函数。这通过 wasm-bindgen 桥接实现。

在 Rust 中调用 JS:

use wasm_bindgen::prelude::*;#[wasm_bindgen(module = "/www/utils.js")]
extern "C" {fn alert(s: &str);
}pub fn run_alert() {alert("Hello from Rust!");
}

在 JS 中调用 Rust:

import { run_alert } from './pkg/yew_app';run_alert(); // This will call the Rust function and display an alert.

状态管理和外部数据获取

将状态管理与组件结合起来是构建高复杂性应用的关键。同时,你可能还需要调用外部 API 来获取数据。

use yew::prelude::*;
use yew::services::fetch::{FetchService, Request, Response};
use anyhow::Error;#[derive(Clone, PartialEq)]
pub struct DataModel {/* ... fields representing the data ... */
}#[derive(Properties, PartialEq)]
pub struct DataFetcherProps {// Props go here
}pub enum Msg {GetData,ReceiveResponse(Result<DataModel, Error>),
}pub struct DataFetcher {fetch_task: Option<FetchTask>,
}impl Component for DataFetcher {type Message = Msg;type Properties = DataFetcherProps;fn create(ctx: &Context<Self>) -> Self {// Start the network request right awaylet callback = ctx.link().callback(|response: Response<Json<Result<DataModel, Error>>>| {let (meta, Json(data)) = response.into_parts();if meta.status.is_success() {Msg::ReceiveResponse(data)} else {panic!("Error")}});let request = Request::get("url-to-your-api").body(Nothing).expect("Could not build request.");let task = FetchService::fetch(request, callback).expect("Failed to start request");Self {fetch_task: Some(task),}}// ... other component methods ...
}

总结

本文章探讨了如何使用 Yew 框架构建多线程前端Web应用,并且提供了丰富的代码示例来展示一个基本的 Yew 应用架构。我们了解了如何创建组件,处理组件间的交互,以及如何管理状态和获取外部数据。希望这些信息能帮你在 Rust 和 WebAssembly 的世界中,构建出高性能、高交互的前端应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阶段性学习汇报 4月19日

一、毕业设计和毕业论文 毕业设计后端功能基本实现&#xff0c;但是还有些具体的细节需要优化&#xff0c;例如这些图片的显示问题&#xff0c;前端只有个前端页面以及部分交互逻辑&#xff0c;还需进一步完善。我想在疾病预测这里加一个创新点&#xff0c;基于推荐算法。小程序…

sklearn【Accuracy】准确度介绍和案例学习!

一、Accuracy 介绍 在机器学习和数据科学中&#xff0c;准确度&#xff08;Accuracy&#xff09;是衡量分类模型性能的一个基本且重要的指标。准确度表示模型正确分类的样本数占总样本数的比例。Python的sklearn库提供了简单而强大的工具来训练和评估分类模型&#xff0c;包括…

测绘管理与法律法规 | 中华人民共和国测绘法 | 学习笔记

《中华人民共和国测绘法》笔记&#xff1a; 第一章 总则 第一条&#xff1a;立法目的&#xff0c;即加强测绘管理&#xff0c;促进测绘事业发展&#xff0c;保障测绘事业为经济建设、国防建设、社会发展和生态保护服务&#xff0c;维护国家地理信息安全。 第二条&#xff1a;…

leetcode 295 数据流中中位数

方法一 class MedianFinder:def __init__(self):from sortedcontainers import SortedListself.right 0self.arr SortedList()def addNum(self, num: int) -> None:self.arr.add(num)self.right 1def findMedian(self) -> float:if self.right % 2 0 :return self.a…

网络爬虫软件学习

1 什么是爬虫软件 爬虫软件&#xff0c;也称为网络爬虫或网络蜘蛛&#xff0c;是一种自动抓取万维网信息的程序或脚本。它基于一定的规则&#xff0c;自动地访问网页并抓取需要的信息。爬虫软件可以应用于大规模数据采集和分析&#xff0c;广泛应用于舆情监测、品牌竞争分析、…

ollama大语言模型

查看已经安装的大语言模型 ollama list运行大语言模型 ollama run llama2:latest

Qt实现Mysql数据库的连接,查询,修改,删除,增加功能

Qt实现Mysql数据库的连接&#xff0c;查询&#xff0c;修改&#xff0c;删除&#xff0c;增加功能 安装Mysql数据库&#xff0c;QtCreator Mysql选择Mysql Server 8.1版本安装。 Mysql Server 8.1安装过程 1.首先添加网络服务权限&#xff1a; WinR键输入compmgmt.msc进入…

Linux【实战】—— LAMP环境搭建 部署网站

目录 一、介绍 1.1什么是LAMP&#xff1f; 1.2LAMP的作用 二、部署静态网站 2.1 虚拟主机&#xff1a;一台服务器上部署多个网站 2.1.1 安装Apache服务 2.1.2 防火墙配置 2.1.3 准备网站目录 2.1.4 创建网站的配置文件 2.1.5 检查配置文件是否正确 2.1.6 Linux客户端…

web自动化系列-selenium的3种等待方式(十一)

在ui自动化测试中&#xff0c;几乎出现问题最多的情况就是定位不到元素 &#xff0c;当你的自动化在运行过程中 &#xff0c;突然发现报错走不下去了 。很大概率就是因为找不到元素 &#xff0c;而找不到元素的一个主要原因就是页面加载慢 &#xff0c;代码运行速度快导致 。 …

oracle guid 使用

在Oracle数据库中&#xff0c;全局唯一标识符&#xff08;GUID&#xff09;通常用于生成一个唯一的标识符&#xff0c;这个标识符可以在整个系统中唯一地标识一个实体或记录。在Oracle中&#xff0c;GUID通常通过RAW或VARCHAR2类型来表示。Oracle本身并没有像其他数据库系统&am…

深入理解MySQL中的UPDATE JOIN语句

在MySQL数据库中&#xff0c;UPDATE语句用于修改表中现有的记录。有时&#xff0c;我们需要根据另一个相关联表中的条件来更新表中的数据。这时就需要使用UPDATE JOIN语句。最近我们遇到了这样的需求&#xff1a;我们有一张历史记录表&#xff0c;其中一个字段记录了用,连接的多…

【转】关于vsCode创建后,不显示NPM脚本解决

刚刚使用vue ui新建了个vue项目&#xff0c;打开vs-code发现&#xff0c;无论怎么设置都找不到NPM脚本显示&#xff0c;苦恼了很久&#xff0c;突然发现&#xff01;打开了package-lock.json&#xff0c;然后立马把vs-code关闭&#xff0c;重新打开&#xff0c;就显示了npm脚本…

DePT: Decoupled Prompt Tuning 论文阅读

DePT: Decoupled Prompt Tuning 了论文阅读 Abstract1. Introduction2. Methodology2.1. Preliminaries2.2. A Closer Look at the BNT Problem2.3. Decoupled Prompt Tuning 3. Experiments5. Conclusions 文章信息&#xff1a; 原文链接&#xff1a;https://arxiv.org/abs/…

OCR-身份证识别认证-身份证实名认证-python接口文档

OCR通常被称作为光学字符识别&#xff0c;以此技术而延申的功能产品有很多种&#xff0c;类如&#xff1a;身份证识别、文档识别、发票识别、驾照识别、护照识别等多类文字识别技术。下面我们以翔云身份证识别接口实现简单的示例。 身份证识别接口可以快速、精准识别证件正反面…

软件架构演化方式的分类以及架构演化时期

1.软件架构演化方式3种较典型的分类方法 目前&#xff0c;软件架构演化方式没有一种公认的分法&#xff0c;分类方法很多&#xff0c;以下列举说明3种较典型的分类方法&#xff1a; &#xff08;1&#xff09;按照软件架构的实现方式和实施粒度分类&#xff1a;基于过程…

【行为型模式】模板方法模式

一、模板方法模式概述 模板方法模式定义&#xff1a;在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。(类对象型模式) 模板方法中的基本方法是实现算法的各个步骤&#xff0c;是模板方法的…

rocketmq-dashboard打包测试报错

rocketmq-dashboard运行的时候没问题&#xff0c;但是打包执行测试的时候就是报错 这时候跳过测试就可以成功 报错为 There are test failures. Please refer to D:\CodeEn\rocketmq-dashboard\target\surefire-reports for the individual test results. 你只需要跳过测试就…

【刷题笔记】第九天

文章目录 [LCR 189. 设计机械累加器](https://leetcode.cn/problems/qiu-12n-lcof/)[2007. 从双倍数组中还原原数组](https://leetcode.cn/problems/find-original-array-from-doubled-array/) LCR 189. 设计机械累加器 c专属解法&#xff1a;使用sizeof函数 1 2 3 … ta…

查看transformers模型对应的device的实战代码

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

3D抓取算法中的PointNet++网络介绍

3D抓取算法是一个在机器人抓取任务中广泛使用的算法基线&#xff0c;它结合了深度学习和计算机视觉技术来预测给定三维点云场景中物体的抓取姿态。在这个基线算法中&#xff0c;PointNet 网络是一个关键组件&#xff0c;用于从点云数据中提取有效的特征表示。 下面是关于 3D抓…