yggdrasil/src/router.rs
xfy a282d1dd29 feat: enable wasm-split for route-based code splitting
Enable Dioxus 0.7 automatic WASM bundle splitting by route:

- Add wasm-split feature to dioxus and dioxus-router in Cargo.toml
- Add --wasm-split flag to dx build in Makefile
- Router definitions stay as plain #[route] — splitting is automatic

Dioxus 0.7.9 handles splitting automatically when the feature and
CLI flag are enabled. Per-route #[wasm_split] attributes are not
required (and not supported by this version's derive macro).
2026-06-04 17:32:00 +08:00

80 lines
2.1 KiB
Rust

use dioxus::prelude::*;
use std::sync::Arc;
use crate::components::admin_layout::AdminLayout;
use crate::components::frontend_layout::FrontendLayout;
use crate::context::UserContext;
use crate::pages::about::About;
use crate::pages::admin::{Admin, Posts, Write};
use crate::pages::archives::Archives;
use crate::pages::home::{Home, HomePage};
use crate::pages::login::Login;
use crate::pages::post_detail::PostDetail;
use crate::pages::register::Register;
use crate::pages::search::Search;
use crate::pages::tags::{TagDetail, Tags};
use crate::theme::{use_theme_provider, Theme, ThemePreload};
#[derive(Clone, Routable, Debug, PartialEq)]
#[rustfmt::skip]
pub enum Route {
#[layout(FrontendLayout)]
#[route("/")]
Home {},
#[route("/page/:page")]
HomePage { page: i32 },
#[route("/archives")]
Archives {},
#[route("/tags")]
Tags {},
#[route("/tags/:tag")]
TagDetail { tag: String },
#[route("/post/:slug")]
PostDetail { slug: String },
#[route("/search")]
Search {},
#[route("/about")]
About {},
#[end_layout]
#[nest("/admin")]
#[layout(AdminLayout)]
#[route("/")]
Admin {},
#[route("/write")]
Write {},
#[route("/posts")]
Posts {},
#[end_layout]
#[end_nest]
#[route("/login")]
Login {},
#[route("/register")]
Register {},
}
#[component]
pub fn AppRouter() -> Element {
let theme = use_theme_provider();
let theme_class = match theme() {
Theme::Dark => "dark",
Theme::Light => "",
};
let user = use_signal(|| None::<Arc<crate::models::user::PublicUser>>);
let checked = use_signal(|| false);
use_context_provider(|| UserContext { user, checked });
rsx! {
document::Stylesheet { href: "/style.css" }
document::Stylesheet { href: "/highlight.css" }
document::Title { "Yggdrasil Blog" }
div {
class: "{theme_class}",
ThemePreload {}
Router::<Route> {}
}
}
}