新手引导选库只解决遮罩和定位,触发时机、权限差异、异步渲染下的目标缺失和完成记录才是真正的工程成本,也是效果好坏的分水岭。
TypeScript 5.3 的导入属性、类型收窄和运行时互操作看着分散,实际都指向同一件事:编译器认得的语法,构建工具和运行环境未必认得,升级前 dev/build/test 三条链路要分别验。
组件从能复用到真好用,差的是抽象边界、受控状态和组合 API 的取舍。什么时候该抽、什么时候该忍住重复,业务表格越抽越大是最直接的反例。
Next.js 14 该不该跟,要看 Turbopack、Server Actions、部分预渲染背后 App Router 改变了哪些默认认知,而不是新特性列表。我们主用 Vue,这篇是隔壁生态的一次评估。
Web Components 值不值得用,判断标准是组件要不要跨框架、跨页面分发。这篇讲清它适合用在什么场景,以及表单集成、样式互不干扰、事件通信这几处必须提前踩过的成本。
无限级菜单看着是个递归组件,实际牵着路由高亮、权限过滤、图标映射和接口数据清洗。这篇把该在数据层收干净的活,和只留给递归模板的活拆清楚。
XSS、开放跳转、依赖漏洞这些前端安全问题往往不需要高深攻击技巧,一个未过滤的富文本就能捅出娄子。这篇把日常项目该守住的几条底线一条条讲清楚。
WebP 能把图片体积压下去,但这份收益要拿兼容回退、缓存协商和响应式尺寸的工程成本来换。这篇算清楚 WebP 到底省了多少、又要多担哪些事。
CSS 项目做久了没人敢删、改一处崩一片,常被归咎为选型不对,其实根子在归属不清。职责分层、cascade layers、设计变量、命名归属和第三方覆盖集中,才是治理样式的抓手。
CSS 原生滚动时间线 scroll()/view() 上个月刚随 Chrome 115 落地,只有 Chrome 支持、还带实验性质。生产上怎么继续用 JS + IntersectionObserver 稳住,怎么在内部项目里小心尝鲜原生方案,是这篇要说清的。
什么布局该用 Grid、什么该用 Flex,判断依据不是喜好,而是这块结构里有没有需要同时对齐的行和列。轨道、minmax、区域命名、min-width:0 这些细节决定 Grid 好不好用。
WebSocket 断开不触发 onclose、页面显示在线却收不到消息,这类半开连接怎么发现、怎么重连、重连后数据怎么对齐,是实时前端真正难的部分。
Hooks 难的不是记 API,而是理解闭包和依赖数组:请求重复发、按钮读到旧状态、effect 死循环,背后都是同一套渲染机制。这篇整理了我验证这几个问题时留下的笔记。
条件类型的分布式行为为什么会把 boolean 拆成 true | false?infer 到底在推断什么?路由参数能不能直接从路径字符串里提取出类型?半年来在真实项目里用条件类型和模板字面量类型攒下的笔记,以及类型编程该在哪里停下来。
哪些图该懒加载、哪些绝不能懒,是这篇要讲清楚的判断标准:屏外的列表图该延后请求,首屏的 LCP 主图一旦被 loading=lazy 延后反而拖慢首屏。文中覆盖原生 lazy、fetchpriority、IntersectionObserver、占位尺寸与加载失败的补救。
包体积膨胀真正的成本不在压缩,而在分析、拆分和取舍:图表库富文本被打进首屏、公共 chunk 越抽越大、一行 import 引回大依赖,本文讲清楚这些代价怎么算、怎么用体积预算把它卡住。
flex item 被内容撑出容器、z-index 加到六位数仍被遮住、overflow: hidden 一开就连累 sticky,这些布局问题背后都是浏览器的布局与层叠规则,本文按盒模型、收缩、层叠上下文一路拆到底。
响应式规则、props 单向流、watch 该管什么这些 Vue3 坑大多不是语法问题,而是组件逻辑该怎么组织没理清。这篇把自己从 Vue2 迁过来踩过的几个坑连同验证方法一起记下来。
页面卡顿时该先看什么:先把慢分成首屏、切换、滚动、输入四类,再用 Performance 面板、Web Vitals 和真实用户指标把资源、请求、主线程逐层验证,而不是先归因给框架。
组件的可复用性不等于可配置项越多越好,边界该划在哪:基础组件收着做、业务组件贴场景做,props 表达语义而非样式细节,扩展口只当逃生通道。这篇把这几条判断标准讲清楚。
Postgres、Blob、KV 分别对应结构化数据、大文件和临时缓存,边界一旦划不清,小工具很快就会变成谁都说不清结构的烂摊子。三者的分工、Serverless 下的连接数陷阱和迁移前置代价,按数据特征逐一说清。
请求库管的范围正从单纯的 HTTP 客户端往请求状态管理扩展:loading/data/error 三件套重复、旧请求覆盖新结果、缓存 key 设计,这些问题不是换个库名就能解决的,引入新方案的工程代价也要算清。
一个子组件抛错就能让整棵 React 树卸载、整页白屏。Error Boundary 怎么让错误只炸自己那一块、它捕获不到哪些错误、边界放在哪几层,以及 fallback 与错误上报该带什么。
CSS Custom Highlight API 让文本高亮不必再往 DOM 里插 mark 标签:怎么用 Range 注册高亮、多节点匹配的复杂度、::highlight() 的样式边界,以及 Safari 尚未支持时的降级取舍。
E2E 测试该测什么、不该测什么:关键路径优先于覆盖率,选择器、网络等待、登录态复用和 CI 稳定性都要服务于这个取舍。
响应式布局不是让页面在窄屏下不溢出,而是在不同设备上重新分配内容优先级;媒体查询只是实现手段之一,Grid 自适应、容器查询、单位选择、真机适配各解决其中一环。
TypeScript 的类型只在编译期成立,用户输入、接口返回、localStorage 都在运行时进来,类型管不着;这篇讲怎么用 Zod 把运行时校验和类型收敛到同一份 schema,避免两套规则各说各话。
代码评审真正该拦的是接口失败后 loading 不恢复、权限变化菜单不刷新、按钮能重复点这类维护风险,而不是分号和命名;这篇讲怎么按状态流转、异常路径、组件职责给同事讲清楚一条评审意见值不值得改。
同一份状态该进 store、进 URL 还是交给 React Query,判断依据是它的生命周期和归属,而不是写起来方不方便;这篇把 Zustand 的拆分、选择器、派生和持久化这几个取舍讲清楚。
H5 调起摄像头本身没什么难度,难的是拍完之后的图片压缩、方向修正、权限提示、上传重试和 WebView 兼容。
移动端适配别只盯 rem 公式,真机视口、安全区、动态地址栏和表单键盘才是上线后最容易翻车的地方。
服务端状态和本地状态是两回事:缓存新鲜度、mutation 后的失效范围、错误结构统一,这些 React Query 要解决的问题,手写 loading/data/error 很难兜住。
表单草稿、权限开关、接口 payload 经常是同一个业务模型的不同视角,如果每份都手写类型,字段一改就容易漏同步;映射类型能让这些类型互相推导出来。