CSP 管得住脚本从哪个域加载,管不住页面自己往 innerHTML 里塞了什么字符串。Trusted Types 把危险 DOM Sink 的写入变成浏览器强制审查,这篇讲它的机制、落地代码和撞见的真实麻烦。
评估一个离线优先的文档编辑器要不要把数据存进浏览器时,IndexedDB 的异步 API 在高频写入场景下写起来啰嗦、性能也一般,OPFS 提供的同步访问句柄和更接近真实文件的操作方式是另一条路,这篇讲清楚它的存储模型、权限模型、和 IndexedDB/Cache Storage 的分工,以及配额和数据清除时该怎么应对。
长任务把主线程堵住的时候,setTimeout(fn, 0) 和 requestIdleCallback 都救不了场——scheduler.postTask() 的优先级参数和 scheduler.yield() 的循环内让出,才是浏览器原生给出的任务调度方案。
Date 对象在时区、夏令时和月份索引上的历史包袱一直没解决,这篇讲 TC39 Temporal API 的对象设计、时区处理方式、不可变性的实际收益,以及在账单周期计算这类场景里落地的判断过程。
不可变数据、资源管理、新语法这些 ES2026/ESNext 能力,怎么判断它什么时候能真正进业务代码:分清标准阶段、核对工具链转译和 polyfill 成本。
把项目的 lint 和格式化从 ESLint+Prettier 换成 Biome 的过程:速度提升有多明显、规则迁移缺了什么、以及哪些场景我还是留着 ESLint。
qiankun 的 JS 沙箱怎么隔离子应用的全局变量污染:拆解 ProxySandbox 和 LegacySandbox 为什么要设计 fakeWindow、with、函数绑定和生命周期补丁。
从 Vue ref、Solid signal 到 TC39 的 Signals 提案,聊聊信号这套响应式模型解决了什么、polyfill 怎么用、以及它和现有框架的关系。
query string、格式化、深拷贝、请求取消这些场景,很多时候不需要额外装库——JavaScript 原生 API 已经能表达清楚,前提是先看兼容性和团队成本。
Bun 的速度收益到底落在哪一段反馈链路,兼容性能扛到什么程度,成熟前端项目又为什么不该一口气全量迁移,从低风险脚本切入才是稳妥的验证方式。
同一个错误码在不同页面提示不一致、表单字段错误只会弹 toast,这篇讲清楚怎么把网络错误、业务错误、表单错误和页面反馈重新分层。
AI 对话的逐字输出不是前端定时器假装出来的;SSE 和 fetch 流式读取各有适用场景和失败处理。
批量请求不能只写一个 Promise.all;我更关心同时执行数量、失败重试、取消和用户等待时间怎么平衡。
Node.js 里的 fetch、Web Streams、AbortController 和内置测试工具正在和浏览器端趋同:本文梳理超时取消怎么用 AbortSignal 组合实现、SSE 流式解析里多字节字符截断怎么正确 flush、以及原生 test runner 能替掉多少第三方依赖。
WebSocket 断开不触发 onclose、页面显示在线却收不到消息,这类半开连接怎么发现、怎么重连、重连后数据怎么对齐,是实时前端真正难的部分。
接口有没有走缓存、样式为什么被覆盖、点击为什么没触发、页面为什么卡、移动端为什么和桌面不一样——这些问题靠 console.log 很难查。梳理 Elements、Network、Sources、Performance、Application 几个面板各自该在什么时候用,以及断点、火焰图、waterfall 这几种排查手段具体怎么落地。
Web Worker 该用在哪、结构化克隆和 Transferable 对象的性能差异、错误处理和任务取消要怎么设计,以及它解决不了什么问题——这篇把这次挪计算逻辑到 Worker 的判断过程理一遍。
localStorage 用着顺手,但容量、同步读写和跨标签页这几个限制不搞清楚,迟早会踩到该用 IndexedDB 却没用的坑。
旧版 axios CancelToken 和原生 AbortController 两套取消机制并存,判断方式不一样,搜索联想、页面切换这类竞态场景很容易两头踩空。
同样是往列表里塞一千条数据,直接循环 append 和先用 DocumentFragment 离线拼装再一次性插入,流畅度差得很明显。这篇讲清楚这个差异背后的重排重绘原理,以及和 innerHTML 拼接、事件委托、虚拟滚动这几个相邻方案的取舍。
用 Canvas 2D 在前端合成营销分享海报,要跨过的坑比想象中多:drawImage 的图片加载时序、measureText 手动实现文本换行、clip 裁圆角头像、跨域图片污染画布导致 toDataURL 报错、devicePixelRatio 不处理导出图就是糊的,还有自定义字体没加载完就绘制的时序问题,逐个记录踩坑和解法。
同样是判断'元素进入视口',scroll 事件加 getBoundingClientRect 和 IntersectionObserver 的差别不只是性能,语义上前者是'我不停地问'、后者是'浏览器主动告诉我'。整理列表曝光埋点和触底加载两个场景下 IO 的 threshold/rootMargin 用法、曝光去重与可见时长统计,以及 root、iframe 相关的几个坑。
两次排序叠在一起时,真正决定结果对不对的往往不是比较函数,而是稳定性。这里从一张表格排乱的现场切进去,把基础排序和 `Array.sort` 的边界重新理顺。
正则最危险的时候,不是匹配不上,而是某份输入一来就把页面拖死——嵌套量词导致的灾难性回溯就是典型。这里把锚点、量词、分组和性能边界重新放回真实问题里看。
从嵌套数据到可用统计结果,`map`、`filter`、`reduce` 和 `sort` 看起来都不难,真正连起来用时却很容易踩坑。这里把一张报表处理链路里的典型问题集中拆开。
列表顺序变了、数据状态也对,页面上的复选框却勾到了别人身上——这类渲染错位的根子在节点复用策略。这里把 VNode、diff、`key` 和节点复用的边界重新讲清。
搜索联想、滚动监听、按钮防重复点看起来都像“别触发太频繁”,真正要分清的却是防抖、节流和状态锁各自在挡什么。这里把概念、场景和边界重新理顺。
类目树选择器、批量上传并发控制、编辑器撤销,看起来是三个需求,本质上分别落在树、队列和栈。这里按前端里的真实用法把它们重新串起来。
点遮罩却跳进底下详情页、点输入框反而把弹窗关掉,这类问题最后都会回到浏览器的事件模型本身。文章梳理捕获、冒泡、事件委托和移动端点击穿透的成因与修法。
动态表单的输入框打字没反应,换成 this.$set 就好了——修好之后我不甘心,把 Vue 2 的 observer 源码翻了一个周末。Object.defineProperty、依赖收集、数组方法拦截、nextTick,这篇是我的读源码笔记。
重置弹窗却把列表数据一起改脏,问题表面在重置,根因却在对象引用。这里从浅拷贝失效一路拆到 JSON 深拷贝的边界、递归复制和循环引用处理。
Promise 最容易让人产生“已经会了”的错觉。这里按七组常见问题,把状态流转、微任务、链式调用、错误传播、并发方法和手写实现重新串起来。
页面不报错,却会越跑越卡、最后直接崩掉,问题多半已经落在内存和垃圾回收上。这里把一次长期运行页面的泄漏排查和栈、堆、可达性放在一起讲。
同一个 npm 包在 webpack 项目里能正常 `import`,到了 Node 脚本里一 `require` 却拿到 `undefined`。这里顺着这个差异把 CommonJS 和 ES Module 的加载模型重新讲清。