浏览器实测(preview 构建,生产规模数据):首页解压后 1428 → 1112KB, 未登录的题目详情页 3317 → 2021KB。后端接口 6–8ms,不是瓶颈,没动。 首页: - 登录速报弹框挂在默认布局上,静态 import 了 md-editor-v3(~160KB JS + 76KB CSS), 而 AI 分析只在登录后、提交满 3 次才有。MdPreview 改成异步组件,目标是本地包装 LoginSummaryPreview.vue —— 直接 import("md-editor-v3") 会让 rolldown 把它和 CodeMirror 语言包并成一个 467KB 的 chunk,排名页反而涨了 560KB(实测) - 题目列表经 oj/api.ts 还带着 zod(~70KB):那个文件静态 import 了题目详情、提交详情 两个 schema。改成和请求并行动态加载(单独的 oj/detailSchemas.ts,理由同 profileSchema.ts),闸门仍是同步的 —— submissionDetailSchema 有 .catch(), 不能改 contractDeferred 题目详情页: - skulpt(~226KB gzip)原来一选 Python 就立刻预取。改成登录后才取(没登录交不了), 且等 requestIdleCallback,不和题面、编辑器抢带宽 - StatisticsPanel 只有老师可见,却被 EditorToolbar 静态 import,每个学生都白拉一份 chart.js(~68KB gzip)。改成异步组件,打开课堂统计时才加载 - SubmissionResult(带 DataTable)改成异步组件,第一次提交弹出结果面板时才加载 浏览器核过:首页正常;详情页未登录不再加载 skulpt / chart.js / DataTable;学生登录后 skulpt 空闲预取、提交后结果面板正常弹出;老师点课堂统计按需加载图表并正常渲染。 登录速报的 AI 分析与语法错误拦截路径本机没能触发,未在浏览器里核。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
后端: - getUserByToken → authenticateToken:它会删会话、续 TTL、记在线,不是纯读 - todayStart → dayStart(instant):本来就接受任意时刻,不只是「今天」 - objectValue → asRecord,删掉 4 份一模一样的私有拷贝和 `as toObject` 别名 - 报错文案 "does not exists" / "Already be a public problem" 改通顺 前端: - utils/types 里 Contest / User / Problem 三个别名删掉:Contest 原来指后台 比赛、契约里同名的却是学生侧。现在 Contest = 学生侧、AdminContest = 后台, 后台用户表单叫 AdminUserForm,题目详情直接用 ProblemDetail - SubmissionInfo → ContestSubmissionInfo,免得和 submission.info 撞名 - utoa / atou → compressToBase64 / decompressFromBase64(实际是 zlib + base64), encode / decode → base64EncodeUtf8 / base64DecodeUtf8 - filterResult → toProblemRow、toProblemListItem → toAdminProblemRow, 行字段 submission / rate → submissionCount / acRate - 组件:Modal → AddFromLibraryModal、Form → EditorToolbar、 ContestEditor → BasicEditor(题单也在用它)、rank 的 Index → RankMedal、 Name → UserNameCell、Password → PasswordCell、ContestType → ContestAccessTag Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>