首页 文章 精选 留言 我的

文章列表

共 234735 篇
浏览器事件循环:从一道笔试题到实际业务中的批量更新

浏览器事件循环:从一道笔试题到实际业务中的批量更新

这个输出顺序很多人能背出来,但把它放到一个真实的列表渲染场景里,问题就不是背顺序那么简单了。前段时间改一个表格组件,用户连续勾选几百行,每勾选一次就触发一次父组件更新,父组件更新又反过来导致每个子组件重新计算选中状态。代码里用 Promise 做了防抖,结果防抖还没生效,界面已经卡住了。调试时发现 Promise 的微任务一直插在渲染之前执行,宏任务里的渲染...

TypeScript 里用 satisfies 保留字面量类型,同时做静态校验

TypeScript 里用 satisfies 保留字面量类型,同时做静态校验

在写 TypeScript 的时候,我经常遇到一个很别扭的情况:想给一个对象声明类型,让每个属性值都被推断成具体的字面量,而不是被拓宽成 string、number 这种宽泛类型。以前要么用 as const 把整个对象冻成只读,要么单独写一个类型再手动标注,但两者都有代价:as const 会让对象完全只读,后续想修改某个字段就不行;手动写类型又容易在值写...

Node.js 中如何正确处理 Stream 的错误与清理

Node.js 中如何正确处理 Stream 的错误与清理

写 Node.js 服务时,Stream 几乎是绕不开的东西。上传文件、解压归档、转发日志,背后都是流在跑。很多人第一次踩坑的地方不是读不到数据,而是出错之后资源没释放、错误没被捕获,进程挂在那里,内存慢慢涨上去。比如用 pipe() 把一个可读流接到可写流,如果可读流中途 emit 了 error,可写流默认不会自动关闭,文件描述符就一直开着。再比如手动监...

IntersectionObserver 在真实项目里的几个坑:根元素滚动、懒加载闪烁和取消观察

IntersectionObserver 在真实项目里的几个坑:根元素滚动、懒加载闪烁和取消观察

做图片懒加载、广告曝光上报或者无限滚动时,很多团队已经用 IntersectionObserver 替代了 scroll 事件监听。它确实省去了手动计算 getBoundingClientRect 的麻烦,浏览器还能在空闲时机批量回调。但实际接入过程中,根元素选择、rootMargin 取值、取消观察的时机都会带来一些不直观的行为。比如在可滚动容器里观察图片...

别再用 `watch` 监听 props 了:Vue 3 中更可靠的响应式数据同步策略

别再用 `watch` 监听 props 了:Vue 3 中更可靠的响应式数据同步策略

在维护一个后台管理系统时,我遇到了一个典型问题:父组件通过接口获取用户详情后,将 userInfo 对象传给子组件,子组件用 watch 监听 props.userInfo,一旦变化就同步到本地的表单数据 formData。表面看没问题,但实际出现了表单输入被意外重置、子组件重复请求接口、甚至父组件更新时子组件视图不刷新的情况。排查后发现,问题根源在于 wa...

JavaScript 正则匹配中的 lastIndex 陷阱:为什么 test 和 exec 会交替返回 true 和 false

JavaScript 正则匹配中的 lastIndex 陷阱:为什么 test 和 exec 会交替返回 true 和 false

用同一个正则对象反复测试不同字符串,明明字符串都匹配,却出现一次 true 一次 false 的诡异现象,这是不少人在表单校验、循环过滤或批量替换时踩过的坑。问题大多不在正则模式本身,而是带了 g 或 y 标志的正则对象会维护 lastIndex 状态。调用 test 和 exec 时,匹配成功会更新这个值,下一次从新位置继续找,匹配失败才把它重置为 0。于...

Vite 开发时 import 路径大小写不一致导致 HMR 失效的排查过程

Vite 开发时 import 路径大小写不一致导致 HMR 失效的排查过程

最近在做一个后台管理项目,本地开发时改了组件里的样式,浏览器偶尔不会自动热更新,必须手动刷新才能看到变化。一开始以为是 Vite 的 HMR 偶发问题,重启几次 dev server 也没找出规律。后来发现只在某个页面会出现,而且只在修改部分子组件时触发。Vite 的 HMR 机制本身依赖模块图,如果模块图里同一个文件出现两个不同路径,HMR 就找不到正确的...

Vue 3 中 watch 和 watchEffect 的清理副作用到底该怎么写才不翻车?

Vue 3 中 watch 和 watchEffect 的清理副作用到底该怎么写才不翻车?

在 Vue 3 的组合式 API 里,watch 和 watchEffect 的清理函数经常被忽略。比如你在监听一个搜索关键词时发起异步请求,当关键词快速变化,前一次请求可能后返回并覆盖最新结果;或者在 watchEffect 里绑定 resize、scroll 等 DOM 事件,组件卸载后没有解绑,造成内存泄漏。这些问题在开发环境不一定报错,但在真实项目中...

Vue 3 中 watch 与 watchEffect 的清理副作用:什么时候需要 onCleanup?

Vue 3 中 watch 与 watchEffect 的清理副作用:什么时候需要 onCleanup?

在 Vue 3 的组合式 API 里,watch 和 watchEffect 经常被用来处理异步请求、定时器或事件监听。但很多人会把回调写成异步函数,然后在里面直接修改响应式数据,结果在快速切换依赖时出现竞态条件:旧请求返回后覆盖了新请求的结果,或者组件已经卸载但定时器还在跑。这类问题在搜索框联想、路由参数变化后拉取列表、Tab 切换加载不同数据时特别常见。...

React 中 useEffect 依赖数组的闭包陷阱与正确使用方式

React 中 useEffect 依赖数组的闭包陷阱与正确使用方式

在 React 函数组件中,useEffect 是处理副作用的核心 Hook。很多人习惯把依赖数组当作“触发条件”来用,比如传入一个空数组模拟 componentDidMount,或者只放自己关心的变量。但这样写经常会遇到一个问题:effect 内部读到的 state 或 props 始终是初始值,定时器、事件监听器里拿到的数据永远不更新。这背后是 Java...

别让 CSS 痛点拖慢你的开发:用 stylelint 与 PostCSS 自动修复样式问题

别让 CSS 痛点拖慢你的开发:用 stylelint 与 PostCSS 自动修复样式问题

在维护一个多人协作、历史包袱不轻的技术博客时,CSS 文件往往是最容易被忽视却最容易失控的部分。不同成员写出的选择器命名随意、属性顺序混乱、使用了被废弃的写法,甚至不小心把 !important 当成常规武器。这些问题不会让页面立刻崩溃,但会持续拖慢 code review 速度,并在后续改版时埋下隐患。靠人工逐行检查显然不现实,而官方 CSS 规范又缺乏自...

别再手动拼 URL 了:URLSearchParams 与 URL 在真实业务里的几个坑

别再手动拼 URL 了:URLSearchParams 与 URL 在真实业务里的几个坑

做后台管理系统时常遇到这样的场景:筛选条件一多,页面上要同步更新 query、还要把当前筛选状态分享给别人,于是代码里开始出现各种字符串拼接和正则替换。如果只是两三个参数倒还好,一旦涉及中文、数组、空值、hash 路由,手写逻辑就会到处漏风。浏览器原生提供的 URL 和 URLSearchParams 能覆盖大部分需求,但它们在类型、编码、加减号、重复键、相...

Node.js 全局变量污染:从 req.user 到 AsyncLocalStorage 的实践

Node.js 全局变量污染:从 req.user 到 AsyncLocalStorage 的实践

在 Node.js 服务端开发里,我们经常需要在一次请求的生命周期中共享一些上下文,比如当前登录用户、traceId、租户 ID。很多团队习惯直接往全局对象上挂,或者用模块级变量来存,结果在并发请求下互相覆盖,出现 A 用户的请求读到 B 用户数据的问题。这种 bug 往往在本地单请求测试时完全正常,一上生产、QPS 上来就开始间歇性错乱,排查起来非常费劲。...

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册