每完成一个阶段就更新本文件。分支命名
feat|fix/p{n}-{slug},单独交付, 跑tsc --noEmit+eslint+prettier --check并贴结果。主机地址、账号与密钥一律不写进本文件,见部署机上的私有交接文档。
| 项 | 说明 |
|---|---|
| 部署 | docker compose build timeamber-app && docker compose up -d timeamber-app(只动 app,Supabase 全家桶不碰) |
| 类型检查 | 部署机不装 node_modules,借构建镜像跑:docker run --rm -v $PWD/src:/app/src:ro -v $PWD/tsconfig.json:/app/tsconfig.json:ro <build-image> npx tsc --noEmit |
| 回滚 | 保留上一版 app 镜像打 tag,docker compose up -d 切回即可 |
两个坑:
npm run build(vite build)不做类型检查,类型错误不会阻断构建,必须单独跑tsc --noEmit。- 构建要后台跑再轮询日志(
setsid ... > build.log 2>&1 < /dev/null &)。直接挂在 SSH 通道里, 通道一断会留下孤儿构建进程,两个并发构建会互相卡死。完整构建约 4–6 分钟。
| 阶段 | 任务 | 状态 |
|---|---|---|
| P0-1 | 文章正文 Markdown 渲染(GFM + Shiki 高亮 + 表格修复) | ✅ 已上线 |
| P0-1b | 正文客户端增强(图片放大 / 代码复制) | ✅ 已上线 |
| P0-2 | 首页「近 7 天访问」空卡片 | ✅ 已上线 |
| P1 | Hero 瘦身 + 卡片修复 + 阴影 token 化 | ✅ 已上线 |
| P2 | 分类页 / Cmd+K 搜索 / 侧栏死链 | ✅ 已上线 |
| P3 | sitemap / RSS / SEO head / 归档折叠 | ✅ 已上线 |
| P4 | 后台概览访问卡片 / Ask 前台化 | ✅ 已上线 |
| 任务 | 内容 | 状态 |
|---|---|---|
| T21 | 全局动效 token 化,移除路由整页过渡 | ✅ 2026-08-03 |
| T22 | 按压反馈与统一 focus-visible 环 | ✅ 2026-08-03 |
| T23 | 暗色模式噪点、琥珀光晕与主题切换质感 | ✅ 2026-08-03 |
| T24 | 文章卡片 hover 提升 | ✅ 2026-08-03 |
| T25 | 首页、归档、友链间距审计 | ✅ 2026-08-03 |
| T26 | 空状态、无结果与骨架屏统一 | ✅ 2026-08-03 |
| T27 | 主题切换图标 morph | ✅ 2026-08-03 |
| T28 | 搜索对话框开合与遮罩动效 | ⛔ 按高频命令面板门禁拒绝 |
| T29 | 回到顶部与阅读进度条动效 | ✅ 2026-08-03 |
| T30 | 移动端抽屉节奏与退出对称 | ✅ 2026-08-03 |
| T31 | Toast 进入/退出与语义图标 | ✅ 2026-08-03 |
| T32 | 首屏文章列表 stagger | ✅ 2026-08-03 |
| T33 | 罕见场景 delight 预算 | ✅ 2026-08-03 |
| T34 | hydration payload 与后台重复请求治理 | ✅ 2026-08-03 |
| T35 | robots.txt 指向 sitemap | ✅ 2026-08-03 |
| T36 | eslint 构建上下文清理 | ✅ 2026-08-03 |
| T37 | createServerFn 校验 API 与当前 TanStack 版本统一 | ✅ 2026-08-03 |
| T38 | 后台登录后浏览器实测 | ✅ 2026-08-03 |
- P0-1b:文章页 5 个
.code-block+ 复制按钮 + 语言标签,26 张图全部挂上medium-zoom-image; 复制实测写入 160 字符与代码块内容一致。 两个根因:① 正文由dangerouslySetInnerHTML注入,React 重新提交该节点会重设 innerHTML、 抹掉客户端插入的 DOM,所以外框结构必须服务端直出、客户端只用事件委托; ②@shikijs/rehype把高亮结果作为嵌套 root 片段插回(hast 类型里Root.children不含Root), 且写的是class而非className,自定义 rehype 插件遍历时两点都要照顾。 - P0-2:SSR 直出 1058 PV + 7 根真实柱子(原本是空容器 +
...,全靠客户端异步填)。 - P1:Hero 从
pt-28+7xl 收到pt-16+5xl,首屏直接见文章;修掉无标签文章并排显示 两个相同分类 chip 的 bug;6 处硬编码oklch阴影收敛成--shadow-glow等 token。 - P2:
/categories从 404 到可用(5 分类 / 360 标签);Cmd+K 搜索命中分类、标签与文章; Navbar 放大镜与侧栏分类此前都是「能点没反应」的死交互。 - P3:
/sitemap.xml1926 个 URL、/rss.xml50 条且描述已去 Markdown 语法; 文章页补齐 canonical / og:url / og:image / article:published_time / twitter:card; 归档页 SSR 从 1921 篇降到 398 篇(按年折叠,条件渲染而非hidden)。 首页 hydration payload 1,042,677 → 875,846 字符(-16%),void 0空占位 9710 → 0。 - P4:后台概览新增近 7 天访问卡片;
/ask前台问答默认关闭, 开关在/admin/settings的「前台功能」区块,附全站限流(每分钟 6 次、每天 300 次)。
docker compose build timeamber-app成功;timeamber-app重建后为healthy,端口映射保持49287 -> 3000。- 生产路由返回:
/、/archive、/categories、/about、/friends、/robots.txt、/sitemap.xml、/rss.xml、文章页、/admin均为 200;未登录访问/admin最终跳转/auth?redirect=%2Fadmin,登录表单可见。 robots.txt生产响应已包含Allow: /、Disallow: /admin、Disallow: /auth与Sitemap: /sitemap.xml。- 浏览器验收使用默认桌面视口与 390×844 临时移动视口:首页、归档、分类、关于、友链、文章页均无横向溢出;文章页长代码片段导致的 443px 内容撑宽已通过外层
min-w-0 w-full修复。 - 交互验收:搜索对话框打开 / Escape 关闭、主题明暗切换、移动端导航抽屉打开 / 关闭均通过;浏览器控制台无应用错误。
- 截图证据共 8 张:首页亮色、首页暗色、首页滚动态、文章页、归档页、390px 首页、移动端抽屉、后台登录边界;均由浏览器验收会话保存。
- 按门禁拒绝
⌘K搜索命令面板的开合 transform / opacity 动画:该入口属于每日高频快捷操作;保留即时打开、即时 Escape 关闭与输入反馈,不牺牲高频可用性。 - T38 后台实测:使用管理员会话逐页验收
/admin、/admin/posts、/admin/categories、/admin/tags、/admin/settings、/admin/backup、/admin/media、/admin/analytics、/admin/ai、/admin/notifications、/admin/github、/admin/diagnostics与/admin/ask;后台真实数据显示1940篇文章、5个分类、391个标签、2个友链,指定文章编辑页单篇加载4304字正文,核心页面无横向溢出。 - T38 修复:后台首屏不再一次性传输约
8,282,290字符正文;首屏只取文章元数据,备份页按每页100篇分批读取完整文章,编辑页按 slug 单篇读取正文;同时为概览、文章、分类、标签补上 hydrated 加载态,避免把异步加载期间的0误显示为空数据。
以下为 2026-08-03 生产域名实测;HTML 为 UTF-8 字节数,gzip 为本地 GZip 重算值,$tsr 为 stream barrier 脚本正文 UTF-8 字节数。
| 路由 | HTML | gzip | $tsr hydration |
|---|---|---|---|
/ |
48,497 B | 8,902 B | 7,609 B |
/archive |
27,196 B | 6,188 B | 3,068 B |
/categories |
46,896 B | 11,908 B | 16,923 B |
/about |
17,145 B | 5,446 B | 2,149 B |
| 文章页 | 61,897 B | 13,441 B | 21,983 B |
P3 阶段此前记录的首页 hydration 口径为 1,042,677 → 875,846 字符(-16%);本次补充记录了最终生产 $tsr、完整 HTML 与压缩后的可复测值,作为后续回归基线。
- 已运行 33 天 18 小时;load average
3.49 / 3.09 / 3.38。 - 内存
15 GiB,已用6.2 GiB,可用9.7 GiB;交换区已用434 MiB。 - 根盘
1.8 TiB,已用58%,可用733 GiB。 timeamber-app、timeamber-worker、Supabase 相关容器均在运行;当前没有名称匹配nextcloud的容器。
- T38 已完成:管理员会话下的后台核心页面、备份分批加载与单篇文章编辑读取均已验收;本轮没有执行发布、删除、同步、导入或设置保存等数据写入动作。
- T37 已重新完成迁移:活动应用源文件中的 45 处
createServerFn().inputValidator()已统一迁移为官方当前写法createServerFn().validator();当前活动源共有 47 处.validator()(含本轮新增的后台分页与单篇读取接口);历史.bak-*快照不参与构建与 lint,保留原样以便追溯。 - 既有 lint warning:ESLint 为 0 errors、11 warnings,均为 Fast Refresh 导出规则与备份页既有 hook 依赖提示;未扩大本轮范围。