Notes · 2025.12.13
热更新骗过人
演示前整包重来。
Vite 热更新改筛选很快。保存,浏览器里列表就变。我靠这个速度改过智链的列表页,也靠它改过检测平台相关的前端。演示前我仍会停掉、再起一次。热更新里活着的状态,冷启动没有。评委看到的是冷启动。课设答辩也是。我吃过「标签页还开着」的亏:热更新里的假数据把空状态藏起来,评委一问没有结果会怎样,当场才走到那条分支。那条分支只在冷启动里。冷启动才是验收。
热更新里活着的东西
筛选条件、分页、没提交的表单、内存里的 mock、某个「先写死的 token」,都会在热更新里继续活。活着的时候,页面看起来对。关掉进程,再 pnpm 或仓库指定的命令起一次,这些东西没了。没了之后空白、旧数据、登录回到开头,都可能出现。
我吃过一次:筛选项我刚改完,热更新显示空状态文案对了。评委来,我用的是早上没关的那个标签页。标签页里有我下午灌进去的假数据。假数据让空状态走不到。评委问「没有结果会怎样」,我当场才发现文案在另一条分支。那条分支冷启动才会走到。
智链和 TextGuard 都吃过这个亏。记一笔,是因为我会反复觉得「这次只改了 CSS,不用冷启动」。CSS 有时真不用。一改到状态、路由、环境变量,就要冷。环境变量尤其阴:热更新不一定吃新的 .env。不吃还继续用旧值,我还以为改成功了。
评委看到的是冷启动
答辩机、投影、别人的笔记本,都不会接着我的 Vite 进程。他们打开的是我新起的服务,或一份构建产物。构建产物又是另一层:dev 里能过的,build 后路径、base、懒加载可能裂。演示前我至少做两件事:停掉 dev,冷起一次;有构建步骤的,用构建结果点一遍。
课设 100 分那天,我把演示数据冻住。冻数据就是为了冷启动和彩排是同一份。数据在热更新会话里改来改去,评委抽到的那份和对着 PPT 的那份会对不上。对不上的数字,比页面丑更致命。
投影的浏览器还有缓存。冷启动了服务,浏览器仍拿旧的 bundle。我现在的土办法是演示前开一个隐私窗口,或硬刷新一次。土,但比在台上解释「你刷新一下」好看。
空状态和错误比动画先测
热更新很会保留「我刚刚点过一次成功」的记忆。成功路径被记住,空列表、权限错误、超时,反而要专门清状态才能看到。所以我测筛选,会故意把条件选到没有数据,再冷起,看空状态还在不在。
接口挂了只转圈,是热更新很难暴露的。开发时后端也在我旁边热着重连,偶发成功。评委那边网络和权限都不是我的 localhost。前端要把超时和空结果当成功能。这个和 FastAPI 那篇是同一条教训,只是层不同。
Vite 报的全屏错误覆盖,开发时有用,演示时吓人。冷启动若还能看到覆盖,说明构建没走生产那套。演示用生产那套。吓人的红框留给自己。
演示前的停和起
停要真停。端口还占着,新进程起不来,我会以为冷启动完成了,其实还是旧进程。旧进程里有旧状态。检查端口,再起。本机代理 7890 若被前端误当成接口端口,会再制造一种「网络坏了」。端口数字要看一眼。
仓库有 pnpm-lock.yaml 就 pnpm。起的命令跟仓库脚本走,不要发明一条我更短的。更短的命令可能跳过 env 文件加载。跳过了,又是一套热的幻觉。
热更新仍要用
日常改样式、改文案,热更新省时间。省时间的工具我用。我只是不把热更新里的页面当成验收。验收是冷的,是评委的,是构建后的。
限制:我没有把每次保存都配成自动重启。自动重启会更慢,我会去关。关了又靠自觉。自觉会漏。漏了就再记一次:演示前整包重来。
彩排清单里我现在有三条:停进程、看端口、隐私窗口再走一遍筛选到空。三条都土。土的东西在投影上比热更新里的完美状态值钱。完美状态属于我的下午。评委的十分钟属于冷的那一次。冷的那一次若和 PPT 对不上,先冻数据,再解释架构。架构解释救不了空页面。空页面才是他们会记住的。