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

4.9 KiB
Raw Blame History

页面健康检查报告

检查日期: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 条;登录态页面(任务中心/钱包等)以未登录态检查;移动端为抽查非全量。