Files
vscode-workbench/docs/页面健康检查报告.md
T

80 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 页面健康检查报告
> 检查日期:2026-09-10 · 方式:启动 Django 后端(sqlite 开发库)+ Vite dev server,浏览器逐条访问全部 73 条前端路由,检测 Django 404 劫持 / 白屏 / Vite 错误遮罩 / 渲染内容
> 桌面端(1366×900)73 条全覆盖;移动端视口(390×844)抽查 5 条;SPA 内部导航 1 条
---
## 结论:不是全部正常。核心问题是「前端路由与 API 代理前缀冲突」,直接访问(刷新/分享链接)22 条路由在开发环境打开的是后端响应
**关键背景**:SPA 内部点击导航**不受影响**(客户端路由不经过代理,实测从首页点击"文章资源"正常打开 `/articles`)。**受影响的是直接加载 URL**——用户刷新页面、收藏链接、分享链接、或从外部点进来时触发。
---
## 一、问题清单
### 1.1 开发环境(vite 代理前缀匹配过宽):22 条路由被劫持
vite 代理用**前缀匹配**,`'/api'` 连 `/api-docs`、`/api-detail/x` 一起劫持;`'/s'` 连 `/settings`、`/shorturl-detail`、`/system-message` 一起劫持。
| 被劫持路由 | 命中的代理前缀 | 实际返回 |
|---|---|---|
| /api、/api-directory、/api-docs、/api-detail/1、/api-detail/baidu-translate、/api-detail/currency | `/api` | Django 404 |
| /api/ip-location、/api/password-generator、/api/qrcode-generator、/api/weather-details、/api/air-quality-details | `/api` | Django 404 |
| /articles、/article/1、/article-editor、/article-manage | `/article` | Django 404 |
| /learn、/learn-editor、/learn-manage | `/learn` | Django 404 |
| /user | `/user` | Django 200(返回后端 JSON `{"code":200,"message":"User API index"}`,更迷惑) |
| /user/1 | `/user` | Django 404 |
| /bug、/bug-detail | `/bug` | Django 404 |
| /chat | `/chat` | Django 404 |
| /history | `/history` | Django 404 |
| /messages | `/message`(前缀误伤) | Django 404 |
| /settings、/shorturl-detail、/system-message | `/s`(前缀误伤) | Django 404 |
| /search | `/search` | Django 200(原始 JSON 直接显示在页面上) |
| /tool-detail | `/tool`(前缀误伤) | Django 404 |
### 1.2 生产环境(nginx 正则带尾斜杠 `^/(api|user|article|...)/`):7 条路由被劫持
尾斜杠要求使 `/api-docs` 这类"前缀 + 非斜杠"路由幸免,但**子路径路由**在生产依然命中:
- `/api/ip-location`、`/api/password-generator`、`/api/qrcode-generator`、`/api/weather-details`、`/api/air-quality-details`(5 条数据 API 页面)
- `/article/1`(文章详情页——核心页面!)
- `/user/1`(用户主页)
**生产环境影响面虽小,但被劫持的恰好是文章详情和用户主页这类核心分享场景。**
### 1.3 非问题(确认正常)
- **73 条路由全部无白屏、无 Vite 错误遮罩、无组件崩溃**;渲染失败的只有上述被代理劫持的。
- 十余个"只显示导航栏"的路由(/utility/base64、/qrcode-generator、/profile 等)为**登录守卫慢渲染**,延长等待后正常显示登录引导或页面内容,非缺陷。
- `/agreement` 首次访问白屏是 dev server 首次编译懒加载块超时,重测正常(生产构建无此问题)。
- 移动端视口抽查 5 条(/、/utility、/utility/json-formatter 等)渲染正常,isMobile 分支组件树工作正常。
- `/course-learn` 无参数时显示"缺少章节参数"为预期空态。
- 404 兜底路由(`*`)工作正常。
---
## 二、修复建议(按优先级)
### 方案 A(推荐,改前端路由,一劳永逸)
把与 API 前缀冲突的 7 条生产受影响路由改名:
- `/api/*` → `/open-api/*`(或 `/api-market/*`)
- `/article/:id` → `/article-detail/:id`(或 `/post/:id`)
- `/user/:id` → `/user-home/:id`(已有 `/user-home` 路由可复用)
同步修改所有 `navigation()` 跳转代码。工作量约半天,含全量回归。
### 方案 B(改代理,保住现有 URL)
- **vite**:把宽前缀换成精确正则(如 `^/api/(?!detail|docs|directory)`),仅代理真正的 API 路径——开发环境立即修复,但生产 nginx 仍需同步改写。
- **nginx**:把 `^/(api|user|...)/` 改为仅匹配真实存在的 API 路径列表(枚举 `/api/weather/` 等),给前端子路径路由让路。改动集中但需要逐条核对后端 URL 清单,漏一条就是线上事故。
**建议 A**:URL 是前端资产,趁早改比 API 上线后改便宜;`/article/:id` 在生产被劫持说明这个冲突已经真实咬人。
---
## 三、检查方法备注
- 后端:Django runserver :8002(sqlite 开发库 + seed_tools 数据)
- 前端:vite dev :5173(代理目标 8002)
- 检测逻辑:每路由检查 ① 是否 Django 404/JSON 响应(代理劫持)② #root 是否空(白屏)③ vite-error-overlay(编译错误)④ 正文长度
- 局限:SPA 内部导航仅抽样验证 1 条;登录态页面(任务中心/钱包等)以未登录态检查;移动端为抽查非全量。