Rust Trip 系列
Coding

Leptos-Tailwind_Fuse-Bindgen开发入门

介绍了如何在入门leptos0.6和tailwind3.0的csr开发

Hako Chest
更新于
4862 字
6 min read
Leptos-Tailwind_Fuse-Bindgen开发入门

又是一个陈年老博客,现在tailwind已经4.0了,leptos也已经7.0了,下面记载的很多都没有参考价值了,仅仅作为第一批博客来凑个数

最下面还包含了Osynic最初的构思,一开始还是打算all in rust的,不过现在前端还是vue写起来最舒服

Osynic

快速入门Leptos的csr开发

前期准备

安装rust工具链,直接去官网就行

安装trunk和wasm

cargo install --locked trunk
rustup toolchain install nightly
rustup default nightly
rustup target add wasm32-unknown-unknown

初始化leptos项目

新建项目文件夹并初始化cargo项目

mkdir your-leptos-project-name
cd your-leptos-project-name
cargo init

在Cargo.toml里面写入依赖

leptos = { version = "0.6.11", features = ["csr"] }

在main.rs里面初始化构建App页面

use leptos::*;

#[component]
fn App() -> impl IntoView {
    view! {
        <div>
            <h1>{"Hello, World!"}</h1>
        </div>
    }
}

fn main() {
    mount_to_body(|| view!{ <App />})
}

在项目根目录新建一个index.html文件,作为trunk的入口

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Leptos</title>
  </head>
  <body></body>
</html>

通过trunk运行网站

trunk serve

如果有定制化需要还可以新建一个Trunk.toml,默认配置是这样的,具体配置问GPT或者去官网

[build]
dist = "dist"
public_url = "/"
hash = false
inline = false
cache = ".trunk-cache"

[serve]
port = 8080
fallback = "index.html"
open = false
host = "127.0.0.1"
autoreload = true

入门要点

可以看结合文档学习, 注意:GPT写的很多代码都是老的,例如0.5,里面会有cx:Scope这种写法,现在已经不需要了

  • porp属性来写参数

  • signal响应式

  • 类jsx语法

  • 在view!里面写页面逻辑

  • #[component]下面写组件

  • 组件的返回值是impl IntoView

相关网站

Rust WebAssembly Leptos Trunk TailwindCSS TailwindFuse ThawUI

Osynic之中的Leptos开发设计与体验

  • 使用的UI框架以及工具库如下

    • ThawUI
    • Tailwind_Fuse
  • 项目结构

    • components
      • downloader.rs
        • DownloadItem()
        • DownloadItemList()
      • pickuper.rs
        • PickupItem()
        • PickupItemList()
      • mod.rs
    • views
      • app.rs
        • App()
      • mod.rs
    • main.rs

Tailwind 在 Leptos框架中的使用

首先还是先生成tailwind配置

npx tailwind init

然后在配置文件里面加上rs文件类型

// tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ["./src/**/*.{html,js,rs}"],
  theme: {
    extend: {},
  },
  plugins: [],
};

新建一个input.css

@tailwind base;
@tailwind components;
@tailwind utilities;

然后监听生成output.css

npx tailwindcss -i input.css -o output.css

最后在index.html里面引入output.css即可

<link data-trunk href="./output.css" rel="css" />

Tailwind_Fuse 安装与使用

这样安装就行

tailwind_fuse = { version="0.3.0", features=["variant"] }

主要就是使用tailwind的样式,然后可以通过cvs来管理样式模板

例如下面是官网的示例代码,已经很清晰如何使用了,

use leptos::*;
use tailwind_fuse::*;

#[component]
pub fn Button(
    #[prop(into, optional)] variant: MaybeSignal<ButtonVariant>,
    #[prop(into, optional)] size: MaybeSignal<ButtonSize>,
    #[prop(into, optional)] class: MaybeSignal<String>,
    #[prop(attrs)] attributes: Vec<(&'static str, Attribute)>,
    children: Children,
) -> impl IntoView {
    let class = create_memo(move |_| {
        let variant = variant.get();
        let size = size.get();
        let button = ButtonClass { variant, size };
        button.with_class(class.get())
    });

    view! {
        <button {..attributes} class=class>
            {children()}
        </button>
    }
}

#[derive(TwClass, Clone, Copy)]
#[tw(
    class = r#"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors
               focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50"#
)]
pub struct ButtonClass {
    pub variant: ButtonVariant,
    pub size: ButtonSize,
}

#[derive(TwVariant)]
pub enum ButtonVariant {
    #[tw(
        default,
        class = "bg-primary text-primary-foreground shadow hover:bg-primary/90"
    )]
    Default,
    #[tw(class = "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90")]
    Destructive,
    #[tw(
        class = "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground"
    )]
    Outline,
    #[tw(class = "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80")]
    Secondary,
    #[tw(class = "hover:bg-accent hover:text-accent-foreground")]
    Ghost,
    #[tw(class = "text-primary underline-offset-4 hover:underline")]
    Link,
}

#[derive(TwVariant)]
pub enum ButtonSize {
    #[tw(default, class = "h-9 px-4 py-2")]
    Default,
    #[tw(class = "h-8 rounded-md px-3 text-xs")]
    Sm,
    #[tw(class = "h-10 rounded-md px-8")]
    Lg,
    #[tw(class = "h-9 w-9")]
    Icon,
}

ThawUI 安装与使用

这样安装就行

tailwind-fuse = { version="0.3.2", features=["csr"] }

官网使用例代码

use leptos::*;
use thaw::*;

fn main() {
    mount_to_body(App);
}

#[component]
pub fn App() -> impl IntoView {
    view! {
        <Button variant=ButtonVariant::Primary>"Primary"</Button>
    }
}

开发Osynic的初步分工

V1作为纯离线版本的开发,前后端的压力都不太大 前端主要解决一下列表和布局的问题 后端则是功能和交互接口的设计了

  • 后端开发
    • 单面下载(读取json+错误处理)
    • 批量下载
    • 同时下载数量设置
    • 下载进度显示(传给前端)
    • 根据本地路径
    • 解析json拿到对应的songid的向量
    • 登录把账号密码存到json,这个存到exe原生
    • 读取设备信息,存储到json
  • 前端开发
    • 请求后端接口,把账号密码,文件地址和OSU地址传给后端
    • 按钮组件
      • 获取本地铺面列表
      • 开始下载
      • 暂停下载-继续下载-取消下载(如果简单可行的话)
    • 表单组件
      • 账号-密码 登录
      • OSU地址 JSON保存地址
      • 设置同时下载次数(最好不要超过8)
    • 列表渲染
      • 下载中-已下载 左右划分
      • 列表铺面预览 (三分法了?还是说UI还要再设计一下)
  • 应用构建
    • 打包配置
    • 嵌入后端
    • 资源配置
    • ICON设计
    • 发行实测
#Leptos #Tailwind #Fuse