用户反馈:登录后点「数据导入」,界面变成一片空白。
排查与根因:用无头 Chrome(CDP 远程调试)复现后,控制台报:
[Vue warn]: Failed to mount component: template or render function not defined.
found in
---> <DataImport> at src/views/DataImport.vue
traffic-audit-web/src/views/DataImport.vue 缺少最外层的 <template> 开标签,文件直接从 <el-container> 开始。SFC 没有 template 块 → vue-loader 编不出 render 函数 → 组件挂载失败 → 整页空白(#app 只剩 78 字符)。
历史沿革(git log -S "SKIP/CHECK"):
| 提交 | 文件首行 | 状态 |
|---|---|---|
0f7b7d1^ |
<template> |
正常 |
0f7b7d1 |
SKIP/CHECK (0): TYPE_LABELS upper <template> |
首行被标记文字覆盖 → 已损坏 |
da614c0 |
<el-container direction="vertical"> |
标记行被删掉,<template> 仍未补回 → 仍损坏 |
| 本次修复 | <template>(已补回) |
正常 |
修复:在文件首行补回 <template>(一行改动,未动其余内容)。
http://localhost:8080(vue-cli-service 开发服务器,改后 17:44:48 重新编译成功)。--remote-debugging-port=9222 + CDP(Page.navigate / Runtime.evaluate / 控制台事件捕获),先在 sessionStorage 写入登录 token 再访问受保护路由。| 编号 | 输入 | 预期 | 实际 | 结论 |
|---|---|---|---|---|
| TC-1 | 修复前访问 #/import(登录态) |
复现用户问题 | 控制台 Failed to mount component … <DataImport>;#app innerHTML 长度 78,页面无文字 |
复现成功 |
| TC-2 | 修复后访问 #/import |
页面正常渲染 | #app innerHTML 长度 20,821;可见「导入业务数据 / 报表期 / 选择数据类型(道路货运 公路旅客 城市客运 站场投资 货运能耗季报)/ 模板:模板_交企统H203-2表… / 导入结果(2026-09)/ 导入进度」 |
通过 |
| TC-3 | 修复后控制台 | 无 Vue/JS 错误 | 错误事件数 0(含 Runtime.exceptionThrown、console.error) |
通过 |
| TC-4 | 全量路由扫描 #/dashboard、#/import、#/data、#/explain、#/audit、#/report、#/rules、#/users |
8 个页面都能渲染、无报错 | 8/8 渲染成功(innerHTML 长度 4,409~293,029),每个页面错误数均为 0 | 通过 |
| TC-5 | 静态检查所有 .vue 是否以 <template> 开头 |
无同类问题 | 13 个 .vue 文件中仅 DataImport.vue 异常,修复后全部 OK |
通过 |
| TC-N1 | 负向:用带 hash 查询串的地址访问 #/import?t=… |
说明路由不匹配时的表现(辅助定位) | 路由无匹配 → 空白且无报错(与本次 bug 现象不同,据此排除了缓存假象) | 通过(定位用) |
0f7b7d1 那次的补丁把 <template> 换成了 SKIP/CHECK (0): TYPE_LABELS upper <template> 这样的说明文字。提示:以后改 SFC 首行要复核首行是否仍是 <template>。Page.reload({ignoreCache:true}) 才能拿到新编译结果(测试方法记录,非产品问题)。Ctrl+F5)即可恢复使用。