yggdrasil/main.rs
1//! 程序入口与目标选择。
2//!
3//! 服务端启动流程与 Axum 路由组装位于 [`startup`] 模块;本文件只负责
4//! 双目标入口和服务端专用的全局内存分配器。未启用 `server` feature 时,
5//! 直接启动 WASM 前端。
6// 全局内存分配器:mimalloc。
7// 多线程高频小对象分配场景下吞吐显著优于系统 malloc,且对全静态 musl 链接友好。
8// cfg 门控(与项目「双目标编译」约定一致):
9// - feature = "server":分配器只服务端二进制需要。
10// - not(wasm32):mimalloc_rust 在 wasm32 上无法编译(mimalloc_rust Issue #76),
11// WASM 前端走默认分配器。两个门控同时满足才注册。
12#[cfg(all(feature = "server", not(target_arch = "wasm32")))]
13#[global_allocator]
14static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;
15
16// 业务模块
17mod api;
18mod auth;
19// build_info:编译期注入的 git/rustc/构建时间信息。模块内部 gate 在 server feature,
20// 模块声明本身不需要再加 cfg(空模块在 WASM 端也能编译)。
21mod build_info;
22mod cache;
23mod components;
24mod config;
25mod context;
26mod db;
27pub mod infra;
28// highlight 模块仅在服务端构建时编译
29#[cfg(feature = "server")]
30mod highlight;
31// middleware:Axum 中间件与启动期纯函数(cache-control / admin 守卫 / 压缩层),
32// server-only。从 startup.rs 抽出以便独立测试,路由组装处以 crate::middleware::xxx 调用。
33mod hooks;
34#[cfg(feature = "server")]
35mod middleware;
36mod models;
37mod navigation;
38// mcp:Model Context Protocol 服务器(/mcp Streamable HTTP,bearer token 鉴权)。
39// 仅 server feature 编译;WASM 前端不引用任何 mcp 符号。
40// allow(dead_code):原用于掩盖 T1 tracer bullet 期间未接线的 mcp/resources.rs(273 行
41// 完整资源子系统,从未 override ServerHandler::list_resources/read_resource)。
42// 已删除该模块(D1)—— MCP 现无死代码,allow 同步移除,以免未来再次静默掩盖死代码。
43#[cfg(feature = "server")]
44mod mcp;
45mod pages;
46mod router;
47// ssr_cache 仅在 server feature 启用时编译;保存 SSR 世代号失效状态。
48#[cfg(feature = "server")]
49mod ssr_cache;
50#[cfg(feature = "server")]
51mod startup;
52
53mod tasks;
54mod theme;
55// bridges:libs/ 下各 JS IIFE(tiptap / codemirror / xterm)的 wasm-bindgen 桥接层。
56mod bridges;
57mod utils;
58
59/// 程序入口
60fn main() {
61 #[cfg(feature = "server")]
62 startup::run();
63
64 #[cfg(not(feature = "server"))]
65 {
66 use router::AppRouter;
67 dioxus::launch(AppRouter);
68 }
69}