无限滚动为什么会跳到新底部:一次滚动快照恢复的复盘 无限滚动最容易让人误判的一类问题,是“数据明明追加了,但页面看起来像没有追加”。 这次遇到的现象就是这样:第一页正常展示,滚到底触发第二页请求,接口也返回了新数据,合并后列表数量也对。但页面在第二页回来的一瞬间猛地往下跳,直接贴到新的底部。视觉上,用户会以为第二页没有插到当前视口下面,而是列表直接进入了“没有更多”。 一开始很容易怀疑去重、分页游标或虚拟滚动库。最后真正的问题不在这些地方,而是滚动 2026-07-22
Tailwind @apply 不是把 class 搬进 CSS:哪些写法不能内联 很多人会把 Tailwind class 理解成 CSS 预设,但 @apply 只会内联 Tailwind 能识别并生成声明的 utility。文章从 CSS 值、group/peer 标记、自定义 class、v3/v4 的 @utility 和 @reference 差异讲清边界,并给出 lint 与编译检查的护栏。 2026-07-21
别等 review 才想起 SSR:给 Nuxt 模块级 composable 补上静态护栏 一次 Profile 移动端吸顶状态重构里,review 才发现模块级 composable 没有 SSR 分支。文章复盘为什么 Pinia、useState、VueUse 这些成熟方案只能解决一部分问题,以及如何用项目 Skill、自定义 ESLint 规则和 focused test 把 client-only source 的边界提前挡住。 2026-07-16
状态归属比组件封装更重要:一次 Profile 外层错误边界重构 一次 Profile 页外层状态重构里,加载、错误、空态和内容不可用被同一个 blocker 混在一起,导致状态切换和组件命名越来越难解释。文章记录如何先按 owner 拆开四态,再把 v-loading、CommonRenderErrorBoundary、CommonEmptyState 收进一个薄 StateHost,而不让公共组件抢走业务状态归属。 2026-07-15
用 const enum 和字符串值类型保留公开 API 的自然写法 组件和工具 API 里经常同时需要两种语义:内部代码希望用有名字的 enum 分支,外部调用方又希望直接传普通字符串。文章用 const enum 和 `${Enum}` 派生字符串值类型,把命名常量、公开字符串 API、lint 护栏和适用边界拆清楚。 2026-07-14
当组件只有一个调用方:可选 props 为什么应该被 lint 管住 一次 Vue 组件重构里,单调用组件仍然保留可选 props,导致父子契约变松、子组件继续写防御判断。文章记录为什么 optional props 是 API 契约,不只是默认值问题,以及如何用全仓组件调用图、defineProps AST 和架构 lint 把这类退化提前挡住。 2026-07-14
Composable API 为什么要默认用对象边界 业务 composable 和页面 helper 的入参、返回值默认用对象,核心价值是降低 API 演进成本。文章从位置参数、单值返回、对象解构和无参 resolver 四种写法出发,整理什么时候该用对象边界,什么时候可以保留底层工具式 API。 2026-07-13
Nuxt plugin 抢跑 Pinia 为什么会把应用启动打挂 一次 Nuxt 客户端插件为了抢在 WebSocket 建连前注册监听使用 pre 时序,结果早于 @pinia/nuxt 执行,启动阶段调用 useAppStore 触发 getActivePinia。文章复盘 plugin 顺序、Pinia 激活点、dependsOn 修复和脚本化 lint 护栏。 2026-07-13
Nuxt 自动导入不该靠自觉:一次组件和 Vue API import 的 ESLint 护栏 Nuxt 会自动导入组件和常用 Vue API,但手写 import 很容易在重构后留下冗余、deep import 和路径耦合。文章记录一次只用 warn、不做 autofix 的 ESLint 护栏:怎么限定扫描范围、给出建议写法、放过非 owner 模块,并用扫描统计和测试支撑渐进治理。 2026-07-09
别让一个 composable 承担两种身份:一次 Profile 全局状态重构 一次 Nuxt Profile 页重构里,Header 和 Profile 共用的 useMeProfile 同时承担当前登录账号和当前路由用户两种语义,导致刷新链路、SSR 首帧和账号切换都变得含糊。文章记录如何把 source owner 拆成当前账号身份、当前账号基础资料、当前账号原始数据和路由 Profile source,并补上 stale response、写后刷新和单测护栏。 2026-07-09