Flux架构
  • 推荐0
  • 收藏0
  • 浏览989

Flux架构

段金辰等 (作者)  孙辉 (译者)

  • 书  号:978-7-121-31600-5
  • 出版日期:2017-06-16
  • 页  数:328
  • 开  本:16(185*235)
  • 出版状态:上市销售
  • 维护人:张春雨
纸质版 ¥89.00
Flux 是一套架构模型,将Web 应用的各个主要功能以组件的形式进行划分,并进一步划分子组件。而各组件又以动作、存储器和视图来进行架构分层。整体采用单向数据流的形式进行事件的响应,各组件间也强制按照单向数据流进行相互影响,直至数据流结束。在本书中,先向大家介绍了Flux 是什么,以及简单展示了其基本构建模式。然后从动作、存储器、视图、分发器等核心概念,更为详细地阐述了Flux的架构模式。最后,介绍了Flux 库、测试工具和其对其他相关技术栈的影响。
本书适用于前端开发者,以及希望对Flux 架构有深入了解的人群。
React全家桶的明珠 前端摆脱MV*的救赎 Facebook海量复杂数据的基石
感谢 Melissa 对我全部的爱和支持。 感谢 Jason、Simon 和 Kevin 照亮我的每一天。
译者序
自 1996年网景通信公司(Netscape Communications Corporation)将 JavaScript提交至欧洲计算机制造联合会( ECMA)以来,整个 Web前端应用的架构和开发发生了翻天覆地的变化,人们为了提高开发效率和带来更多新的特性,创造出了许多新的概念和工具。在很长一段时间里,MVC及其变种或改进版本( MV*),成为 Web前端应用中非常普遍的架构模式,其对视图和数据进行了分离但同时又保持互动,并将这种模式做得淋漓尽致,从而为高效开发 Web应用打下基础,而且在实际生活中,为人们带来了许多杰出的产品和优秀的体验。
然而,随着时代的发展和科技的进步,人们逐渐发现当前流行的架构仍旧存在弊端,而且有些是从根本上存在的。这些弊端有时非常隐蔽,甚至来自于这些架构中所引以为豪的部分。例如,过度的关注点分离,可能会造成某项功能由支离破碎的一些组件构成,这很容易给代码造成混乱,反而不利于扩展和维护。为了解决这些问题, Flux应运而生。2014年,Facebook在 F8开发者峰会上,发表了《 Flux——搭配 React的一套应用架构》的主题演讲,从而让 Flux受到更多人的关注。Flux一词在拉丁文中是“流”(Flow)的意思,这个单词诠释了 Flux的精髓,即基于单向数据流而构建的架构模型。
在 Flux架构中,数据流从开始到结束,从一个组件到另一个组件,从行为的触发到界面的展现,都是单向的,非常直观,也便于回溯;整体架构清晰简明,一切都是基于动作、分发器、存储器和视图进行的,分层也相对简单,避免了嵌套;对信息的操作和展示,都是基于操作和获取状态来实现的,这简化了信息数据和视图间交互的流程。所有这一切,对于搭建大型 Web应用来说,都是非常有用的,因为它能将问题变得更为简单可控,并在许多层面上保持了一致性。

译者序
由于 Flux本身是一套架构模式,而非一套完整的框架,因此,其更多的是提供一些在架构和开发过程中的程序设计思路,这使我们能够以更有利于建设可扩展的大型 Web应用的方式,对项目进行设计和实现,并能利用相关测试工具进行问题排查,从而在保证质量和体验的前提下,快速完成任务,并预留足够的扩展能力。当然,为了能够给开发者带来更多的便利,Flux也相应地提供了一定量的辅助库,可以直接使用,从而避免去实现一些在该架构模式中已经规格化的功能,本书就是以此为基础来介绍 Flux的使用的。但如果需要一套完整的基于 Flux的库,还可以使用 Alt.js或 Redux,前者完全遵循了 Flux的架构理念,而后者则更多的是借鉴。利用这些库,我们可以更为快速地开发自己的项目。
事实上,Flux并不依赖 React。但随着 React和 Redux的风靡,人们其实已经开始感受到 Flux对实际项目所产生的影响,并从中获益。然而,相比较于去熟悉如何使用一套框架来说,真正能给自己带来技术上质的成长突破的,应该是更多更深地去探究这些框架的实现方式,以及其所包含的思想。通过阅读本书,大家可以从零开始,对 Flux架构进行非常充分和完整的了解,从而能够在实际项目中,更好地运用自己所掌握的技术来提高质量和效率,并推动自身能力的进步。
段金辰 2017年 1月


关于作者
Adam Boduch从事大规模 JavaScript开发已经将近 10年。在转行前端之前,他曾使用 Python和 Linux编写过几个大规模的云计算产品。Adam对复杂度有一些了解,在真实世界的软件系统和应对其扩展上的挑战方面具有实际经验。
他写过几本 JavaScript的书,包括《JavaScript并发》(JavaScript Concurrency),他在研究用户体验创新和高性能方面充满热情。


关于审校者
August Marcello III是一位狂热的软件工程师,他在企业软件设计、实现和部署现代 Web应用程序架构方面拥有近二十年的经验。他专注于整个基于 SaaS的 Web生态系统,取得了令人信服的用户体验,同时也证明了自己。他对新兴技术的热情,加上特别关注前沿的 JavaScript平台,一直是他追求技术卓越的主要动力。他的业余生活也十分丰富,跑步、骑山地车以及和家人朋友待在一起。
非常感谢 Chuck、Mark、Eric和 Adam,我有幸与他们合作并学习。同时我也非常感谢家人、朋友和我在一起的珍贵经历。


关于译者
本书由段金辰、马雪琴、李胜、马飞、孙辉翻译。
段金辰从事软件开发大约 10年,曾供职于微软、阿里巴巴等世界知名公司,参与或主持过多项大型软件系统的架构和开发,涉及基础类库、云、Web前端、On-premises服务、 App等众多方向,精通包括 JavaScript在内的多种编程语言。
马雪琴,研究生就读于华中科技大学通信工程专业,其间有幸接触到前端、数据可视化等方向,并且对这些技术感到相见恨晚。现就职于阿里巴巴集团客户体验事业群前端开发团队。平时喜欢宅着看书,学着画画,更喜欢去外面走走看看,安静而不安分。
李胜,前端开发工程师。就职于阿里巴巴集团客户体验事业群前端开发团队,曾在饿了么大前端部门参与实习,热衷于追寻前沿技术。除前端相关技术以外,对游戏开发, Go以及其他后端技术也有一定了解。平时的爱好有动漫和科幻。
马飞,阿里巴巴前端工程师,半路出家进入了互联网行业,热衷于 Web技术,同时对工业控制,ARM嵌入式开发有一定的研究,喜欢旅行、电子游戏、运动以及摄影。其微博为@最亚伦。
孙辉,现为阿里巴巴的一只“前端攻城狮”,有多年的物联网及 Web前端开发经验。爱美食、爱摄影,热爱一切富有创造性的事物。个人主页为 http://www.sundway.me。


前言
我非常喜爱 Backbone.js,它是一个神奇的库,只用少量代码就完成了大量功能。它并没有做出任何规定和限制,允许做同一件事情可以有无数种方式。这一点使得 Backbone.js的开发者非常头疼!虽然,能随意采用任何方式去实现一项功能,是一件很棒的事,但这很容易导致许多潜在的问题。
当我首次接触 Flux时,我并不清楚该架构对 Backbone.js开发者有何帮助。昀终,我发现了两点:第一, Flux指定了实现方式,解决了 Backbone.js的那个问题;第二, Flux与 Backbone.js的创造灵感很接近,都是用少量部件来实现更多功能。
当我开始深入了解 Flux时,发现了其在扩展方面所带来的魅力。当 Backbone.js 和其他相关技术在某些方面不正确时,即导致了它们的问题。实际上,这些漏洞极其难以解决,因为其整套体系都要因此而做出变通处理,来绕过这些问题。
我希望我写的这本书能够帮助各类 JavaScript开发工程师从我正从事的来自 Facebook的这些技术中获得启示。
这本书包含什么
第 1章初步介绍了 Flux是什么及其存在的意义。
第 2章介绍了 Flux的核心原理和构建知识。
第 3章逐步介绍了如何搭建一个框架,以便在后续章节中介绍具体的功能实现。
第 4章介绍了当发生变化时,动作生成器是如何将数据填充到系统中去的。

Flux架构
第 5章以举例的方式展现了异步动作生成器以及它们是如何在 Flux架构中使用的。
第 6章给出了许多详细的解释和示例,以阐述 Flux存储器是如何工作的。
第 7章给出了许多详细的解释和示例,以阐述 Flux视图是如何工作的。
第 8章讨论了 Flux架构中的信息是如何进入系统以及昀终是如何退出系统的。
第 9章展示了不可变是软件架构的关键属性,如 Flux,数据流是单向的。
第 10章讨论如何实现自己的分发器来替代 Facebook的官方参考实现。
第 11章展示了如何使用其他非 React视图库技术配合 Flux使用。
第 12章介绍了两个非常流行的 Flux库,Alt.js和 Redux。
第 13章讨论了 Flux架构中的组件测试,以及架构的性能测试。
第 14章讨论了 Flux对于其他软件开发栈的影响和如何打包 Flux的功能。

你需要提前准备什么
.任何一款浏览器

. NodeJS 4.0或更高版本

.代码编辑器



本书的读者对象
你是否有尝试使用 React,但是又在使用 Flux的过程中绞尽脑汁的经历呢?或许,在处理可扩展应用时,你已厌倦了 MV*模式中意大利面条似的代码?你内心是否在问什么是 Flux?
Flux架构将引导你了解 Flux模式和设计的方方面面,以及如何去设计和开发基于此的强大 Web应用。
读本书之前,你并不需要事先知道 Flux是什么以及它是如何工作的,而对它的关联技术 ReactJS是零基础的读者,也同样适合阅读本书。不过,拥有较好的 JavaScript知识还是很有必要的。
本书约定
在这本书中,你会发现一些文本样式,以用于区分不同类型的信息。这里列举一些样

前言
式,并解释其含义。
文本中的代码、数据库表名、文件夹名称、文件名、文件扩展名、路径、虚拟 URL地址、用户输入和推特标签都将显示为代码体,如:当 HOME_LOAD动作被分发时,我们会修改存储器中的状态。
代码块的样式如下。
// 这个对象被用于多个动作生成器
// 以作为动作负载的一部分
export const PAYLOAD_SORT = {

direction: 'asc'
};


警告或重要信息会呈现在此区域。
提示和窍门会以此样式呈现。

读者服务
轻松注册成为博文视点社区用户(www.broadview.com.cn),扫码直达本书页面。
. 下载资源:本书如提供示例代码及资源文件,均可在下载资源处下载。

. 提交勘误:您对书中内容的修改意见可在提交勘误处提交,若被采纳,将获赠博文

视点社区积分(在您购买电子书时,积分可用来抵扣相应金额)。

. 交流互动:在页面下方读者评论处留下您的疑问或观点,与我们和其他读者一同学习交流。
页面入口:http://www.broadview.com.cn/31600

目录

目录
前言 .................................. XIX

1 Flux是什么 .................... 1
Flux是一套模式 ......................... 1
数据入口 ............................. 1
状态管理 ............................. 2
保持同步更新 ..................... 3
信息架构 ............................. 4
Flux并不是一个框架 ................. 4
Flux的设计思路问题解决方案 . 5
数据流向 ............................. 5
可回溯性 ............................. 7
通知的一致性 ..................... 8
简捷的架构分层 ................. 9
低耦合渲染 ......................... 9
Flux组件 ................................... 10
动作 ................................... 10
分发器 ............................... 11
存储器 ............................... 12
视图 ................................... 12
安装 Flux软件包 ...................... 14
小结 ........................................... 16


2 Flux的原则 .................. 17
MV*所面临的挑战 ................... 17
关注点分离 ....................... 18
级联更新 ........................... 19
模型更新的职责 ............... 20
单向数据 ................................... 21
从开始到结束 ................... 22
无毒无害 ........................... 23
显式优于隐式 ........................... 23
暗藏隐患的更新 ............... 24
集中修改状态的地方 ....... 26
太多动作? ....................... 26
分层优于嵌套 ........................... 27
多组件嵌套 ....................... 27
嵌套深度与副作用 ........... 28
数据流和分层 ................... 28
应用数据和界面状态 ............... 29
两个相同的东西 ............... 29
强耦合转换 ....................... 30
功能中心化 ....................... 31
小结 ........................................... 31

3 搭建骨架架构 ............... 32
总体组织 ................................... 32
目录结构 ........................... 33
依赖管理 ........................... 33
信息设计 ................................... 34
用户不需要了解模型 ....... 34
存储器映射用户看到的内容 ......................................... 35
和哪些东西协同工作 ....... 36
在动作中注入存储器 ............... 36
获取 API数据 ................... 36
改变 API资源状态 ........... 42
本地动作 ........................... 47
存储器和功能域 ....................... 50
梳理顶层功能 ................... 50
无关紧要的 API数据 ....... 51
构造存储器数据 ............... 53
模拟视图 ................................... 53
找寻失去的数据 ............... 53
定位动作 ........................... 54
端到端场景 ............................... 56
动作清单 ........................... 56
存储器清单 ....................... 56
视图清单 ........................... 57
小结 ........................................... 57

4 创建动作 ...................... 58
动作的名称和常量 ................... 58
动作命名约定 ................... 58
静态动作数据 ................... 59
组织动作常量 ................... 62
特性动作生成器 ....................... 63
什么时候需要模块化 ....... 63
模块化架构 ....................... 64
模拟数据 ................................... 65
模拟已存在的接口 ........... 65
模拟新接口 ....................... 66
替换动作生成器 ............... 70
状态动作生成器 ....................... 71
整合其他系统 ................... 72
web socket连接 ................ 73
参数化动作生成器 ................... 76
删除多余的动作 ............... 76
保持动作的通用性 ........... 77
创建衍生动作 ................... 80
小结 ........................................... 81

5 异步动作 ...................... 83
保持 Flux同步 .......................... 83
为什么要同步 ................... 83
压缩异步行为 ................... 84
异步动作语义 ................... 85
创建 API调用 ........................... 87
API是常见的情况 ............ 87
API调用和用户交互 ........ 88
结合 API调用 ........................... 92
复杂的动作生成器 ........... 93
组合动作生成器 ............... 96
返回 promise ............................. 97
不含 promise的同步 ........ 98
组织异步行为 ................... 99
错误处理 ......................... 101
小结 ......................................... 103

6 改变 Flux存储器的状态 .............................................105
适应不断变化的信息 ............. 105
变化的 API数据 ............. 105
变化的功能 ..................... 106
受影响的组件 ................. 107
减少重复的存储器数据 ......... 107
通用存储器数据 ............. 107
注册通用存储器 ............. 108
结合通用和专用数据 ..... 112
处理存储器的依赖关系 ......... 116
等待存储器 ..................... 116
数据依赖 ......................... 118
UI依赖 ............................ 119
视图的更新顺序 ..................... 125
存储器的注册顺序 ......... 125
视图渲染的优先级排序 . 125
处理存储器复杂度 ................. 126
存储器太多 ..................... 126
反思功能域 ..................... 126
小结 ......................................... 127

7 视图信息 .....................128
传递视图数据 ......................... 128
change事件中的数据 ..... 128
视图决定何时渲染 ......... 132
保持视图无状态 ..................... 135
UI状态属于存储器 ........ 135
不用查询 DOM ............... 135
视图的职责 ............................. 136
渲染存储器数据 ............. 136
子视图结构 ..................... 137
用户交互 ......................... 138
在 Flux中使用 ReactJS .......... 138
设置视图状态 ................. 139
组成视图 ......................... 143
响应事件 ......................... 146
路由和动作 ..................... 149
小结 ......................................... 154

8 信息的生命周期 ...........155
组件生命周期难题 ................. 155
回收不再使用的资源 ..... 156
隐藏依赖 ......................... 157
内存泄漏 ......................... 157
Flux结构是静态的 ................. 158
单例模式 ......................... 158
与模型进行比较 ............. 161
静态视图 ......................... 161
扩展信息 ................................. 165
如何很好地扩展 ............. 165
昀小化所需信息 ............. 169
扩展的动作 ..................... 169
闲置的存储器 ......................... 170
删除存储器数据 ............. 170
优化闲置的存储器 ......... 173
保持存储器数据 ............. 174

小结 ......................................... 182

9 不可变的存储器 ...........183
放弃隐藏的更新 ..................... 183
如何破坏 Flux架构 ........ 184
获取存储器数据 ............. 186
一切皆不可变 ................. 187
强制执行单向数据流 ............. 187
纵横交错的单向数据流 . 188
过多的存储器? ............. 189
没有足够的动作 ............. 189
强制不可变性 ................. 190
不可变数据的成本 ................. 195
垃圾回收是昂贵的 ......... 196
批量转换 ......................... 196
抵消成本 ......................... 197
使用 Immutable.js ................... 197
不可变列表和映射 ......... 198
不可变的转换 ................. 201
变化检测 ......................... 204
小结 ......................................... 208

10 实现分发器 ................209
抽象分发器接口 ..................... 209
存储器的注册地 ............. 209
分发负载 ......................... 210
依赖关系的处理 ............. 211
分发器所面临的挑战 ............. 212
教育的目的 ..................... 212
单例模式的分发器 ......... 212
手动注册存储器 ............. 213
容易出错的依赖管理 ..... 213
构建分发器模块 ..................... 214
封装存储器的引用 ......... 214
处理依赖 ......................... 215
分发动作 ......................... 217
优化存储器的注册 ................. 220
基础存储器类 ................. 221
一个动作方法 ................. 222
小结 ......................................... 226

11 可替代的视图组件 .....227
ReactJS是适合 Flux的 .......... 227
ReactJS是单向的 ........... 227
重新渲染数据很简单 ..... 229
短小精悍的代码 ............. 229
ReactJS的缺点 ....................... 230
虚拟 DOM和内存 .......... 230
JSX和标记语言 .............. 231
库锁定 ............................. 232
使用 jQuery和 Handlebars ..... 232


为什么是 jQuery和 Handlebars ................................... 232
渲染模板 ......................... 233
组合视图 ......................... 236
事件处理 ......................... 238
使用 VanillaJS ......................... 244
对可选择性保持开放 ..... 244
迁移到 React ................... 244
新的技术热点 ................. 245
小结 ......................................... 245

12 使用 Flux库 ..............247
实现核心 Flux组件 ................ 247
自定义分发器 ................. 247
实现一个基本的存储器 . 248
创建动作 ......................... 248
实现中遇到的痛点 ................. 249
分发异步动作 ................. 249
划分存储器 ..................... 249
使用 Alt ................................... 250
核心理念 ......................... 250
创建存储器 ..................... 251
声明动作生成器 ............. 253
监听状态变化 ................. 254
视图渲染以及分发动作 . 255
使用 Redux .............................. 258
核心思想 ......................... 258
状态转换器和存储器 ..... 259
Redux动作 ...................... 262
渲染组件和分发动作 ..... 264
小结 ......................................... 269


13 测试和性能 ................270

你好,Jest ............................... 270
测试动作生成器 ..................... 272
同步函数 ......................... 273
异步函数 ......................... 274
测试存储器 ............................. 277
测试存储器监听器 ......... 277
测试初始状态 ................. 280
性能目标 ................................. 283
用户感知的性能 ............. 283
测量的性能 ..................... 284
性能需求 ......................... 284
分析工具 ................................. 285
异步动作 ......................... 285
存储器内存 ..................... 285
CPU占用 ........................ 286
基准测试工具 ......................... 286
代码的基准测试 ............. 286
状态转换 ......................... 287
小结 ......................................... 290

14 Flux和软件开发的生命周期 ....................................291
Flux的开放性解释 ................. 291
实现选项一:只是模式 . 292
实现选项二:使用 Flux库 .......................................... 292
实现并使用自己的 Flux . 292
开发方法论 ............................. 293
在 Flux初期要考虑的事情 .......................................... 293
成熟的 Flux应用 ............ 294
从 Flux中获得的启示 ............ 294
单向数据流 ..................... 295
信息设计为王 ................. 295
打包 Flux组件 ........................ 295
完整独立的 Flux ............. 296
可安装的软件包 ............. 296
可安装的 Flux组件 ........ 296
小结 ......................................... 304

读者评论

  • 请问没有随书代码下载吗

    Alice2017发表于 2017/7/13 10:51:18
    • 读者朋友你好,配书资料已经上传,可在本书页面的“下载资源”板块下载。

      博文小编发表于 2017/7/17 9:01:27

下载资源

相关博文

  • Flux 是什么?

    Flux 是什么?

    管理员账号 2017-07-11

    小编说:本文的目标是通过了解Flux 提出的模式,来明白Flux 的核心要点,以及弄清楚它到底是什么。并且,由于Flux 不是传统意义上的软件包,因此我们将仔细研究通过Flux 来解决设计思路上的问题。相关图书推荐《Flux架构》 ...

    管理员账号 2017-07-11
    676 0 0 0