手写核心工具库:防抖节流、发布订阅、Promise、简易路由、简易 Vue 响应式
Hi我是前端人类学无论前端框架如何更迭防抖节流、发布订阅、Promise、路由、响应式这五个核心模块始终是支撑应用的基石。手写它们不仅能深入理解底层原理更能提升代码设计能力。本文将逐一实现并剖析其核心逻辑。文章目录一、防抖Debounce与节流Throttle1.1 防抖Debounce连续触发只执行最后一次1.2 节流Throttle固定时间间隔执行一次二、发布订阅Event Bus三、PromiseA 规范核心实现四、简易路由Hash 模式五、简易 Vue 响应式2.x 核心六、总结一、防抖Debounce与节流Throttle两者都是频率控制函数用于限制函数执行次数但适用场景截然不同。1.1 防抖Debounce连续触发只执行最后一次原理每次触发都重置定时器确保仅在停止触发后的等待时间结束后执行一次。functiondebounce(fn,delay300){lettimernull;returnfunction(...args){clearTimeout(timer);timersetTimeout((){fn.apply(this,args);},delay);};}适用场景输入框搜索联想、窗口 resize 计算。1.2 节流Throttle固定时间间隔执行一次原理通过时间戳或定时器控制在时间窗口内最多执行一次。functionthrottle(fn,interval300){letlastTime0;returnfunction(...args){constnowDate.now();if(now-lastTimeinterval){lastTimenow;fn.apply(this,args);}};}适用场景滚动加载、按钮高频点击防止重复提交。二、发布订阅Event Bus发布订阅模式是观察者模式的一种实现核心是事件中心订阅者on注册事件发布者emit触发事件同时支持移除off和一次性订阅once。classEventBus{constructor(){this.events{};}// 订阅on(name,callback){if(!this.events[name]){this.events[name][];}this.events[name].push(callback);}// 取消订阅off(name,callback){if(!this.events[name])return;if(!callback){deletethis.events[name];return;}this.events[name]this.events[name].filter(cbcb!callback);}// 触发emit(name,...args){if(!this.events[name])return;this.events[name].forEach(cbcb(...args));}// 一次性订阅once(name,callback){constwrapper(...args){callback(...args);this.off(name,wrapper);};this.on(name,wrapper);}}三、PromiseA 规范核心实现手写 Promise 的关键是理解状态流转pending → fulfilled / rejected和链式调用。核心骨架constPENDINGpending;constFULFILLEDfulfilled;constREJECTEDrejected;classMyPromise{constructor(executor){this.statePENDING;this.valueundefined;this.reasonundefined;this.onFulfilledCallbacks[];this.onRejectedCallbacks[];constresolve(value){if(this.statePENDING){this.stateFULFILLED;this.valuevalue;this.onFulfilledCallbacks.forEach(fnfn());}};constreject(reason){if(this.statePENDING){this.stateREJECTED;this.reasonreason;this.onRejectedCallbacks.forEach(fnfn());}};try{executor(resolve,reject);}catch(err){reject(err);}}then(onFulfilled,onRejected){onFulfilledtypeofonFulfilledfunction?onFulfilled:vv;onRejectedtypeofonRejectedfunction?onRejected:err{throwerr;};constpromise2newMyPromise((resolve,reject){if(this.stateFULFILLED){setTimeout((){try{constxonFulfilled(this.value);this.resolvePromise(promise2,x,resolve,reject);}catch(err){reject(err);}});}if(this.stateREJECTED){setTimeout((){try{constxonRejected(this.reason);this.resolvePromise(promise2,x,resolve,reject);}catch(err){reject(err);}});}if(this.statePENDING){this.onFulfilledCallbacks.push((){setTimeout((){try{constxonFulfilled(this.value);this.resolvePromise(promise2,x,resolve,reject);}catch(err){reject(err);}});});this.onRejectedCallbacks.push((){setTimeout((){try{constxonRejected(this.reason);this.resolvePromise(promise2,x,resolve,reject);}catch(err){reject(err);}});});}});returnpromise2;}// 核心解析处理 then 返回值的穿透和链式resolvePromise(promise2,x,resolve,reject){if(promise2x){returnreject(newTypeError(Chaining cycle detected));}if(x(typeofxobject||typeofxfunction)){letcalledfalse;try{constthenx.then;if(typeofthenfunction){then.call(x,y{if(called)return;calledtrue;this.resolvePromise(promise2,y,resolve,reject);},r{if(called)return;calledtrue;reject(r);});}else{resolve(x);}}catch(err){if(called)return;calledtrue;reject(err);}}else{resolve(x);}}// 静态方法staticresolve(value){returnnewMyPromise(resolveresolve(value));}staticreject(reason){returnnewMyPromise((_,reject)reject(reason));}// catch 是 then 的语法糖catch(onRejected){returnthis.then(null,onRejected);}}四、简易路由Hash 模式前端路由的核心是监听 URL 变化渲染对应组件。Hash 模式利用window.location.hash和hashchange事件实现。classRouter{constructor(){this.routes{};this.currentPath;// 监听 hash 变化window.addEventListener(hashchange,this.updateView.bind(this));// 页面加载时也要触发window.addEventListener(load,this.updateView.bind(this));}// 注册路由route(path,callback){this.routes[path]callback;}// 更新视图updateView(){constpathwindow.location.hash.slice(1)||/;this.currentPathpath;constcallbackthis.routes[path];if(callback){callback();}}// 跳转push(path){window.location.hashpath;}// 获取当前路径getCurrentPath(){returnthis.currentPath;}}// 使用示例constrouternewRouter();router.route(/,()console.log(首页));router.route(/about,()console.log(关于));router.push(/about);// 触发 about 路由五、简易 Vue 响应式2.x 核心Vue 2 的响应式核心是Object.defineProperty劫持数据结合发布订阅模式通知视图更新。核心三要素Observer、Dep、Watcher// 1. Dep依赖收集器发布订阅classDep{constructor(){this.subscribers[];}addSub(watcher){this.subscribers.push(watcher);}notify(){this.subscribers.forEach(watcherwatcher.update());}}// 2. Observer递归劫持所有属性functionobserve(obj){if(!obj||typeofobj!object)return;Object.keys(obj).forEach(keydefineReactive(obj,key,obj[key]));}functiondefineReactive(obj,key,val){constdepnewDep();// 深度劫持observe(val);Object.defineProperty(obj,key,{get(){// 依赖收集将当前 Watcher 添加到 depif(Dep.target){dep.addSub(Dep.target);}returnval;},set(newVal){if(newValval)return;valnewVal;observe(newVal);// 新值也需要劫持dep.notify();// 触发更新}});}// 3. Watcher观察者负责更新视图classWatcher{constructor(vm,key,callback){this.vmvm;this.keykey;this.callbackcallback;// 把当前 Watcher 挂到 Dep.target触发 getter 完成依赖收集Dep.targetthis;this.valuevm[key];// 读取触发 getterDep.targetnull;}update(){constnewValuethis.vm[this.key];if(newValue!this.value){this.valuenewValue;this.callback(newValue);}}}// 4. 简易 Vue 类classMiniVue{constructor(data){this._datadata;observe(data);}// 注册 Watcher$watch(key,callback){newWatcher(this,key,callback);}}// 使用示例constvmnewMiniVue({name:张三,age:18});vm.$watch(name,(newVal){console.log(姓名变了:,newVal);});vm._data.name李四;// 触发更新六、总结模块核心思想关键API/技术防抖延迟执行重置定时器setTimeoutclearTimeout节流时间窗口内只执行一次时间戳 / 定时器控制发布订阅事件中心管理回调on/emit/off/oncePromise状态机 链式调用resolve/reject/then路由(Hash)监听 hashchange 渲染组件window.location.hashVue响应式数据劫持 发布订阅Object.definePropertyDep/Watcher手写这些工具库本质上是理解设计模式观察者、发布订阅、代理和底层 APIdefineProperty、Proxy、Promise的过程。无论框架如何演变这些核心思想将始终伴随前端开发。

相关新闻

String 笔记 记录一些所学的String下常用常见的方法

String 笔记 记录一些所学的String下常用常见的方法

【String 类】笔记记录一些所学的String下常用常见的方法 String.length():返回int类型 获得字符串的长度String.indexOf(char ch):返回int类型 字符在字符串中首次出现的索引位置String.lastIndexOf(char ch):返回int类型 字符在字符串中最后出现的索引位置String.charAt(int …

2026/7/28 20:06:38阅读更多 →
小米平板5 Windows驱动完整安装指南:让安卓平板变身生产力工具

小米平板5 Windows驱动完整安装指南:让安卓平板变身生产力工具

小米平板5 Windows驱动完整安装指南:让安卓平板变身生产力工具 【免费下载链接】MiPad5-Drivers https://github.com/Project-Aloha/windows_oem_xiaomi_nabu 项目地址: https://gitcode.com/gh_mirrors/mi/MiPad5-Drivers 想要将你的小米平板5从安卓系统转变…

2026/7/28 20:06:38阅读更多 →
2026手机网校搭建平台推荐,零基础也能即刻上手吗?

2026手机网校搭建平台推荐,零基础也能即刻上手吗?

2026手机网校搭建平台推荐,零基础也能即刻上手吗?据艾瑞咨询《2026年中国在线教育与教培数字化发展报告》显示,截至2026年上半年,超71%的中小教培机构已完成小程序网校布局,其中通过小程序实现约课、作品展示与学情同步…

2026/7/28 20:04:38阅读更多 →
吴恩达提示词工程实践指南:从基础概念到代码生成实战

吴恩达提示词工程实践指南:从基础概念到代码生成实战

如果你还在为写不出高质量的提示词而苦恼,或者觉得AI总是无法理解你的真实意图,那么吴恩达的《提示词工程》课程可能是你一直在寻找的答案。这不是又一套枯燥的理论教程,而是一套真正从实践出发、能够立即提升你与大模型交互效率的实用指南。…

2026/7/29 2:12:16阅读更多 →
161、NPU的编译器开发:内存布局优化

161、NPU的编译器开发:内存布局优化

好的,我们开始。 161、NPU的编译器开发:内存布局优化 从一次诡异的“算对但跑不对”说起 几年前调试一个轻量级检测网络,模型在PC端仿真器上精度完全达标,一部署到某款自研NPU上,输出特征图就出现周期性的“条纹状”错误。不是全错,是每隔几行数据就跳变一次,像有人把…

2026/7/29 2:12:16阅读更多 →
Cortex M7-TRM 翻译系列之ITM(十二)

Cortex M7-TRM 翻译系列之ITM(十二)

12 指令跟踪宏单元(ITM)12.1 ITM概述仪器跟踪宏单元(ITM)是可选的、由应用程序驱动的跟踪源,支持类似 printf 打印风格的调试手段,可用于跟踪操作系统与应用程序事件,并输出系统诊断信息。12.2 ITM功能描述ITM 以数据包…

2026/7/29 2:12:16阅读更多 →
PDF批量编辑技巧:框选区域对象的删除与移动操作指南

PDF批量编辑技巧:框选区域对象的删除与移动操作指南

这次我们来看一个非常实用的PDF编辑技巧——如何批量删除和移动框选区域内的对象。对于经常处理PDF文档的技术人员、办公人员或学生来说,这个功能能极大提升文档处理效率,特别是在处理大量相似结构的PDF文件时。PDF文档的编辑一直是很多人的痛点&#xf…

2026/7/29 2:12:16阅读更多 →
OpenObserve生产环境安全配置实战:TLS加密与身份验证全指南

OpenObserve生产环境安全配置实战:TLS加密与身份验证全指南

1. 项目概述:为什么OpenObserve的安全配置不容忽视?最近在部署和运维OpenObserve时,我遇到了不少关于安全访问的咨询。很多团队在快速上手这款高性能的日志、指标和追踪数据平台后,往往只关注其强大的查询和压缩能力,却…

2026/7/29 2:12:16阅读更多 →
华为非AI方向笔试真题 7月24号【最优河堤加固方案】

华为非AI方向笔试真题 7月24号【最优河堤加固方案】

最优河堤加固方案(C/Py/Java/Js/Go)题解华为笔试真题 7月24号 非AI方向第一题 100分题型题目内容 一个数组代表河堤的高度,堤坝是等长、等宽的,现在需要在不超过最大预算的前提下,尽可能的加固河堤使最低高度,所有加固的土只能通过…

2026/7/29 2:10:16阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“! 在构建复杂的 Agent 系统时,我们经常会遇到这样的场景:Agent 正在执行一个多步骤的任务,比如“下单购买商品”,但执行到一半时,我们…

2026/7/29 0:01:46阅读更多 →
自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

近日,国际专注开放式技术研发的声学品牌Nank南卡,正式官宣实力艺人曾舜晞担任品牌代言人。消息一经发出便轰动全网。为什么耳机品牌不选择流量明星、老牌歌手?而且是选择曾舜晞?让我们一起来探索一下!比起短期的流量&a…

2026/7/29 0:01:46阅读更多 →
【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:01:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/28 20:22:24阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →