用户输入一旦被当成 HTML 插进页面,风险就已经埋下了:XSS 的常见入口、富文本清洗、Token 存储的取舍,以及 CSP 从 Report-Only 到正式收紧的落地路径。
用 Docker Compose 管理数据库、缓存和消息队列等开发依赖,减少本机环境差异,讲清楚数据卷什么时候会保留、健康检查该测到什么程度才靠谱。
国际化不是把文案抽成 JSON 那么简单:文案 key 怎么组织才不冲突、日期数字格式为什么不能手写、长文案怎么撑坏布局、RTL 和翻译流程各自要提前踩的坑。
媒体查询看的是屏幕宽度,但组件真正关心的是自己被放进了多宽的容器——CSS Container Queries 的写法、containment 带来的副作用、适用场景,以及和媒体查询的分工。
把几十个字段都塞进一个 `useState` 对象,短期顺手,字段一多就会失控——字段状态、校验分层、联动逻辑和提交错误各自该放在表单架构的哪一层。
Service Worker 注册容易,但缓存策略想不清楚,用户会长期停留在旧版本、接口数据错乱——生命周期、不同资源的缓存策略、版本更新和断网时的退路该怎么分工。
React 组件为什么会被牵连着重新渲染:状态边界怎么划、memo 和 useCallback 什么时候真的有用、长列表和 Profiler 排查该按什么顺序来,而不是页面一卡就到处加缓存。
Next.js 到底该在什么项目上用:纯中后台为什么大概率不划算、`'use client'` 边界怎么画、App Router 缓存分几层、以及静态生成和流式渲染在内容型站点里的实际取舍。
列表页的筛选条件到底该放在组件 state 还是 URL 里,判断标准很直接:能不能分享、刷新后要不要保留、需不需要被搜索引擎理解。梳理参数分类、URL 解析防御、push/replace 的选择,以及几个真实会踩的编码坑。
`await fetch()` 加 `try/catch` 只是异步的语法层。真正决定代码经不经得住真实用户折腾的,是请求竞态怎么处理、多个异步任务里一个失败要不要拖累全部、以及循环里的 await 有没有被正确等待。
构建慢不一定是打包工具的锅:依赖体积、类型检查覆盖范围、缓存命中率、代码生成方式,任何一处出问题都会拖慢构建,换工具往往只是把慢延后了。
用户已经觉得页面慢了,开发手上却没有任何证据——Web Vitals 怎么采集才可靠、错误监控怎么带上下文、接口耗时和用户行为怎么串成一条能复现问题的时间线。
接口明明返回了新数据,页面却还是旧的——App Router 里叠着 Request Memoization、Data Cache、Full Route Cache、Router Cache 好几层,不分清楚各自的作用域和失效方式,只会越加 `no-store` 越乱。
覆盖率 80% 不代表核心链路安全:测试资源该按风险而不是按代码行数分配,单元测试、组件测试、E2E 和 Mock 各自该守住哪一层。
TypeScript 5.5 让 filter 之后的类型收窄不再需要手写类型谓词,本文梳理这个推断改进能覆盖到哪一步、satisfies 与 as 的取舍、以及严格模式分阶段落地的具体做法。
手动维护 isSubmitting、error、formValues 这套状态组合,是表单代码变臃肿的根源。React 19 的 Actions、useActionState、useFormStatus 和 useOptimistic 把提交状态、乐观更新和错误处理从组件状态里拆出来,本文梳理具体的写法取舍和并发提交下的坑。
微前端不是性能优化手段,也不是万能拆分方案,它换来的是组织协作上的独立交付,代价是运行时复杂度——判断该不该拆、边界怎么划才是真正的难点。
Node.js 里的 fetch、Web Streams、AbortController 和内置测试工具正在和浏览器端趋同:本文梳理超时取消怎么用 AbortSignal 组合实现、SSE 流式解析里多字节字符截断怎么正确 flush、以及原生 test runner 能替掉多少第三方依赖。
TypeScript 类型只能保证前端自己代码里的一致性,保护不了后端实际返回的数据——接口类型来源、错误码结构、运行时校验和 Mock 数据,怎么设计才能真正拦住脏数据。
Vite 的开发体验快不代表生产构建就稳:依赖预构建缓存失效、Rollup 分包策略、环境变量该暴露给谁、CJS/ESM 混用踩的坑,以及发版窗口期 chunk 404 该怎么从架构层面接住,这些才是工具链落地时真正要处理的问题。
首屏慢很多时候不是 JS 的问题,而是图片显示 360px 却下载了 2000px 的原图——LCP 图片怎么排查、响应式图片怎么配置、懒加载和占位尺寸各自该怎么取舍。
同一个页面卡顿,可能是 JavaScript 占住了主线程,也可能是布局计算太频繁,还可能是绘制区域太大——不搞清楚 DOM、CSSOM、布局、绘制、合成这几层各自在干什么,排查只能靠试。
React Hydration 为什么要把整个组件重新执行一遍,Qwik 的 Resumability 又是怎么绕开这次重复执行的:从两者的底层机制差异,拆到 mismatch 排查和第三方脚本对主线程的争用。
同一个主色在项目里同时以 `#1677ff`、`rgb(22, 119, 255)`、`var(--blue-6)` 三种形式存在,谁也说不清哪个是标准——Design Token 怎么分层、怎么落地才能让颜色和间距不再散落在业务代码里。
桌面端选型不该从'哪个更新潮'开始,该从三个问题开始:目标机器是什么环境、包体和内存有多敏感、团队有没有人能写 Rust。拿一个内部工具在 Tauri 1.5 和 Electron 28 上各跑了一遍,体积、内存、WebView 兼容性、Rust 侧 invoke、生态成熟度的实测差异都在这里。
了解 Docker 的基础知识,记录前端和 Node 项目在镜像构建、缓存、多阶段构建、健康检查和运行安全上的实践。
aria 属性补不出交互行为:语义化标签、键盘操作、焦点管理和表单提示各自该做到什么程度,什么时候该用原生元素、什么时候才轮到 aria 出场。