无犯罪公证怎么办?2026年线上公证小程序横评
2026/7/1 14:59:17
项目基于 Vue3 + Vue Router + 动态路由,在开发环境运行正常,但打包部署后出现路由切换白屏、无报错、刷新会正常加载的问题。最终定位为keep-alive 的 include 使用了路由 name,而非组件 name,在生产环境异步组件场景下直接阻断渲染。本文给出问题判断依据、根因分析以及最小改动的稳定解决方案。
keep-alive 的 include 只能匹配组件的 name,不能使用路由 name。
错误使用方式在开发环境可能“看起来正常”,但在生产环境 + 动态路由 + 异步组件下会直接导致页面白屏。
| 场景 | 结果 |
|---|---|
| 本地 dev | 正常 |
| build 后部署 | 路由切换白屏 |
| 控制台 | 无报错 |
| 刷新页面 | 偶发恢复 |
// guards.tsconstcurrentComName=to.matched.find(item=>item.name===to.name)?.name;<keep-alive:include="keepAliveComponents"><component:is="Component"/></keep-alive>to.name→路由 namekeep-alive include→组件 name路由 name ≠ 组件 name keep-alive 只认组件 name include 不匹配 → 缓存失败 → 渲染被阻断 → 白屏route.fullPath强制重新渲染<template> <RouterView> <template #default="{ Component, route }"> <div v-if="!Component"> ❌ 组件加载失败:{{ route.path }} </div> <component v-else :is="Component" :key="route.fullPath" /> </template> </RouterView> </template>修改点:
<keep-alive><transition>route.fullPath作为 keyconst matchedRoute = to.matched.at(-1); console.log('route matched', { path: to.path, hasComponent: matchedRoute?.components?.default, });| 项目 | 修改前 | 修改后 |
|---|---|---|
| 路由切换 | 白屏 | 正常 |
| 页面刷新 | 偶发 | 稳定 |
| keep-alive | 异常 | 移除 |
| 生产可控性 | 低 | 高 |
如必须使用 keep-alive:
nameto.matched[].components.default.name获取一句话总结:
这是一次典型的「开发环境掩盖问题,生产环境放大问题」的 keep-alive 使用边界错误。