本书全面讲解了框架设计及相关的知识,主要内容包括种子模块、语言模块、浏览器嗅探与特征侦测、类工厂、选择器引擎、节点模块、数据缓存模块、样式模块、属性模块、PC端和移动端的事件系统、jQuery的事件系统、异步模型、数据交互模块、动画引擎、MVVM、前端模板(静态模板)、MVVM的动态模板、性能墙与复杂墙、组件、jQuery时代的组件方案、avalon2的组件方案、react的组件方案等。
本书适合前端设计人员、开发者、移动UI设计者、程序员和项目经理阅读,也可作为相关**学习用书和培训学校教材。
第1章 种子模块 1 1.1 模块化 1 1.2 功能介绍 2 1.3 对象扩展 3 1.4 数组化 5 1.5 类型的判定 8 1.5.1 type 12 1.5.2 isPlainObject 13 1.5.3 isWindow 14 1.5.4 isNumeric 15 1.5.5 isArrayLike 16 1.6 domReady 17 1.7 无冲突处理 20 1.8 总结 20 第2章 语言模块 21 2.1 字符串的扩展与修复 22 2.1.1 repeat 24 2.1.2 byteLen 26 2.1.3 pad 30 2.1.4 quote 32 2.1.5 trim与空白 33 2.2 数组的扩展与修复 37 2.3 数值的扩展与修复 45 2.4 函数的扩展与修复 48 2.5 日期的扩展与修复 53 第3章 浏览器嗅探与特征侦测 57 3.1 浏览器判定 58 3.2 document.all趣闻 61 3.3 事件的支持侦测 62 3.4 样式的支持侦测 65 3.5 jQuery—些常用特征的含义 65 第4章 类工厂 68 4.1 对类的支撑 68 4.2 各种类工厂的实现 73 4.2.1 相当精巧的库—P.js 74 4.2.2 JS.Class 76 4.2.3 simple-inheritance 78 4.2.4 体现灵活性的 库—def.js 81 4.3 进击的属性描述符 85 4.4 真类降临 93 第5章 选择器引擎 102 5.1 浏览器内置的寻找元素的方法 103 5.2 getElementsBySelector 105 5.3 选择器引擎涉及的知识点 108 5.3.1 关系选择器 109 5.3.2 伪类 111 5.3.3 其他概念 113 5.4 选择器引擎涉及的通用函数 114 5.4.1 isXML 114 5.4.2 contains 115 5.4.3 节点排序与去重 117 5.4.4 切割器 121 5.4.5 属性选择器对于空白字符的 匹配策略 123 5.4.6 子元素过滤伪类的分解与 匹配 125 5.5 Sizzle引擎 127 5.6 总结 135 第6章 节点模块 136 6.1 节点的创建 136 6.2 节点的插入 142 6.3 节点的复制 144 6.4 节点的移除 148 6.5 节点的移除回调实现 151 6.5.1 Mutation Observer 152 6.5.2 更多候选方案 153 6.6 innerHTML、innerText、outerHTML、 outerText的兼容处理 157 6.7 模板容器元素 161 6.8 iframe元素 162 6.9 总结 165 第7章 数据缓存模块 166 7.1 jQuery的第1代缓存系统 166 7.2 jQuery的第2代缓存系统 172 7.3 jQuery的第3代缓存系统 175 7.4 有容量限制的缓存系统 176 7.5 本地存储系统 178 7.6 总结 184 第8章 样式模块 185 8.1 主体架构 186 8.2 样式名的修正 189 8.3 个别样式的特殊处理 190 8.3.1 opacity 190 8.3.2 user-select 192 8.3.3 background-position 192 8.3.4 z-index 193 8.3.5 盒子模型 194 8.3.6 元素的尺寸 195 8.3.7 元素的显隐 201 8.3.8 元素的坐标 203 8.4 元素的滚动条的坐标 209 8.5 总结 210 第9章 属性模块 211 9.1 元素节点的属性 212 9.2 如何区分固有属性与自定义 属性 214 9.3 如何判定浏览器是否区分固有 属性与自定义属性 216 9.4 IE的属性系统的3次演变 217 9.5 className的操作 218 9.6 Prototype.js的属性系统 221 9.7 jQuery的属性系统 226 9.8 avalon的属性系统 229 9.9 value的操作 232 9.10 总结 235 第10章 PC端的事件系统 236 10.1 原生API简介 238 10.2 on×××绑定方式的缺陷 239 10.3 attachEvent的缺陷 239 10.4 addEventListener的缺陷 241 10.5 handleEvent与 EventListenerOptions 242 10.6 Dean Edward大神的addEvent.js 源码分析 243 10.7 jQuery的事件系统 246 10.8 avalon2的事件系统 248 10.9 总结 254 第11章 移动端的事件系统 255 11.1 touch系事件 256 11.2 gesture系事件 258 11.3 tap系事件 259 11.4 press系事件 268 11.5 swipe系事件 271 11.6 pinch系事件 273 11.7 拖放系事件 276 11.8 rotate系事件 279 11.9 总结 282 第12章 异步模型 283 12.1 setTimeout与setInterval 284 12.2 Promise诞生前的世界 287 12.2.1 回调函数callbacks 287 12.2.2 观察者模式observers 287 12.2.3 事件机制listeners 289 12.3 JSDeferred里程碑 289 12.4 jQuery Deferred宣教者 299 12.5 es6 Promise第—个标准模型 303 12.5.1 构造函数:Promise ( executor ) 308 12.5.2 Promise.resolve/reject 309 12.5.3 Promise.all/race 309 12.5.4 Promise#then/catch 310 12.5.5 Promise#resolve/reject 310 12.5.6 Promsie#notify 311 12.5.7 nextTick 312 12.6 es6生成器过渡者 314 12.6.1 关键字yield 315 12.6.2 yield*和yield的区别 316 12.6.3 异常处理 317 12.7 es7 async/await**方案 319 12.8 总结 321 第13章 数据交互模块 323 13.1 Ajax概览 323 13.2 优雅地取得XMLHttpRequest 对象 324 13.3 XMLHttpRequest对象的事件 绑定与状态维护 326 13.4 发送请求与数据 328 13.5 接收数据 330 13.6 上传文件 333 13.7 jQuery.ajax 335 13.8 fetch,下—代Ajax 340 第14章 动画引擎 344 14.1 动画的原理 344 14.2 缓动公式 347 14.3 jQuery.animate 349 14.4 mass Framework基于的 动画引擎 350 14.5 requestAnimationFrame 358 14.6 CSS3 transition 364 14.7 CSS3 animation 368 14.8 mass Framework基于CSS的动画 引擎 370 第15章 MVVM 378 15.1 前端模板(静态模板) 378 15.2 MVVM的动态模板 388 15.2.1 求值函数 390 15.2.2 刷新函数 395 15.3 ViewModel 399 15.3.1 Proxy 400 15.3.2 Reflect 401 15.3.3 avalon的ViewModel 设计 403 15.3.4 angular的ViewModel 设计 407 15.4 React与虚拟DOM 412 15.4.1 React的diff算法 415 15.4.2 React的多端渲染 417 15.5 性能墙与复杂墙 417 第16章 组件 422 16.1 jQuery时代的组件方案 422 16.2 avalon2的组件方案 427 16.2.1 组件容器 429 16.2.2 配置对象 430 16.2.3 slot机制 430 16.2.4 soleSlot机制 431 16.2.5 生命周期 432 16.3 React的组件方案 433 16.3.1 React组件的各种定义 方式 433 16.3.2 React组件的生命周期 439 16.3.3 React组件间通信 441 16.3.4 React组件的分类 445 16.4 前端路由 446 16.4.1 storage 447 16.4.2 mmHistory 448 16.4.3 mmRouter 454 彩蛋 458
探寻 JavaScript 的核心:深入理解异步、函数式编程与现代 Web 开发 前言 JavaScript,作为当今互联网应用开发的核心语言,其演进速度之快令人瞩目。从最初的浏览器脚本,到如今构建复杂前端应用、后端服务,乃至跨平台移动开发,JavaScript 的能力边界不断被拓展。然而,随着框架与库的爆炸式增长,开发者们常常陷入“使用”的迷雾,却忽略了其底层原理与设计思想。本书旨在引领读者穿越纷繁复杂的生态,回归 JavaScript 的本质,深入剖析那些塑造了现代 Web 开发格局的基石。我们将着重探讨异步编程的奥秘,函数式编程的优雅,以及面向对象与原型链的精髓,帮助您构建出更具可维护性、可扩展性与性能的 JavaScript 应用程序。 第一部分:异步编程的艺术——穿越时空,掌控流程 在 Web 开发的世界里,异步编程是不可避免的存在。无论是网络请求、定时器,还是用户交互,它们都在以非阻塞的方式运行,极大地提升了用户体验和应用性能。然而,异步编程的复杂性也让许多开发者望而却步,回调地狱、错误处理不当等问题层出不穷。本书将系统地梳理异步编程的演进历程,并深入讲解其核心概念与实现方式。 从回调到 Promise: 我们将从最基础的回调函数开始,分析其存在的痛点,例如嵌套过深、代码难以阅读和维护。随后,我们将详细介绍 Promise 的概念,包括其状态(pending, fulfilled, rejected),以及 `.then()`、`.catch()`、`.finally()` 等方法的使用。通过大量的代码示例,您将掌握如何使用 Promise 来构建链式异步操作,优雅地处理异步任务的成功与失败。 Generator 函数: Generator 函数作为一种更高级的异步编程模式,提供了对异步流程的更精细控制。我们将深入理解 `function` 语法、`yield` 关键字的作用,以及如何结合 `next()` 方法来手动控制生成器的执行。在此基础上,我们将探讨 Generator 如何为我们模拟同步代码的写法,从而简化复杂的异步逻辑。 Async/Await 的革命: Async/Await 语法糖是 JavaScript 异步编程的里程碑。我们将详细讲解 `async` 函数如何返回 Promise,以及 `await` 关键字如何暂停函数执行,等待 Promise 解决。通过对比 Promise 的链式调用,您将深刻理解 Async/Await 如何让异步代码写起来更像同步代码,极大地提升了代码的可读性和可维护性。我们将探讨其在错误处理、循环中的应用,以及在实际项目中的最佳实践。 事件循环与微任务/宏任务: 要真正理解 JavaScript 的异步运行机制,就必须深入了解事件循环(Event Loop)、微任务(Microtask)和宏任务(Macrotask)。本书将以清晰的图示和详细的解释,剖析事件循环的工作原理,包括调用栈(Call Stack)、Web API、Callback Queue、Microtask Queue 等组件如何协同工作,实现 JavaScript 的非阻塞 I/O。理解这些底层机制,将帮助您更好地诊断和解决异步相关的性能问题与 bug。 实际应用场景: 我们将结合实际开发场景,例如网络请求(fetch、Ajax)、定时器(setTimeout、setInterval)、文件操作、数据库交互等,演示如何运用所学的异步编程技巧来构建高效、响应迅速的 Web 应用。 第二部分:函数式编程的魅力——优雅、声明式,告别副作用 函数式编程(Functional Programming)是一种编程范式,它将计算视为数学函数的求值,并避免改变状态和可变数据。在 JavaScript 中,函数是一等公民,这为函数式编程提供了天然的土壤。本书将引导您领略函数式编程的魅力,掌握其核心思想,并将其应用于实际开发中,编写出更简洁、更易于理解和测试的代码。 纯函数与不可变性: 我们将深入理解纯函数的概念——即给定相同的输入,总是返回相同的输出,并且没有副作用。纯函数是函数式编程的基石,它们使得代码更容易推理、测试和并行化。同时,我们将强调不可变性的重要性,即数据一旦创建,就不会被修改,而是通过创建新数据来达到“修改”的目的。这有助于减少意外的副作用,提升代码的健壮性。 高阶函数: 高阶函数是指能够接受其他函数作为参数,或者返回一个函数的函数。我们将详细讲解常用的高阶函数,如 `map`、`filter`、`reduce`,并分析它们在数组操作中的强大之处。通过函数组合(Function Composition)和柯里化(Currying)等技巧,您将学会如何构建更灵活、更具复用性的函数。 声明式编程风格: 函数式编程鼓励声明式编程,即描述“做什么”而不是“怎么做”。我们将对比命令式编程和声明式编程的差异,并通过示例展示如何使用函数式的方法来简化代码,使其更具可读性。例如,如何用 `reduce` 来代替传统的 `for` 循环进行数据聚合。 副作用的管理: 尽管函数式编程极力推崇避免副作用,但在实际应用中,副作用是不可避免的(例如,DOM 操作、网络请求)。本书将探讨如何有效地管理和隔离副作用,使其对程序的其他部分影响最小。 函数式编程在现代 JavaScript 中的应用: 我们将探讨函数式编程思想在 React、Vue.js 等现代前端框架中的体现,以及如何利用 Lodash/FP、Ramda 等函数式库来增强开发效率。 第三部分:面向对象与原型链的深度探索——理解 JavaScript 的 DNA JavaScript 的面向对象特性与传统的类(Class)基面向对象有所不同,它基于原型链(Prototype Chain)来实现。深入理解原型链是掌握 JavaScript 核心机制的关键。本书将带您深入挖掘 JavaScript 的原型机制,理解对象是如何继承属性和方法的,以及 `this` 关键字的指向问题。 构造函数与实例: 我们将详细讲解构造函数(Constructor Function)的创建和使用,以及 `new` 关键字在创建对象实例时的作用。理解构造函数如何初始化对象,以及 `prototype` 属性的重要性。 原型链的真相: 深入理解原型链的构成,包括 `__proto__` 属性(内部链接)和 `prototype` 属性。我们将通过图示和实际代码演示,解释当访问一个对象的属性或方法时,JavaScript 是如何沿着原型链向上查找的。理解原型链是理解继承、`instanceof` 操作符以及`Object.create()` 等核心概念的基础。 `this` 关键字的指向: `this` 关键字是 JavaScript 中一个令人头疼的概念,它的指向在不同的调用上下文中会发生变化。本书将系统地梳理 `this` 的四种主要绑定规则(默认绑定、隐式绑定、显式绑定、`new` 绑定),并提供清晰的示例来帮助您理解在不同场景下 `this` 的指向。我们将探讨 `call()`、`apply()`、`bind()` 方法如何显式地绑定 `this`。 ES6 Classes 的本质: 虽然 ES6 引入了 `class` 关键字,但其本质仍然是基于原型的。我们将揭示 ES6 `class` 语法的背后,其实是原型链的语法糖,从而帮助您更全面地理解 JavaScript 的面向对象模型。 继承的实现方式: 除了原型链继承,我们还将探讨其他继承模式,例如组合继承、寄生组合继承,以及 ES6 `extends` 关键字的实现原理。 第四部分:现代 Web 开发的实践与演进 在掌握了 JavaScript 的核心原理之后,我们将把目光投向现代 Web 开发的实践。 模块化开发: 随着项目规模的增大,模块化开发成为必然。我们将介绍 CommonJS、AMD、ES Modules 等主流模块化规范,并重点讲解 ES Modules 在现代 JavaScript 中的地位,以及如何使用 `import` 和 `export` 来组织代码。 前端框架的原理浅析(不涉及具体框架细节): 本部分将从原理层面,浅显地介绍现代前端框架(如 React、Vue.js、Angular)在状态管理、组件化、虚拟 DOM、数据绑定等方面的设计思想。旨在帮助读者理解框架的出现是为了解决什么问题,以及它们是如何运用 JavaScript 的核心能力来实现的。 构建工具与工程化: Webpack、Rollup、Vite 等构建工具在现代前端开发中扮演着至关重要的角色。我们将简要介绍构建工具的作用,例如代码打包、模块化、资源优化、热更新等,让读者对前端工程化的流程有一个基本的认识。 性能优化基础: 了解 JavaScript 的运行机制,是进行性能优化的前提。我们将从事件循环、内存管理等方面,探讨一些基础的性能优化思路,例如如何避免内存泄漏、如何优化异步加载策略等。 结语 JavaScript 的世界广阔而深邃。本书的目标不是让您成为某个框架的熟练使用者,而是让您真正理解 JavaScript 的“灵魂”所在。通过深入剖析异步编程、函数式编程和原型链等核心概念,您将能够更好地理解现有的 JavaScript 代码,更自信地解决复杂问题,并以更优雅、更高效的方式编写出色的 Web 应用程序。希望本书能成为您在 JavaScript 之旅中不可或缺的指南。
这本《包邮 JavaScript框架设计(第2版)》真的是一本值得反复阅读的经典之作。我之前在学习一些主流框架时,总觉得知其然,而不知其所以然。这本书就像一位引路人,为我揭开了框架神秘的面纱。司徒正美老师的讲解深入浅出,尤其是在解释一些核心概念时,能够巧妙地结合实际场景,让我能够更好地理解其背后的逻辑。例如,书中关于“依赖注入”的讲解,就让我明白了为什么很多框架能够实现灵活的组件扩展和解耦。我特别喜欢书中对于“响应式编程”的阐述,作者通过对比不同的响应式实现方式,清晰地展示了如何在框架层面构建高效、可预测的数据流。此外,书中对于“可扩展性”和“可维护性”的设计原则的强调,也让我受益匪浅,这对于我们日常的开发实践具有重要的指导意义。读完这本书,我感觉自己对 JavaScript 的理解更加深刻,对框架的设计思路也更加清晰,这为我未来的技术发展奠定了坚实的基础。