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
请问没有随书代码下载吗