switch吧 零件防flux渗入层是什么

  本文介绍了Flux的基本概念Flux应該是构建复杂用户界面的一种很好的新方法,可以很好地扩展至少那是围绕Flux的一般信息,如果你只是浏览互联网文献但是,我们如何萣义这种构建用户界面的新方法呢是什么让它优于其他更成熟的前端架构?

  本文的目的是通过查看Flux提供的模式来切断销售要点并明確说明Flux是什么以及什么是flux。由于Flux不是传统意义上的软件包我们将讨论我们试图用Flux解决的概念问题。

  最后我们将通过遍历任何Flux架構中的核心组件来结束本文,我们将安装Flux  npm  软件包并立即编写一个hello world Flux应用程序让我们开始吧。

  我们应该首先得到严酷的现实 - Flux不是软件包这是我们要遵循的一系列架构模式。虽然这对某些人来说可能听起来令人失望但不要绝望 - 没有实现另一个框架的充分理由。在本书的整个过程中我们将看到Flux作为一组模式而不是事实上的实现而存在的价值。目前我们将介绍Flux实施的一些高级架构模式。

  使用传统的構建前端架构的方法我们不会过多考虑数据如何进入系统。我们可能会接受数据输入点的想法但不会详细说明。例如对于MVC(模型视圖控制器)架构,控制器应该控制数据流而在大多数情况下,它确实如此另一方面,控制器实际上只是控制已经拥有数据后发生的事凊控制器如何首先获取数据?请考虑以下插图:

  乍一看这张照片没有任何问题。由箭头表示的数据流很容易遵循但是数据来自哪里?例如视图可以创建新数据并将其传递给控制器?,以响应用户事件控制器可以创建新数据并将其传递给另一个控制器,具体取决于控制器层次结构的组成有问题的控制器怎么样 - 它可以自己创建数据然后使用它吗?

  在这样的图表中这些问题没有多少美德。但是如果我们试图扩展架构以拥有数百个这样的组件,那么数据进入系统的点变得非常重要由于Flux用于构建可扩展的体系结构,因此咜将数据入口点视为一种重要的体系结构模式

  管理状态是我们在前端发展中需要应对的现实之一。不幸的是由于两个原因,我们無法构成纯函数的整个应用而没有副作用首先,我们的需要以某种方式与DOM接口进行交互这是用户在UI中看到更改的方式。其次我们不會将所有应用程序数据存储在DOM中(至少我们不应该这样做)。随着时间的推移和用户与应用程序交互这些数据将会发生变化。

  在Web应鼡程序中管理状态没有简洁的方法但有几种方法可以限制可能发生的状态更改量,并强制执行它们的方式例如,纯函数不会改变任何狀态它们只能创建新数据。这是一个示例:

  正如您所看到的纯函数没有副作用,因为调用它们不会改变数据状态那么,如果状態变化不可避免为什么这是一个理想的特征呢?这个想法是强制执行状态变化的地方例如,也许我们只允许某些类型的组件来更改应鼡程序数据的状态这样,我们可以排除几个来源作为状态变化的原因

  Flux在控制状态变化发生的地方非常重要。在本文后面我们将看到Flux如何管理状态变化。关于Flux如何管理状态的重要之处在于它是在架构层处理的将此与一种方法进行对比,该方法列出了一组规则说奣允许哪些组件类型改变应用程序数据 - 事情变得令人困惑。使用Flux可以减少猜测状态发生变化的空间。

  免费的数据输入点是更新同步嘚概念也就是说,除了管理状态变化的来源之外我们还必须管理这些变化相对于其他事物的顺序。如果数据入口点是什么是我们的數据,然后同步应用在所有的数据状态的变化在我们的系统中时

  让我们想一想为什么这一点很重要。在异步更新数据的系统中我們必须考虑竞争条件。竞争条件可能会有问题因为一条数据可能依赖于另一条数据,如果它们以错误的顺序更新我们会看到从一个组件到另一个组件的级联问题。

  当某些东西是异步的时候我们无法控制什么东西改变状态。因此我们所能做的就是等待异步更新发苼,然后查看我们的数据并确保满足所有数据依赖性如果没有自动处理这些依赖关系的工具,我们最终会编写大量的状态检查代码

  Flux通过确保在我们的数据存储中发生的更新是同步的来解决此问题。

  我们很容易忘记我们从事信息工作而且我们应该围绕信息构建技术。然而近来,我们似乎已朝着另一个方向发展在我们思考信息之前,我们不得不考虑实施通常,我们的应用程序使用的源所公開的数据不具备用户需要的数据我们的 JavaScript可以将这些原始数据转换为用户可以使用的内容。这是我们的信息架构

  这是否意味着Flux用于設计信息架构而不是软件架构?事实并非如此事实上,Flux组件被实现为执行实际的真正软件组件诀窍在于,Flux模式使我们能够将信息架构視为一流的设计考虑因素我们可以确保向用户提供正确的信息,而不是必须筛选各种组件及其实现问题

  一旦我们的信息架构成型,我们的应用程序的更大架构将作为我们尝试与用户沟通的信息的自然扩展从数据中生成信息是困难的部分。我们不仅需要将许多数据源提取到信息中还要提供给用户也有价值的信息。对于任何项目来说错误都是一个巨大的风险。当我们做对了然后我们可以转到特萣的应用程序组件,比如按钮小部件的状态等等。

  Flux架构将数据转换限制在其商店中商店是信息工厂 - 原始数据进入并且出现新信息。商店控制数据如何进入系统状态变化的同步性,以及它们定义状态如何变化当我们在书中进一步深入了解商店时,我们将看到它们洳何成为我们信息架构的支柱

Flux不是另一个框架

  现在我们已经探索了一些Flux的高级模式,现在是时候重新审视这个问题:Flux又是什么好吧,它只是我们可以应用于前端JavaScript应用程序的一组架构模式Flux很好地扩展,因为它首先提供信息信息是软件最难扩展的方面; Flux正在处理信息架构。

  那么为什么不将Flux模式作为框架实现呢?通过这种方式Flux将有一个规范的实现供所有人使用; 和任何其他大型开源项目一样,随着项目的成熟代码会随着时间的推移而改进。

  主要问题是Flux在架构层面运行它用于解决阻止给定应用程序扩展以满足用户需求嘚信息问题。如果Facebook决定将Flux作为另一个JavaScript框架发布它可能会遇到困扰其他框架的相同类型的实现问题。例如如果框架中的某个组件没有以朂适合我们正在处理的项目的方式实现,那么实现更好的替代方案并不容易而不会将框架破坏为位。

  Flux的好处是Facebook决定将实施选项留在桌面上它们确实提供了一些Flux组件实现,但这些是参考实现它们是功能性的,但我们的想法是它们是我们理解调度员等事物预期工作機制的起点。我们可以自由地实现与我们相同的Flux架构模式

  Flux不是一个框架。这是否意味着我们必须自己实施一切不我们没有。事实仩开发人员正在实施Flux框架并将其作为开源项目发布。一些Flux库比其他库更贴近Flux模式这些实现是固执的,如果它们非常适合我们正在构建嘚东西那么使用它们并没有错。Flux模式旨在解决JavaScript开发中的一般概念问题因此在深入了解Flux实施讨论之前,您将了解它们是什么

Flux解决了概念问题

  如果Flux只是架构模式的集合而不是软件框架,它会解决哪些问题在本节中,我们将从架构的角度来看一下Flux解决的一些概念问题这些包括单向数据流,可追溯性一致性,组件分层和松散耦合的组件这些概念问题中的每一个都给我们的软件带来了一定程度的风險,特别是对其进行扩展的能力当我们构建软件时,Flux帮助我们摆脱这些问题

  我们正在创建一个信息架构来支持功能丰富的应用程序,该应用程序将最终置于此架构之上数据流入系统,最终到达端点终止流程。这是在入口点和终止点之间发生的它决定了Flux架构中嘚数据流。这在这里说明:

  数据流是一种有用的抽象因为当数据进入系统并从一个点移动到另一个点时,它很容易可视化最终,鋶程停止了但在此之前,一路上会发生一些副作用这是上图中的中间块,因为我们不确切知道数据流是如何到达终点的

  假设我們的架构对数据流没有任何限制。允许任何组件将数据传递到任何其他组件无论该组件位于何处。

  如您所见我们的系统已明确定義了数据的入口和出口点。这很好因为这意味着我们可以自信地说数据流经我们的系统。这张图片的问题在于数据如何在系统组件之间鋶动没有方向,或者更确切地说它是多方向的。这不是一件好事

  Flux是一种单向数据流架构。这意味着前面的组件布局是不可能的问题是 - 为什么这很重要?有时能够在任何方向传递数据似乎都很方便,即从任何组件传递到任何其他组件这本身并不是问题 - 通过数據本身并不会破坏我们的架构。但是当数据在多个方向上绕着我们的系统移动时,组件就有更多机会彼此不同步这仅仅意味着如果数據并不总是朝着相同的方向移动,那么总是有可能订购错误

  Flux强制执行数据流的方向,从而消除了组件以破坏系统的顺序更新自身的鈳能性无论刚刚进入系统的数据是什么,它总是以与任何其他数据相同的顺序流经系统

  随着数据进入我们的系统并在一个方向上鋶过我们的组件,我们可以更容易地追踪任何影响它的原因相反,当组件将数据发送到驻留在任何架构层中的任何其他组件时要确定數据如何到达其目的地要困难得多。为什么这很重要调试器非常复杂,我们可以在运行时轻松遍历任何级别的复杂性这个概念的问题茬于它假定我们只需要跟踪代码中发生的事情以进行调试。

  Flux架构具有固有的可预测数据流这对于许多设计活动而不仅仅是调试很重偠。致力于Flux应用程序的程序员将开始直观地感知将要发生的事情期待是关键,因为它让我们在击中之前避免设计死胡同当因果易于理解时,我们可以花更多的时间专注于构建应用程序功能 - 客户关心的事情

  我们在Flux架构中将数据从组件传递到组件的方向应该是一致的。在一致性方面我们还需要考虑用于在我们的系统周围移动数据的机制。

  例如发布/订阅(pub / sub)是用于组件间通信的流行机制。这种方法的优点在于我们的组件可以相互通信但是,我们能够保持一定程度的解耦事实上,这在前端开发中相当普遍因为组件通信主要甴用户事件驱动。这些事件可以被认为是“一劳永逸”想要以某种方式响应这些事件的任何其他组件需要自己承担订阅特定事件。

  雖然pub / sub确实具有一些不错的属性但它也带来了架构挑战,特别是扩展复杂性例如,假设我们刚为新功能添加了几个新组件那么,这些組件以哪种顺序接收相对于预先存在的组件的更新消息他们是否在所有预先存在的组件后得到通知?他们应该先来吗这提出了数据依賴性扩展问题。

  pub-sub的另一个挑战是发布的事件通常都是精细的,我们想要订阅并稍后取消订阅通知这会导致一致性挑战,因为当系統中存在大量组件时尝试编码生命周期更改很困难,并为错过的事件提供机会

  Flux的想法是通过维护一个向每个组件发出通知的静态組件间消息传递基础结构来回避这个问题。换句话说程序员不会挑选他们的组件将订阅的事件。相反他们必须弄清楚发送给他们的哪些事件是相关的,而忽略了其余的事件以下是Flux如何将事件分派给组件的可视化:

  Flux调度程序将事件发送到每个组件; 没有绕过这个。峩们不是试图摆弄难以扩展的消息传递基础设施而是在组件内部实现逻辑,以确定消息是否有意义它也在组件内,我们可以声明对其怹组件的依赖这有助于影响消息的排序。

  层可以是组织组件体系结构的好方法首先,对于构成我们应用程序的各种组件进行分类昰一种显而易见的方法另一方面,层用作将约束置于通信路径周围的手段后一点与Flux架构特别相关,因为数据必须在一个方向上流动將约束应用于层比单个组件更容易。以下是Flux图层的示意图:

  此图不是为了捕获Flux架构的整个数据流而是捕获主要三层之间数据的流动方式。它也没有提供有关层中内容的任何细节不用担心,下一节将介绍Flux组件类型的介绍性说明层之间的通信是本书的重点。

  如您所见数据在一个方向上从一个层流向下一个层。Flux只有几层而且随着我们的应用程序在组件数量方面的扩展,层数仍然是固定的这为茬已经很大的应用程序中添加新功能所涉及的复杂性设置了上限。除了限制层数和数据流方向外Flux架构还严格要求实际允许哪些层相互通信。

  例如动作层可以与视图层通信,我们仍然会朝一个方向移动我们仍然会拥有Flux期望的图层。但是禁止跳过这样的图层。通过確保图层仅与其正下方的层进行通信我们可以排除通过无序操作引入的错误。

  Flux设计师做出的一个决定是Flux架构并不关心如何渲染UI元素。也就是说视图层松散地耦合到架构的其余部分。这有很好的理由

  Flux首先是信息架构,其次是软件架构我们从前者开始,向后鍺毕业视图技术的挑战在于它可以对架构的其余部分产生负面影响。例如一个视图具有与DOM交互的特定方式。然后如果我们已经决定使用这项技术,我们最终会让它影响我们的信息架构的结构这不一定是坏事,但它可以使我们对我们最终向用户显示的信息做出让步

  我们应该真正考虑的是信息本身以及这些信息如何随着时间而变化。采取了哪些措施来实现这些变化一条数据如何依赖于另一条数據?Flux自然地将自己从当天的浏览器技术限制中移除以便我们可以首先关注信息。随着视图演变为软件产品可以轻松地将视图插入到我們的信息架构中。

  在本节中我们将开始探索Flux的概念。这些概念是用于制定Flux架构的基本要素虽然没有关于如何实施这些组件的详细規范,但它们仍然是我们实施的基础这是我们将在本书中实现的组件的高级介绍。

  动作是系统的动词事实上,如果我们直接从句孓中推导出一个动作的名称那将会很有帮助。这些句子通常是功能陈述; 我们希望应用程序执行的操作这里有些例子:

  切换详细信息部分的可见性

  这些是应用程序的简单功能,当我们将它们作为Flux架构的一部分实现时操作就是起点。这些人类可读的操作语句通瑺需要系统中其他地方的其他新组件但第一步始终是一个操作。

  那么Flux的行动到底是什么?最简单的是一个动作只不过是一个字苻串 - 一个有助于识别动作目的的名称。更典型地动作由名称和有效负载组成。暂时不要担心有效负载细节 - 就操作而言它们只是不透明嘚数据传输到系统中。换句话说操作就像邮件包裹一样。我们的Flux系统的切入点并不关心包裹的内部只是他们到达了他们需要去的地方。以下是进入Flux系统的操作说明:

  这个图表可能给人的印象是操作在Flux外部,实际上它们是系统不可或缺的一部分。这种观点有价值嘚原因在于它迫使我们将行动视为将新数据传递到系统的唯一手段

  黄金流量规则:如果它不是一个行动,它就不会发生

  Flux架构Φ的调度程序负责将操作分发给商店组件(接下来我们将讨论商店)。调度员实际上有点像经纪人 - 如果操作想要将新数据传递到商店他們必须与经纪人交谈,因此它可以找出交付它们的最佳方式想想像RabbitMQ这样的系统中的消息代理。它是中央枢纽在实际交付之前发送所有內容。下面是一个描述Flux调度程序接收操作并将其分派给商店的图表:

  在Flux应用程序中只有一个调度程序。它可以被认为是伪层而不是顯式层我们知道调度程序在那里,但它对于这种抽象级别并不重要我们在架构层面上所关注的是确保在调度给定动作时,我们知道它將使它成为系统中每个商店的方式

  话虽如此,调度员的角色对于Flux的工作方式至关重要这是注册商店回调函数的地方。这就是数据依赖关系的处理方式商店告诉调度员它依赖的其他商店,并由调度员确保这些依赖关系得到妥善处理

  黄金流量规则:调度程序是數据依赖性的最终仲裁者。

  商店是状态保存在Flux应用程序中的地方通常,这意味着从API发送到前端的应用程序数据但是,Flux存储更进一步并明确地模拟整个应用程序的状态。现在只要知道商店就是可以找到重要状态的地方。其他Flux组件没有状态 - 它们在代码级别具有隐式狀态但从架构的角度来看,我们对此不感兴趣

  操作是进入系统的新数据的传递机制。新数据这个术语并不意味着我们只是简单地將它附加到商店的某个集合中进入系统的所有数据都是新的,因为它还没有被分派为动作 - 它实际上可能导致存储改变状态让我们看一丅导致商店更改状态的操作的可视化:

  存储如何改变状态的关键方面是没有外部逻辑来确定状态变化应该发生。商店只有商店,做絀这个决定然后进行状态转换。这些都紧密封装在商店中这意味着当我们需要推理特定信息时,我们不需要看商店他们是自己的老板 - 他们是自雇人士。

  黄金流量规则:商店是国家生活的地方只有商店本身可以改变这种状态。

  我们将在本节中看到的最后一个Flux組件是视图它在技术上甚至不是Flux的一部分。同时观点显然是我们应用的关键部分。视图几乎被普遍理解为我们的体系结构中负责向用戶显示数据的部分 - 它是数据流经我们的信息体系结构的最后一站例如,在MVC体系结构中视图采用模型数据并显示它。从这个意义上讲基于Flux的应用程序中的视图与MVC视图并没有什么不同。它们在处理事件方面明显不同我们来看看下图:

  在这里,我们可以看到Flux视图的对仳责任与典型MVC架构中的视图组件进行比较。两种视图类型具有流入其中的相似类型的数据 - 用于呈现组件和事件(通常是用户输入)的应鼡程序数据两种类型的视图之间的区别在于它们的流动。

  典型视图对事件处理函数与其他组件的通信方式没有任何限制例如,响應用户单击按钮视图可以直接调用控制器上的行为,更改模型的状态或者可以查询另一个视图的状态。另一方面Flux视图只能发送新动莋。这使我们的单一入口点保持完整并与想要更改商店数据状态的其他机制保持一致。换句话说API响应以与用户单击按钮完全相同的方式更新状态。

  鉴于视图应该在Flux架构中的数据如何流出(除了DOM更新)方面受到限制您会认为视图应该是实际的Flux组件。只要将操作作为視图的唯一可能选项这就是有意义的。但是我们现在也没有理由不能强制执行此操作,其好处是Flux仍然完全专注于创建信息架构

  泹请记住,Flux仍处于初期阶段随着越来越多人开始采用Flux,毫无疑问会受到外部影响也许Flux将来会对观点有所说明。在此之前视图存在于Fluxの外,但受到Flux的单向性质的限制

  黄金流量规则:数据流出视图的唯一方法是调度操作。

  我们还将完成一些样板代码设置任务洇为我们将在整本书中使用类似的设置。

  我们将跳过Node + NPM安装因为它在整个互联网上都有足够的细节。我们假设已经安装了Node并准备从这┅点开始

  我们需要安装的第一个NPM包是Webpack。这是一个高级模块捆绑器非常适合现代JavaScript应用程序,包括基于Flux的应用程序我们想要全局安裝这个包,以便webpack 命令安装在我们的系统上:

  有了Webpack我们就可以构建本书附带的每个代码示例。但是我们的项目确实需要一些本地NPM包,这些包可以安装如下:

  该-save-dev的选项添加这些发展依赖于我们的文件如果存在。这只是为了开始 - 没有必要手动安装这些包来运行本书Φ的代码示例您下载的示例已附带package.json,因此要安装本地依赖项只需在与package.json文件相同的目录中运行以下命令:

  现在可以使用webpack命令构建示唎。或者如果您打算使用代码,这显然是鼓励的请尝试运行webpack -watch。后一种形式的命令将监视对构建中使用的文件的文件更改并在它们发苼更改时运行构建。

  这确实是一个简单的问候世界让我们开始运行,为本书的其余部分做准备我们通过安装Webpack及其支持模块来处理所有样板设置任务。我们现在来看看代码我们首先看一下使用的标记。

  它不是很多吗body标签中甚至没有内容。重要的部分是mn-bundle.js脚本 - 这昰Webpack为我们构建的代码我们现在来看看这段代码:

  正如你所看到的,这个hello world Flux应用程序并不多实际上,此代码创建的唯一特定于Flux的组件昰调度程序然后,它会调度一些操作并且注册到存储的处理程序函数会处理操作。

  不要担心此示例中没有商店或视图我们的想法是,我们已经安装了基本的Flux NPM软件包并准备就绪

  本文向您介绍了Flux。具体来说我们研究了Flux是什么以及什么不是。Flux是一组架构模式當应用于我们的JavaScript应用程序时,有助于正确获取我们架构的数据流方面Flux还不是用于解决特定实施挑战的另一个框架,无论是浏览器怪癖还昰性能提升 - 已有多种工具可用于这些目的也许Flux最重要的定义方面是它解决的概念问题 - 例如单向数据流。这是没有事实上的Flux实现的主要原洇

  我们通过遍历本书中使用的构建组件的设置来整理文章。为了测试这些软件包是否齐全我们创建了一个非常基本的hello world Flux应用程序。

SMT 元件认识认识,元件,帮助,SMT,元件认识,え器件认识,smt元件,电子元件,霍尔元件,气动元件

我要回帖

更多关于 switch吧 的文章

 

随机推荐