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 away
        let 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.mfbz.cn/a/556410.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python采集海外电影信息,Roxlabs全球IP代理轻松搞定

一、为什么要学会应用 IP 代理技术二、采集海外电影信息爬虫实战2.1 选择目标网站并生成代理2.2 编写爬虫并设置代理2.3 运行爬虫2.4 处理数据2.5 完整代码 三、Roxlabs 代理及优势分析四、快速应用Roxlabs代理功能4.1 领免费流量4.2 代理类型4.3 获取代理4.4 配置代理设置4.5 …

进销存是什么?怎么快速上手制作进销存报表?

在现代商业运营中&#xff0c;进销存管理是企业持续稳健发展的关键组成部分。为了更好地把握库存状况、合理调配资源、提高决策效率&#xff0c;企业采用进销存报表是一种极为有效的手段。本文将从进销存的基本概念、报表的内容和意义&#xff0c;以及如何制作进销存报表等方面…

opencv的cmake报错

opencv编译报错 CMakeDownloadLog.txt #use_cache "D:/opencv/.cache" #do_unpack "ippicv_2021.8_win_intel64_20230330_general.zip" "71e4f58de939f0348ec7fb58ffb17dbf" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/1…

Ctags的安装和使用

ctags 是一个代码跟踪软件 由于在源码中&#xff0c;具有海量的代码&#xff0c;如果我们在源码中找特定的代码&#xff0c;需要大量时间&#xff0c;但是ctags则可以快速寻找 安装&#xff1a; sudo apt-get install ctagsctags使用 ctrl] //代码跟踪 crlT //代码返回我们…

鸿蒙入门06-常见装饰器( 简单装饰器 )

装饰器是鸿蒙开发中非常重要的一个环节因为在很多地方我们都需要用到装饰器并且如果我们想高度的复用, 那么装饰器就是必不可少的一环接下来我们就来介绍一些常见的装饰器注意 : 所有装饰器首字母大写 Entry 用来装饰 struct 使用表示页面的入口 Component 装饰 struct, …

算法课程笔记——常用库函数

memset初始化 设置成0是可以每个设置为0 而1时会特别大 -1的补码是11111111 要先排序 unique得到的是地址 地址减去得到下标 结果会放到后面 如果这样非相邻 会出错 要先用sort排序 O&#xff08;n&#xff09;被O&#xff08;nlogn&#xff09;覆盖

Axure引用ECharts图表 解决火狐浏览器出错

Axure原型添加Echarts图表&#xff0c;没耐心看文章的可以直接下载示例 Axure中使用ECharts图表示例 1. 打开Axure新建页面 2. 页面添加元件 元件类型随意&#xff0c;矩形、动态面板、热区、图片 甚至段落都可以3. 命名元件 随意命名&#xff0c;单个页面用到多个图表时名…

【目标检测】Focal Loss

Focal Loss用来解决正负样本不平衡问题&#xff0c;并提升训练过程对困难样本的关注。 在一阶段目标检测算法中&#xff0c;以YOLO v3为例&#xff0c;计算置信度损失&#xff08;图中第3、4项&#xff09;时有目标的点少&#xff0c;无目标的点多&#xff0c;两者可能相差百倍…

为主机配置IP

第一种方法:nmcli #nmcli connection modify eth0 ipv4.method manual ipv4.addresses 172.25.254.100/24 ipv4.gateway 172.25.254.2 ipv4.dns 114.114.114.114 autoconnect yes #nmcli c up etho //激活网卡命令(网卡早就配好,只是修改ip就不用输入这条命令了) 第二…

SpringMVC(五)【拦截器】

前言 今天来把 SpringMVC 最后一部分学完&#xff0c;虽然课时很短&#xff0c;但是学起来还是很慢的&#xff0c;不过确收获很大。不得不感慨学大数据确实有必要把 SSM、SpringBoot 等各种 JavaEE 技术好好学一学&#xff0c;收获很大&#xff0c;尽管我们到现在 Java 代码写了…

循环双链表的操作

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 每一个裂缝都是为透出光而努力&#…

BIM数据管理快速指南

在我的日常工作中&#xff0c;作为数字协作协调员&#xff0c;我花费大量时间收集、检查和管理各种 BIM 数据。 很多次收到一组数据后我就无奈地举手——质量远远达不到我可以使用的程度。 然后我会开始一个普通的数据清理过程。 我无数次咒骂过这种情况——大多数建设项目的人…

qt 开发 缩放比例问题 修复中

在日常开中&#xff0c;需要开启 高分辨率的支持&#xff0c;windows环境下&#xff0c;不是 字体缩放&#xff0c;就是分辨率模糊&#xff0c;缩放机制&#xff0c;并且开启了150%缩放&#xff0c;有点搞不明白&#xff0c;最后还是不行&#xff0c;先做个记录&#xff0c;在找…

windows部署pgsql

1、下载&#xff1a;Download PostgreSQL Binaries 2、创建data目录作为数据目录 3、初始化 bin目录执行命令&#xff1a; .\initdb.exe -D E:\pgsql\data -E UTF-8 --localechs -U postgres -W 输入密码直到完成 4、启动数据库 .\pg_ctl.exe -D E:\pgsql\data -l logfil…

[大模型]MiniCPM-2B-chat WebDemo部署

MiniCPM-2B-chat WebDemo部署 MiniCPM-2B-chat 介绍 MiniCPM 是面壁智能与清华大学自然语言处理实验室共同开源的系列端侧大模型&#xff0c;主体语言模型 MiniCPM-2B 仅有 24亿&#xff08;2.4B&#xff09;的非词嵌入参数量。 经过 SFT 后&#xff0c;MiniCPM 在公开综合性…

吴恩达机器学习笔记:第 8 周-13 聚类(Clustering)13.1-13.2

目录 第 8 周 13、 聚类(Clustering)13.1 无监督学习&#xff1a;简介 第 8 周 13、 聚类(Clustering) 13.1 无监督学习&#xff1a;简介 在这个视频中&#xff0c;我将开始介绍聚类算法。这将是一个激动人心的时刻&#xff0c;因为这是我们学习的第一个非监督学习算法。我们…

Nexus 私服禁止 release 包覆盖发布

按照 maven 规范&#xff0c;对仓库中的包使用 snapshot 和 release 进行了区分&#xff0c;前者每次可以覆盖发布&#xff0c;会以时间的方式保留之前的包&#xff0c;并将 snapshot 包依赖下载地址指向最新覆盖发布的包&#xff0c;顾名思义快照包是为了解决我们开发测试过程…

React-css-in-js技术

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容:React-css-in-js技术 目录 1、简介 2、定义样式与使用 3、样式继承 4、属性传递 1、简介 …

Shortened LLaMA:针对大语言模型的简单深度剪枝法

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 论文标题 & 发表会议&#xff1a;Shortened LLaMA: A Simple Depth Pruning for Large Language Models&#xff08;ICLR 2024 Workshop&#xff09; 论文地址&#xff1a;https://arxiv.org/abs/…

Swift-22-复杂数据类型

枚举enum 本小节讨论的枚举是一种基础类型&#xff0c;并不是对象。在Swift中&#xff0c;枚举有很多高级特性。 语法结构 enum EnumName : Type { case... }&#xff0c;其中Type可以省略&#xff0c;{}中定义的枚举体至少包含一个case语句。 一个简单的实现如下&#xff0c…
最新文章