拆成 Monorepo 要担的代价是什么:pnpm 的硬链接和符号链接策略跟 npm/yarn 的提升策略在幽灵依赖上表现不一样,包之间怎么引用、依赖装在哪一层、CI 要不要全量跑,这些问题不先想清楚,多包项目很快会变成一个更大的混乱仓库。
接口有没有走缓存、样式为什么被覆盖、点击为什么没触发、页面为什么卡、移动端为什么和桌面不一样——这些问题靠 console.log 很难查。梳理 Elements、Network、Sources、Performance、Application 几个面板各自该在什么时候用,以及断点、火焰图、waterfall 这几种排查手段具体怎么落地。
Web Worker 该用在哪、结构化克隆和 Transferable 对象的性能差异、错误处理和任务取消要怎么设计,以及它解决不了什么问题——这篇把这次挪计算逻辑到 Worker 的判断过程理一遍。
Fetch 不会对 4xx/5xx 状态码 reject,必须自己检查 response.ok;结合 Response.clone()、Headers 大小写不敏感、AbortController 超时封装等细节,讨论请求层封装该收多深、和 axios 拦截器比起来各自的取舍。
主题切换不是给 body 加个 class 就完事,CSS 变量、组件库主题和设计 token 分层决定后面好不好维护。
强缓存和协商缓存到底谁优先、命中了会不会发请求,这些问题只看文档很容易记混。这篇拆清 Cache-Control、ETag、文件 hash、HTML 入口和接口缓存该怎么配,顺带讲清楚发布后用户还在看旧页面到底是哪一层出的问题。
scripts 目录堆到没人敢删——Node 自动化脚本写得靠不靠谱,看的是它该失败的时候会不会主动失败。
从 lint、test、build、缓存、预览环境和回滚几个环节,记录我在前端项目里使用 GitHub Actions 搭建发布流程的思路。
全局样式、命名、变量、第三方覆盖到 @layer,讨论中型前端项目里样式优先级怎么从失控收回来。
拖拽排序自己写起来容易,但移动端手势、并发保存、可访问性这几个生产问题决定了什么时候该选库、什么时候不用。
localStorage 用着顺手,但容量、同步读写和跨标签页这几个限制不搞清楚,迟早会踩到该用 IndexedDB 却没用的坑。
文件上传的难点不在选文件,而在选完之后:进度从哪来、取消和失败怎么区分、大文件怎么分片、并发怎么控制。整理这些机制背后的具体判断。
测试工具不缺,缺的是判断标准:什么逻辑值得写单元测试,什么流程只能靠 Cypress 兜底,团队新引入的 Vitest 又该放在什么位置上尝试。
写 Vite 内部插件时,钩子名字只是入口,真正容易出问题的是调试方式、产物路径和插件该不该管到哪一步。
Git 协作出问题时,很少是命令不会敲,更多是提交粒度、分支约定和冲突处理没有共识。
前端能拦住的只是显示,动态路由、菜单和按钮权限背后,真正该由谁负责校验安全,还得看接口。
从图表复杂度、数据规模、交互深度三个维度拆解 ECharts、D3、Chart.js、Recharts、deck.gl 分别适合什么场景,聊聊中后台看板选型时该问清楚的问题。
从 Vuex 迁移到 Pinia,state/getters/actions 这几个 API 名字换起来最快,哪些状态值得全局化、模块该怎么拆、持久化和 SSR 水合的坑怎么避开,才是真正花时间的地方。
旧版 axios CancelToken 和原生 AbortController 两套取消机制并存,判断方式不一样,搜索联想、页面切换这类竞态场景很容易两头踩空。
组件 API 一旦被多个页面引用就很难改。这篇整理 props 粒度、事件命名、v-model 边界和插槽尺度的判断标准,附带一个从 Vuex 挪到 Pinia 时暴露出来的耦合案例。
老项目拆模块时,语法不是重点,依赖关系、循环引用和构建工具怎么理解 ESM/CJS 才是坑。
把 Vue CLI 项目切到 Vite,命令改起来只要五分钟,真正的成本在环境变量、路径别名、静态资源和 CommonJS 依赖这些藏在历史代码里的构建假设上。
工具类方案要不要用,关键看它能不能收住样式复用、响应式、设计约束和团队协作成本这几件事,这篇把 Tailwind 的取舍标准和几个容易踩的坑理清楚。
Composition API 好不好用,关键不在 API 本身,而在按什么维度拆代码——`setup` 里没有强制分区,状态、请求、事件、表单全塞进一个函数体也能跑,但两个月后改起来会很难受。