组件化编程
- 格式:doc
- 大小:178.50 KB
- 文档页数:30
组件化开发组件化开发是一种现代软件开发的方法论,它将整个软件系统拆分成多个独立、可重用的组件,并通过定义清晰的接口和约束规范来实现组件间的通信和协作。
通过组件化开发,可以极大地提高软件开发的效率和可维护性,同时降低了软件系统的复杂度和耦合度。
一、组件化开发的概念和背景随着软件系统的不断发展和壮大,传统的单体应用架构面临着越来越多的挑战。
随之而来的是巨大的代码量、复杂的开发流程以及繁琐的维护工作。
为了解决这些问题,组件化开发应运而生。
组件化开发将软件系统拆分成多个互相独立的模块,每个模块都具有清晰的职责和接口。
这些模块可以独立地开发、部署和维护,并且可以在不同的项目中复用。
通过定义良好的接口和规范,各个模块之间可以进行高效的通信和协作,从而构建出复杂而又可维护的软件系统。
二、组件化开发的优势和特点1. 提高开发效率:组件化开发可以将复杂的软件系统拆分成多个独立的组件,每个组件只关注自己的职责,开发人员可以并行地开发不同的组件,从而显著提高开发效率。
2. 提高代码质量:组件化开发强制隔离和解耦各个模块,模块之间的依赖关系明确可见,这样可以更容易地进行单元测试和功能测试,保证代码的质量。
3. 提高复用性:通过组件化开发,可以将独立的组件抽取出来并进行统一的管理,进而在不同的项目中复用,从而减少重复开发的工作量。
4. 方便维护和升级:由于组件化开发强调模块之间的解耦和独立性,因此在维护和升级时可以只针对某个组件进行操作,而不会影响其他组件的正常运行。
5. 便于团队协作:组件化开发使得团队成员可以独立工作在不同的模块上,通过约定的接口进行交互,提高了团队的协作效率。
三、组件化开发的实践在实践中,组件化开发有多种实现方式,常见的有插件化和服务化两种方式。
1. 插件化:插件化是一种将软件系统拆分成多个独立的插件,并在运行时动态加载的开发方式。
每个插件具有独立的生命周期和运行环境,插件之间通过定义清晰的接口和协议进行通信和协作。
qml组件化编程MVC编程⼀MVC编程,通俗的说就是实现数据、视图与业务的分离,采⽤分⽽治之的模式。
也许很多⼈知道MVC是怎么回事,但是⽤起来却有点⽆从下⼿,那么我们先从⼩Deml说起。
上代码1、model与view分离,但是仍在qml中实现所有import QtQuick 2.3Rectange{width: 450height: 640;GridView{id: showViewanchors.fill: parentcellWidth: 50cellHeight: 50model: dataModeldelegate: delegateComp}Component{id: delegateCompRectangle{width: viewWidthheight: viewHeightcolor: itemColor}}ListModel{id: dateModelListElement{viewWidth: 50; viewHeight: 50; itemColor: "red"}ListElement{viewWidth: 20; viewHeight: 50; itemColor: "yellow"}ListElement{viewWidth: 100; viewHeight: 100; itemColor: "blue"}}}效果图如下:这⾥我们实现了⼀个最简单的MVC组件。
但是从上图中效果有点费解,为什么设置了⼤⼩,却没起作⽤,甚⾄各个组件之间会有空⽩。
这是因为GridView中cellWIdth决定的。
如果组件的⼤⼩被cell的⼤⼩包含,那么cell⽐组件多出来的部分会⽤空⽩填充;反过来,如果组件的⼤⼩⽐cell⼤,那么就会被裁剪成cell⼤⼩,如蓝⾊框⼀般(1)现在我们在升级⼀部分功能,将⼩框组件化//Rect.qmlimport QtQuick 2.3Rectangle{}//main.qmlimport QtQuick 2.3Rectange{width: 450height: 640;GridView{id: showViewanchors.fill: parentcellWidth: 50cellHeight: 50model: dataModeldelegate: delegateComp}Component{id: delegateCompRect{width: viewWidthheight: viewHeightcolor: itemColor}}ListModel{id: dateModelListElement{viewWidth: 50; viewHeight: 50; itemColor: "red"}ListElement{viewWidth: 20; viewHeight: 50; itemColor: "yellow"}ListElement{viewWidth: 100; viewHeight: 100; itemColor: "blue"}}}我们通过把委托中的组件单独封装成⼀个独⽴的组件,这样不仅在这⾥可以使⽤,在其他地⽅也可以创建(2)把Model从qml中剥离出来 既然是组件化编程,那么数据是动态的,视图也是根据数据动态创建。
vue 编程语言Vue是一种流行的前端编程语言,被广泛应用于Web开发中。
它具有简洁明了的语法和丰富的功能,使得开发人员能够轻松构建交互性强、用户体验优秀的网页应用。
一、Vue的基本概念Vue是一种基于JavaScript的框架,用于构建用户界面。
它采用了组件化的开发方式,将整个应用划分为一个个独立的组件,每个组件负责处理特定的功能和展示内容。
这种组件化的架构使得开发人员能够高效地编写和维护代码,同时提高了代码的可复用性。
二、Vue的特点1.响应式数据绑定:Vue使用了双向数据绑定的机制,使得数据的变化能够自动反映到视图上。
开发人员只需要关注数据的变化,而不需要手动更新视图,大大简化了开发流程。
2.组件化开发:Vue充分利用了组件化的思想,将界面划分为多个独立的组件,每个组件负责特定的功能和展示内容。
这种组件化的开发方式使得代码的复用性和可维护性大大提高。
3.虚拟DOM:Vue使用虚拟DOM来提高页面的渲染效率。
它通过将页面的状态保存在内存中的虚拟DOM树上,然后与真实的DOM树进行比较,只更新发生变化的部分,减少了不必要的重绘和重排,提升了页面的性能。
4.工具链的完善:Vue提供了一套完整的工具链,包括Vue CLI、Vue Router和Vuex等工具,使得开发人员能够更加高效地开发和调试应用。
三、Vue的使用场景Vue适用于各种规模的项目,从简单的个人网站到复杂的企业级应用都可以使用Vue进行开发。
以下是一些Vue常见的应用场景:1.单页面应用(SPA):Vue的虚拟DOM机制和组件化开发方式使得它非常适合开发单页面应用。
通过Vue Router和Vuex等工具,开发人员可以更加方便地管理页面的路由和状态。
2.移动端应用:Vue有一套完整的移动端开发解决方案,可以用于开发iOS和Android应用。
Vue的轻量级和高性能使得它成为移动端开发的理想选择。
3.小型项目:对于小型项目而言,Vue的学习曲线相对较低,上手容易。
面向组件编程的实现及其应用随着软件开发的不断发展,我们不断地寻找更好的方法来提高软件开发效率和软件的质量。
面向组件编程就是一种非常好的方法来提高软件开发的效率和质量。
本文将介绍面向组件编程的实现及其应用。
一、面向组件编程的概念面向组件编程(Component-based Programming)是一种程序设计方法,该方法以组件为中心,通过组件的组合和复用来实现软件开发的目标。
组件是指一个可独立部署和替换的软件单元,拥有独立的接口和功能。
与面向对象编程不同,面向组件编程是基于组件的概念,而不是基于类和对象的概念。
在面向组件编程中,一个软件系统是由一些独立的组件组成的,每个组件都有自己的接口和功能,可以被其他组件调用和重复利用。
这样就能够提高软件的开发效率和质量,同时降低软件开发成本。
二、面向组件编程的实现1.组件的设计在面向组件编程中,组件的设计非常重要,它必须具备独立的接口和功能,同时还需要考虑到组件的可复用和可扩展性。
组件设计可以采用多种方式,包括面向对象、面向服务、面向流程等。
2.组件的实现组件的实现可以采用多种方式,常见的方式包括使用编程语言,如Java、C++等,以及使用组件框架,如Spring、.NET等。
组件的实现应该具备如下特点:(1)组件应该是可独立部署和替换的,这意味着组件应该可以在不同的环境中运行,并且可以随时被替换或升级。
(2)组件应该是可扩展的,这意味着组件应该可以根据需求进行功能扩展。
(3)组件应该是可复用的,这意味着组件应该可以被其他组件调用或者组合成更大的组件。
3.组件的测试组件的测试是面向组件编程中至关重要的一步,因为如果组件无法正常运行或者存在缺陷,那么整个软件系统也会受到影响。
组件的测试可以采用多种方式,包括单元测试、集成测试、系统测试等。
三、面向组件编程的应用面向组件编程可以应用于多个领域,下面将介绍几个典型的应用场景。
1.软件开发面向组件编程可以提高软件开发的效率和质量,降低软件开发成本,因此在软件开发领域得到了广泛的应用。
面向对象软件设计中的组件化开发技术研究第一章:前言随着软件系统日益复杂,传统的软件开发方式已经不能满足需求。
组件化开发技术作为一种新型的软件开发方式,正在为开发者带来更加高效的开发方式和更加灵活的设计架构。
在面向对象软件设计中,组件化开发技术的应用尤为重要。
本文就围绕组件化开发技术在面向对象软件设计中的应用进行探讨。
第二章:组件化开发技术概述组件化开发技术是一种面向组件化的软件开发方式,即把软件系统划分为多个互相独立的部分,每个部分都被看做是一个组件。
这些组件之间可以通过接口进行通讯,形成一个完整的软件系统。
组件化开发技术的主要目的是提高软件开发的效率和质量,降低维护成本和迁移成本。
通过组件化开发技术,开发人员可以更加关注系统的业务逻辑,而非底层技术实现。
第三章:面向对象软件设计中的组件化开发技术应用在面向对象软件设计中,组件化开发技术的应用非常重要。
由于面向对象编程的主要思想是将系统分解为多个对象,每个对象负责完成某一具体的功能。
因此,使用组件化开发技术能够更好地将面向对象编程思想落实到实际的开发工作中。
在组件化开发技术中,每个组件都应该有清晰的接口定义,以及明确的输入和输出。
这种设计方法可以使每个组件能够被重用并且更好地维护。
此外,在面向对象软件设计中,组件化开发技术可以更加方便地实现对象之间的通讯,提高面向对象软件设计的效率和灵活性。
第四章:组件化开发技术的优势组件化开发技术相比传统的软件开发方式具有如下优势:1. 高度模块化:组件化开发技术使得软件系统被划分为多个互相独立的部分,显著提高了软件系统的模块化程度,并且每个组件都可以独立地开发和维护。
2. 代码重用:组件化开发技术可以促进代码重用,降低了软件开发的成本和开发周期。
3. 容易维护:组件化开发技术中的每个组件都有明确的功能和接口定义,这样一来,组件之间的依赖关系非常清晰,从而降低了维护的复杂性和成本。
4. 提高软件质量:组件化开发技术可以提高软件的质量,因为每个组件都经过了充分的测试,并且在整个软件系统中良好地运作。
怎么理解组件化开发组件化没有官⽅严格的定义,以下是对⽹络中⼀些说法的整理1. 对组件的理解a) UI组件项⽬各个页⾯中,会产⽣很多重复的功能,⽐如弹出层提⽰框,像这种纯粹⾮业务的UI,便成了我们所谓的UI组件,最初的前端组件也就仅仅指的是UI组件。
b) 业务组件⽽由于移动端的兴起,前端页⾯的逻辑已经变得很重了,⼀个页⾯的代码超过5000⾏的场景渐渐增多,这个时候页⾯的维护便会很有问题,牵⼀发⽽动全⾝的事情会经常发⽣,为了解决这个问题,便出现了前端组件化,这个组件化就不是UI组件了,⽽是包含具体业务的业务组件。
c) 组件化思想--分⽽治之这种开发的思想其实也就是分⽽治之(最重要的架构思想),页⾯逻辑过于复杂,便将页⾯分为很多个业务组件模块分⽽治之,这样的话维护⼈员每次只需要改动对应的模块即可,以达到最⼤程度的降低开发难度与维护成本的效果,所以现在⽐较好的框架都会对组件化作⼀定程度的实现。
d) 数据组件⼀般是与展⽰相关,视觉变更与交互优化是⼀个产品最容易产⽣的迭代,所以多数组件相关的框架核⼼都是View层的实现,⽐如Vue与React的就认为⾃⼰仅仅是“View”,虽然展⽰与交互不断的在改变,但是底层展⽰的数据却不常变化,⽽View是表象,数据是根本,所以如何能更好的将数据展⽰到View也是各个组件需要考虑的,从⽽衍⽣出了单向数据绑定与双向数据绑定等概念,组件与组件之间的通信往往也是数据为桥梁。
e) 复杂业务是关键所以如果没有复杂的业务逻辑的话,根本不能体现出组件化编程解决的痛点2. 组件化定义作者:张⽴理我将“组件化”理解为以下⼏要素:a) 组件是对逻辑的封装,不限于图形元素。
即我们可以把if做成组件、把⼀个倒计时做成组件、把⼀段动画做成组件、把路由做成组件、把数据架构做成组件,⽽这些并不能称为控件b) 组件具备单个可移植性即“随加载随⽤”,不需要为其准备复杂的基础条件(如引⼊样式、引⼊框架等)。
Go语言中的模块化设计和组件化开发Go语言是一种开源的编程语言,近年来在软件开发领域取得了广泛的应用。
它以其简洁、高效和易于学习的特性而备受开发者的青睐。
其中,模块化设计和组件化开发是Go语言的两个重要特点,本文将围绕这两个主题展开讨论。
首先,模块化设计是指将一个系统划分成多个相互独立、可重用的模块,并通过明确定义的接口进行交互。
模块化设计有助于提高代码的可读性、可维护性和可测试性。
在Go语言中,使用包(package)作为模块的基本单位,一个包可以包含多个相关的Go源文件。
每个包都有一个唯一的名称,可以通过import语句引入到其他的包中使用。
通过包的导出功能,可以控制哪些函数、类型和变量可以在其他包中访问,从而提高了代码的封装性和安全性。
在Go语言中,模块之间的交互是通过接口(interface)进行的。
接口是一种抽象的数据类型,它定义了一组方法的集合,而不关心具体的实现。
通过接口,我们可以定义通用的函数签名,从而实现对不同模块的解耦。
这种解耦的特性使得我们可以只关注模块提供的功能,而不用关心其具体实现。
同时,Go语言还提供了空接口(interface{})的特性,使得我们可以在不确定类型的情况下,使用统一的接口进行操作。
这种灵活性为模块化设计提供了更多的可能性。
其次,组件化开发是指将模块进一步划分为更小的、独立的组件,每个组件都包含自己的数据和行为。
组件可以看作是模块的更细粒度的划分,它具有独立的生命周期和状态。
在Go语言中,我们可以通过结构体(struct)来定义组件。
结构体是一种自定义的数据类型,可以包含不同类型的字段,每个字段都可以被赋予不同的属性和行为。
通过结构体的组合和嵌入,可以实现组件之间的继承和复用。
同时,Go语言支持方法(method),可以为结构体定义特定的行为。
通过结构体和方法的组合,我们可以构建出高度可复用的组件。
在组件化开发中,模块之间的通信是通过消息传递的方式进行的。
1. 为什么要做组件化?无论前端也好,后端也好,都是整个软件体系的一部分。
软件产品也是产品,它的研发过程也必然是有其目的。
绝大多数软件产品是追逐利润的,在产品目标确定的情况下,成本有两个途径来优化:减少部署成本,提高开发效率。
减少部署成本的方面,业界研究得非常多,比如近几年很流行的“去IOE”,就是很典型的,从一些费用较高的高性能产品迁移到开源的易替换的产品集群,又比如使用Linux + Mono来部署.net应用,避开Windows Server的费用。
提高开发效率这方面,业界研究得更多,主要途径有两点:加快开发速度,减少变更代价。
怎样才能加快开发速度呢?如果我们的开发不是重新造轮子,而是每一次做新产品都可以利用已有的东西,那就会好很多。
怎样才能减少变更代价呢?如果我们能够理清模块之间的关系,合理分层,每次变更只需要修改其中某个部分,甚至不需要修改代码,仅仅是改变配置就可以,那就更好了。
我们先不看软件行业,来看一下制造行业,比如汽车制造业,他们是怎么造汽车的呢?造汽车之前,先设计,把整个汽车分解为不同部件,比如轮子,引擎,车门,座椅等等,分别生产,最后再组装,所以它的制造过程可以较快。
如果一辆汽车轮胎被扎破了,需要送去维修,维修的人也没有在每个地方都修一下,而是只把轮胎拆下来修修就好了,这个轮胎要是实在坏得厉害,就干脆换上个新的,整个过程不需要很多时间。
席德梅尔出过一款很不错的游戏,叫做《文明》(Civilization),在第三代里面,有一项科技研究成功之后,会让工人工作效率加倍,这项科技的名字就叫做:可替换部件(Replacement Parts)。
所以,软件行业也应当引入可替换的部件,一般称为组件。
2. 早期的前端怎么做组件化的?在服务端,我们有很多组件化的途径,像J2EE的Beans就是一种。
组件建造完成之后,需要引入一些机制来让它们可配置,比如说,工作流引擎,规则引擎,这些引擎用配置的方式组织最基础的组件,把它们串联为业务流程。
ios 组件化开发流程iOS组件化开发流程。
随着应用规模的不断扩大,iOS开发中组件化已经成为一种流行的开发模式。
组件化开发可以帮助开发团队更好地管理代码、提高代码的复用性和可维护性。
本文将介绍iOS组件化开发的流程,帮助开发者更好地理解和应用这种开发模式。
1. 定义组件边界。
在进行组件化开发之前,首先需要定义好组件的边界。
这包括确定每个组件的功能范围、接口和依赖关系。
通过明确定义组件的边界,可以避免组件之间的耦合过度,提高组件的独立性和可移植性。
2. 创建组件。
在定义好组件边界之后,可以开始创建组件。
每个组件应该是一个独立的模块,包含自己的业务逻辑、界面和数据处理。
在创建组件时,需要考虑组件之间的依赖关系,确保组件可以独立运行并且可以被其他组件引用。
3. 制定组件通信协议。
组件之间的通信是组件化开发中非常重要的一部分。
为了实现组件之间的解耦合,需要制定组件通信协议。
这包括定义接口、回调和事件通知等方式,确保组件之间可以进行有效的通信。
4. 集成组件。
在创建好各个组件之后,需要将它们集成到应用中。
这包括配置组件的依赖关系、引入组件的头文件和资源文件等。
通过集成组件,可以实现应用的模块化,提高代码的复用性和可维护性。
5. 测试和调试。
在集成组件之后,需要进行测试和调试。
这包括单元测试、集成测试和UI测试等。
通过测试和调试,可以确保各个组件的功能正常运行,并且可以及时发现和解决问题。
6. 组件化管理。
在应用开发过程中,组件化管理是非常重要的一部分。
这包括版本管理、依赖管理和发布管理等。
通过组件化管理,可以更好地管理和维护各个组件,确保应用的稳定性和可靠性。
总结。
iOS组件化开发是一种有效的开发模式,可以帮助开发团队更好地管理代码、提高代码的复用性和可维护性。
通过定义组件边界、创建组件、制定组件通信协议、集成组件、测试和调试以及组件化管理等流程,可以实现应用的模块化和组件化,提高开发效率和质量。
希望本文对iOS组件化开发有所帮助,欢迎大家分享和交流。
1. 为什么要做组件化?无论前端也好,后端也好,都是整个软件体系的一部分。
软件产品也是产品,它的研发过程也必然是有其目的。
绝大多数软件产品是追逐利润的,在产品目标确定的情况下,成本有两个途径来优化:减少部署成本,提高开发效率。
减少部署成本的方面,业界研究得非常多,比如近几年很流行的“去IOE”,就是很典型的,从一些费用较高的高性能产品迁移到开源的易替换的产品集群,又比如使用Linux + Mono来部署.net应用,避开Windows Server的费用。
提高开发效率这方面,业界研究得更多,主要途径有两点:加快开发速度,减少变更代价。
怎样才能加快开发速度呢?如果我们的开发不是重新造轮子,而是每一次做新产品都可以利用已有的东西,那就会好很多。
怎样才能减少变更代价呢?如果我们能够理清模块之间的关系,合理分层,每次变更只需要修改其中某个部分,甚至不需要修改代码,仅仅是改变配置就可以,那就更好了。
我们先不看软件行业,来看一下制造行业,比如汽车制造业,他们是怎么造汽车的呢?造汽车之前,先设计,把整个汽车分解为不同部件,比如轮子,引擎,车门,座椅等等,分别生产,最后再组装,所以它的制造过程可以较快。
如果一辆汽车轮胎被扎破了,需要送去维修,维修的人也没有在每个地方都修一下,而是只把轮胎拆下来修修就好了,这个轮胎要是实在坏得厉害,就干脆换上个新的,整个过程不需要很多时间。
席德梅尔出过一款很不错的游戏,叫做《文明》(Civilization),在第三代里面,有一项科技研究成功之后,会让工人工作效率加倍,这项科技的名字就叫做:可替换部件(Replacement Parts)。
所以,软件行业也应当引入可替换的部件,一般称为组件。
2. 早期的前端怎么做组件化的?在服务端,我们有很多组件化的途径,像J2EE的Beans就是一种。
组件建造完成之后,需要引入一些机制来让它们可配置,比如说,工作流引擎,规则引擎,这些引擎用配置的方式组织最基础的组件,把它们串联为业务流程。
不管使用什么技术、什么语言,服务端的组件化思路基本没有本质差别,大家是有共识的,具体会有服务、流程、规则、模型等几个层次。
早期展示层基本以静态为主,服务端把界面生成好,浏览器去拿来展示,所以这个时期,有代码控制的东西几乎全在服务端,有分层的,也有不分的。
如果做了分层,大致结构就是下图这样:图1 Web 1.0这个图里,JSP(或者其他什么P,为了举例方便,本文中相关的服务端技术都用Java系的来表示)响应浏览器端的请求,把HTML生成出来,跟相关的JavaScript和CSS一起拿出去展示。
注意这里的关键,浏览器端对界面的形态和相关业务逻辑基本都没有控制权,属于别人给什么就展示什么,想要什么要先提申请的尴尬局面。
这个时期的Web开发,前端的逻辑是基本可忽略的,所以前端组件化方式大同小异,无论是ASP还是JSP还是其他什么P,都可以自定义标签,把HTML代码和行间逻辑打包成一个标签,然后使用者直接放置在想要的地方,就可以了。
在这一时代,所谓的组件化,基本都是taglib这样的思路,把某一块界面包括它的业务逻辑一起打成一个端到端的组件,整个非常独立,直接一大块从界面到逻辑都有,而且逻辑基本上都是在服务端控制,大致结构如下图所示。
图2 Web 1.0组件化3. SPA时代,出现了新问题自从Web2.0逐渐流行,Web前端已经不再是纯展示了,它逐渐把以前在C/S里面做的一些东西做到B/S里面来,比如说Google和微软的在线Office,这种复杂度的Web应用如果还用传统那种方式做组件化,很显然是行不通的。
我们看看之前这种组件化的方式,本质是什么?是展现层跟业务逻辑层的隔离,后端在处理业务逻辑,前端纯展现。
如果现在还这么划分,就变成了前端有界面和逻辑,后端也有逻辑,这就比较乱了。
我们知道,纯逻辑的分层组件化还是比较容易的,任何逻辑如果跟展现混起来,就比较麻烦了,所以我们要把分层的点往前推,推到也能把单独的展现层剥离出来。
如下图所示,因为实际上HTML、CSS、JavaScript这些都逐渐静态化,所以不再需要把它们放在应用服务器上了,我们可以把它们放在专门的高性能静态服务器上,再进一步发展,就可以是CDN (Content Delivery Network,内容分发网络)。
前端跟后端的通信,基本都是通过AJAX来,也会有一些其他的比如WebSocket之类,总之尽量少刷新了。
图3 Web 2.0在这张图里面可以看到,真正的前端已经形成了,它跟应用服务器之间形成了天然的隔离,所以也能够很独立地进行一些发展演进。
现在很多Web程序在往SPA(单页面程序,Single Page Application)的方向发展,这类系统通常比较类似传统的C/S程序,交互过程比较复杂,因此它的开发过程也会遇到一些困难。
那为什么大家要做SPA呢?它有很多明显的好处,最核心的优势就是高效。
这个高效体现在两个方面:一是对于用户来说,这种方式做出来的东西体验较好,类似传统桌面程序,对于那些需要频繁操作的行业用户,有很大优势。
二是运行的效率较高,之前集成一些菜单功能,可能要用iframe的方式引入,但每个iframe要独立引入一些公共文件,服务器文件传输的压力较大,还要初始化自己的一套内存环境,比较浪费,互相之间也不太方便通信,一般要通过postMessage之类的方式去交互。
有了SPA之后,比如一块界面,就可以是一个HTML片段,用AJAX 去加载过来处理之后放到界面上。
如果有逻辑的JavaScript代码,也可以用require之类的异步加载机制去运行时加载,整体的思路是比较好的。
很多人说,就以这样的需求,用jQuery再加一个异步js加载框架,不是很足够了吗?这两个东西用得好的话,也是能够解决一些问题的,但它们处理的并不是最关键的事情。
在Web体系中,展现层是很天然的,因为就是HTML和CSS,如果只从文件隔离的角度,也可以做出一种划分的方式,逻辑放在单独的js文件里,html内部尽量不写js,这就是之前比较主流的前端代码划分方式。
刚才我们提到,SPA开发的过程中会遇到一些困难,这些困难是因为复杂度大为提升,导致了一些问题,有人把这些困难归结为纯界面的复杂度,比如说,控件更复杂了之类,没有这么简单。
问题在于什么呢?我打个比方:我们在电脑上开两个资源管理器窗口,浏览到同一个目录,在一个目录里把某个文件删了,你猜猜另外一个里面会不会刷新?毫无疑问,也会刷新,但是你看看你用的Web页面,如果把整个复杂系统整合成单页的,能保证对一个数据的更新就实时反馈到所有用它的地方吗?怎么做,是不是很头疼?代码组织的复杂度大为提高,所以需要做一些架构方面的提升。
4. 架构的变更提到架构,我们通常会往设计模式上想。
在著名的《设计模式》一书中,刚开始就讲了一种典型的处理客户端开发的场景,那就是MVC。
传统的MVC理念我们并不陌生,因为有Struts,所以在Web领域也有比较经典的MVC架构,这里面的V,就负责了整个前端的渲染,而且是服务端的渲染,也就是输出HTML。
如下图所示:图4 Struts MVC在SPA时代,这已经不合适了,所以浏览器端形成了自己的MVC 等层次,这里的V已经变成客户端渲染了,通常会使用一些客户端的HTML模版去实现,而模型和控制器,也相应地在浏览器端形成了。
图5 SPA我们有很多这个层面的框架,比如Backbone,Knockout,Avalon,Angular等,采用了不同的设计思想,有的是MVC,有的是MVP(Model-View-Presenter, 模型-视图-呈现),有的是MVVM(Model View ViewModel),各有其特点。
以Angular为例,它推荐使用双向绑定去实现视图和模型的关联,这么一来,如果不同视图绑定在同一模型上,就解决了刚才所说的问题。
而模型本身也通过某种机制,跟其他的逻辑模块进行协作。
这种方式就是依赖注入。
依赖注入的核心理念就是通过配置来实例化所依赖的组件。
使用这种模式来设计软件架构,会牺牲一些性能,在跟踪调试的便利性等方面也会有所损失,但换来的是无与伦比的松耦合和可替代性。
比如说,这些组件就可以单独测试,然后在用的时候随手引入,毫无压力。
对于从事某一领域的企业来说,光这一条就足以吸引他在上面大量投入,把所有不常变动领域模型的业务代码都用此类办法维护起来,这是一种财富。
5. MV*框架的基本原理如果我们来设计Angular这么一个前端框架,应当如何入手呢?很显然,逻辑的控制必须使用JavaScript,一个框架,最本质的事情在于它的逻辑处理方式。
我们的界面为什么可以多姿多彩?因为有HTML和CSS,注意到这两种东西都是配置式的写法,参照后端的依赖注入,如果把这两者视为跟Spring框架中一些XML等同的配置文件,思路就豁然开朗了。
与后端不同的是,充当前端逻辑工具的JavaScript不能做入口,必须挂在HTML里才能运行,所以出现了一个怪异的状况:逻辑要先挂在配置文件(HTML)上,先由另外的容器(浏览器或者Hybird的壳)把配置文件加载起来,然后才能从某个入口开始执行逻辑。
好消息是,过了这一步,逻辑层就开始大放异彩了。
从这个时候开始,框架就启动了,它要做哪些事情呢?•初始化自身(bootstrap)•异步加载可能尚未引入的JavaScript代码(require)•解析定义在HTML上的规则(template parser)•实例化模型(scope)•创建模型和DOM的关联关系(binding, injection)这些是主线流程,还有一些支线,比如:•解析url的search字符串,恢复状态(route)•加载HTML部件模板(template url)•部件模板和模型的关联(binding)6. 如何做组件化6.1. HTML的组件化SPA的一个典型特征就是部分加载,界面的部件化也是其中比较重要的一环。
界面片段在动态请求得到之后,借助模版引擎之类的技术,经过某种转换,放置到主界面相应的地方。
所以,从这个角度来看,HTML的组件化非常容易理解,那就是界面的片段化和模板化。
6.2. JavaScript的组件化JavaScript这个部分有好几个发展阶段。
•早期的共享文件,把公共功能的代码提出出来,多个页面共用•动态引用,消灭全局变量•在某些框架上进一步划分,比如Angular里面又分为provider,service,factory,controllerJavaScript组件化的目标是什么呢,是清晰的职责,松耦合,便于单元测试和重复利用。
这里的松耦合不仅体现在js代码之间,也体现在js跟DOM之间的关系,所以像Angular这样的框架会有directive的概念,把DOM操作限制到这类代码中,其他任何js代码不操作DOM。