将本轮三轮调试(commits 79978aa / 1c56fd8 / f86cb48)踩到的同一 Dioxus 0.7 陷阱写入 Pitfall Log,避免后续重复踩坑: use_server_future / use_resource / use_memo 只在闭包内读取的 signal 变化时 重跑/重算(经 ReactiveContext 订阅)。普通组件 prop(String/i32 等非 signal) 被 move 进闭包后是冻结快照,读取它不建立订阅——prop 变化时 hook 不刷新, 组件虽重渲染但 hook 永久保留首次值。 该陷阱只在「同路由变体间导航」(/post/a → /post/b)触发:复用组件实例、仅 更新 props;跨变体导航会新挂载组件、hook 首次运行,掩盖问题。 记录两个真实案例(路由取数 use_server_future、正文解析 use_memo)的根因与 修复,给出判断规则(signal 依赖安全 / prop 依赖会静默过期 / prop 派生值 优先内联而非 use_memo),并标注 CommentSection 依赖 article key remount 才安全的潜在隐患。
Yggdrasil
基于 Dioxus 0.7 的全栈博客系统,Rust 单一代码库同时编译为 WASM 前端和原生服务端。
技术栈
- 框架: Dioxus 0.7 (fullstack)
- 数据库: PostgreSQL + tokio-postgres
- 样式: Tailwind CSS v4
- 密码: Argon2
- 会话: UUID token + cookie
功能
- 邮箱注册 / 登录(单管理员模式,首次注册后关闭)
- 会话管理与自动过期清理
- 暗色 / 亮色主题切换
- 后台文章撰写(Tiptap Markdown 编辑器)
- 文章归档与标签浏览
开发
依赖 Rust 1.95+、wasm32 目标、dx CLI、tailwindcss CLI v4 和 PostgreSQL。
# 配置数据库
DATABASE_URL=postgres://postgres:postgres@localhost:5432/yggdrasil
# 运行迁移(自动创建数据库并按顺序执行 migrations/ 下所有 SQL)
./migrate.sh
# 启动开发服务器
make dev
构建
make build
生产部署
生产环境必须前置反向代理(nginx/Caddy)做 TLS 终结,并设置 APP_BASE_URL、
COOKIE_SECURE=true、TRUSTED_PROXY_COUNT=1。详见 部署指南。
Description
Languages
Rust
77.4%
TypeScript
17.2%
CSS
3.3%
Dockerfile
0.9%
Makefile
0.6%
Other
0.6%