2022年组件化编程知识 .pdf





《2022年组件化编程知识 .pdf》由会员分享,可在线阅读,更多相关《2022年组件化编程知识 .pdf(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1.为什么要做组件化?无论前端也好,后端也好,都是整个软件体系的一部分。软件产品也是产品,它的研发过程也必然是有其目的。绝大多数软件产品是追逐利润的,在产品目标确定的情况下,成本有两个途径来优化:减少部署成本,提高开发效率。减少部署成本的方面,业界研究得非常多,比如近几年很流行的“去IOE”,就是很典型的,从一些费用较高的高性能产品迁移到开源的易替换的产品集群,又比如使用Linux+Mono来部署.net 应用,避开Windows Server 的费用。提高开发效率这方面,业界研究得更多,主要途径有两点:加快开发速度,减少变更代价。怎样才能加快开发速度呢?如果我们的开发不是重新造轮子,而是每一
2、次做新产品都可以利用已有的东西,那就会好很多。怎样才能减少变更代价呢?如果我们能够理清模块之间的关系,合理分层,每次变更只需要修改其中某个部分,甚至不需要修改代码,仅仅是改变配置就可以,那就更好了。我们先不看软件行业,来看一下制造行业,比如汽车制造业,他们是怎么造汽车的呢?造汽车之前,先设计,把整个汽车分解为不同部件,比如轮子,引擎,车门,座椅等等,分别生产,最后再组装,所以它的制造过程可以较快。如果一辆汽车轮胎被扎破了,需要送去维修,维修的人也没有在每个地方都修一下,而名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 30 页 -是只把轮胎拆下来修修就好了,这个轮胎要是实在坏得厉
3、害,就干脆换上个新的,整个过程不需要很多时间。席德梅尔出过一款很不错的游戏,叫做文明(Civilization),在第三代里面,有一项科技研究成功之后,会让工人工作效率加倍,这项科技的名字就叫做:可替换部件(Replacement Parts)。所以,软件行业也应当引入可替换的部件,一般称为组件。2.早期的前端怎么做组件化的?在服务端,我们有很多组件化的途径,像 J2EE的 Beans 就是一种。组件建造完成之后,需要引入一些机制来让它们可配置,比如说,工作流引擎,规则引擎,这些引擎用配置的方式组织最基础的组件,把它们串联为业务流程。不管使用什么技术、什么语言,服务端的组件化思路基本没有本质差
4、别,大家是有共识的,具体会有服务、流程、规则、模型等几个层次。早期展示层基本以静态为主,服务端把界面生成好,浏览器去拿来展示,所以这个时期,有代码控制的东西几乎全在服务端,有分层的,也有不分的。如果做了分层,大致结构就是下图这样:名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 30 页 -图 1 Web 1.0 这个图里,JSP(或者其他什么P,为了举例方便,本文中相关的服务端技术都用Java 系的来表示)响应浏览器端的请求,把HTML 生成出来,跟相关的 JavaScript 和 CSS一起拿出去展示。注意这里的关键,浏览器端对界面的形态和相关业务逻辑基本都没有控制权,属于别人
5、给什么就展示什么,想要什么要先提申请的尴尬局面。这个时期的 Web 开发,前端的逻辑是基本可忽略的,所以前端组件化方式大同小异,无论是ASP还是 JSP还是其他什么 P,都可以自定义标签,把 HTML 代码和行间逻辑打包成一个标签,然后使用者直接放置在想要的地方,就可以了。名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 30 页 -在这一时代,所谓的组件化,基本都是taglib这样的思路,把某一块界面包括它的业务逻辑一起打成一个端到端的组件,整个非常独立,直接一大块从界面到逻辑都有,而且逻辑基本上都是在服务端控制,大致结构如下图所示。图 2 Web 1.0 组件化3.SPA 时代
6、,出现了新问题自从 Web2.0 逐渐流行,Web 前端已经不再是纯展示了,它逐渐把以前在 C/S 里面做的一些东西做到B/S 里面来,比如说Google 和微软名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 30 页 -的在线 Office,这种复杂度的Web 应用如果还用传统那种方式做组件化,很显然是行不通的。我们看看之前这种组件化的方式,本质是什么?是展现层跟业务逻辑层的隔离,后端在处理业务逻辑,前端纯展现。如果现在还这么划分,就变成了前端有界面和逻辑,后端也有逻辑,这就比较乱了。我们知道,纯逻辑的分层组件化还是比较容易的,任何逻辑如果跟展现混起来,就比较麻烦了,所以我们要
7、把分层的点往前推,推到也能把单独的展现层剥离出来。如下图所示,因为实际上HTML、CSS、JavaScript这些都逐渐静态化,所以不再需要把它们放在应用服务器上了,我们可以把它们放在专门的高性能静态服务器上,再进一步发展,就可以是CDN(Content Delivery Network,内容分发网络)。前端跟后端的通信,基本都是通过 AJAX来,也会有一些其他的比如WebSocket 之类,总之尽量少刷新了。名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 30 页 -图 3 Web 2.0 在这张图里面可以看到,真正的前端已经形成了,它跟应用服务器之间形成了天然的隔离,所以也能
8、够很独立地进行一些发展演进。现在很多 Web 程序在往 SPA(单页面程序,Single Page Application)的方向发展,这类系统通常比较类似传统的C/S 程序,交互过程比较复杂,因此它的开发过程也会遇到一些困难。那为什么大家要做SPA呢?它有很多明显的好处,最核心的优势就是高效。这个高效体现在两个方面:一是对于用户来说,这种方式做出来的东西体验较好,类似传统桌面程序,对于那些需要频繁操作的行业用户,有很大优势。二是运行的效率较高,之前集成一些菜单功能,可能要用 iframe 的方式引入,但每个iframe 要独立引入一些公共文件,名师资料总结-精品资料欢迎下载-名师精心整理-第
9、 6 页,共 30 页 -服务器文件传输的压力较大,还要初始化自己的一套内存环境,比较浪费,互相之间也不太方便通信,一般要通过 postMessage 之类的方式去交互。有了 SPA之后,比如一块界面,就可以是一个 HTML 片段,用 AJAX去加载过来处理之后放到界面上。如果有逻辑的JavaScript 代码,也可以用 require 之类的异步加载机制去运行时加载,整体的思路是比较好的。很多人说,就以这样的需求,用 jQuery 再加一个异步 js 加载框架,不是很足够了吗?这两个东西用得好的话,也是能够解决一些问题的,但它们处理的并不是最关键的事情。在Web 体系中,展现层是很天然的,因
10、为就是 HTML 和 CSS,如果只从文件隔离的角度,也可以做出一种划分的方式,逻辑放在单独的js 文件里,html 内部尽量不写 js,这就是之前比较主流的前端代码划分方式。刚才我们提到,SPA开发的过程中会遇到一些困难,这些困难是因为复杂度大为提升,导致了一些问题,有人把这些困难归结为纯界面的复杂度,比如说,控件更复杂了之类,没有这么简单。问题在于什么呢?我打个比方:我们在电脑上开两个资源管理器窗口,浏览到同一个目录,在一个目录里把某个文件删了,你猜猜另外一个里面会不会刷新?毫无疑问,也会刷新,但是你看看你用的Web 页面,如果把整个复杂系统整合成单页的,能保证对一个数据的更新就实时反馈到
11、所有用名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 30 页 -它的地方吗?怎么做,是不是很头疼?代码组织的复杂度大为提高,所以需要做一些架构方面的提升。4.架构的变更提到架构,我们通常会往设计模式上想。在著名的设计模式一书中,刚开始就讲了一种典型的处理客户端开发的场景,那就是MVC。传统的 MVC理念我们并不陌生,因为有Struts,所以在 Web 领域也有比较经典的MVC架构,这里面的V,就负责了整个前端的渲染,而且是服务端的渲染,也就是输出HTML。如下图所示:名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 30 页 -图 4 Struts MVC 在 SP
12、A时代,这已经不合适了,所以浏览器端形成了自己的MVC等层次,这里的V 已经变成客户端渲染了,通常会使用一些客户端的HTML 模版去实现,而模型和控制器,也相应地在浏览器端形成了。图 5 SPA 我们有很多这个层面的框架,比如Backbone,Knockout,Avalon,Angular 等,采用了不同的设计思想,有的是MVC,有的是MVP(Model-View-Presenter,模型-视图-呈现),有的是 MVVM(Model View ViewModel),各有其特点。名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 30 页 -以 Angular 为例,它推荐使用双向绑定
13、去实现视图和模型的关联,这么一来,如果不同视图绑定在同一模型上,就解决了刚才所说的问题。而模型本身也通过某种机制,跟其他的逻辑模块进行协作。这种方式就是依赖注入。依赖注入的核心理念就是通过配置来实例化所依赖的组件。使用这种模式来设计软件架构,会牺牲一些性能,在跟踪调试的便利性等方面也会有所损失,但换来的是无与伦比的松耦合和可替代性。比如说,这些组件就可以单独测试,然后在用的时候随手引入,毫无压力。对于从事某一领域的企业来说,光这一条就足以吸引他在上面大量投入,把所有不常变动领域模型的业务代码都用此类办法维护起来,这是一种财富。5.MV*框架的基本原理如果我们来设计Angular 这么一个前端框
14、架,应当如何入手呢?很显然,逻辑的控制必须使用JavaScript,一个框架,最本质的事情在于它的逻辑处理方式。名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 30 页 -我们的界面为什么可以多姿多彩?因为有HTML 和 CSS,注意到这两种东西都是配置式的写法,参照后端的依赖注入,如果把这两者视为跟Spring 框架中一些 XML 等同的配置文件,思路就豁然开朗了。与后端不同的是,充当前端逻辑工具的JavaScript 不能做入口,必须挂在 HTML 里才能运行,所以出现了一个怪异的状况:逻辑要先挂在配置文件(HTML)上,先由另外的容器(浏览器或者Hybird的壳)把配置文
15、件加载起来,然后才能从某个入口开始执行逻辑。好消息是,过了这一步,逻辑层就开始大放异彩了。从这个时候开始,框架就启动了,它要做哪些事情呢?初始化自身(bootstrap)异步加载可能尚未引入的JavaScript 代码(require)解析定义在 HTML 上的规则(template parser)实例化模型(scope)创建模型和 DOM 的关联关系(binding,injection)这些是主线流程,还有一些支线,比如:解析 url 的 search 字符串,恢复状态(route)加载 HTML 部件模板(template url)部件模板和模型的关联(binding)名师资料总结-精品资
16、料欢迎下载-名师精心整理-第 11 页,共 30 页 -6.如何做组件化6.1.HTML的组件化SPA的一个典型特征就是部分加载,界面的部件化也是其中比较重要的一环。界面片段在动态请求得到之后,借助模版引擎之类的技术,经过某种转换,放置到主界面相应的地方。所以,从这个角度来看,HTML 的组件化非常容易理解,那就是界面的片段化和模板化。6.2.JavaScript的组件化JavaScript 这个部分有好几个发展阶段。早期的共享文件,把公共功能的代码提出出来,多个页面共用动态引用,消灭全局变量在某些框架上进一步划分,比如 Angular里面又分为 provider,service,factor
17、y,controllerJavaScript组件化的目标是什么呢,是清晰的职责,松耦合,便于单元测试和重复利用。这里的松耦合不仅体现在js 代码之间,也体现在 js 跟 DOM 之间的关系,所以像Angular 这样的框架会有directive 的概念,把 DOM 操作限制到这类代码中,其他任何js 代码不操作 DOM。名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 30 页 -图 6 SPA 组件化如上图所示,总的原则是先分层次,层内再作切分。这么做的话,不再存在之前那种端到端组件了,使用起来没有原先那么方便,但在另外很多方面比较好。6.3.CSS 的组件化这方面,业界也有很
18、多探索,比如LESS,SASS,Stylus等。为什么 CSS也要做组件化呢?传统的CSS是一种扁平的文本结构,变更成本较高,比如说想要把结构从松散改紧凑,需要改动很多。如果把实际使用的 CSS只当作输出结果,而另外有一种适合变更的方式当作中间过程,这就好多了。比如说,我们把一些东西定义成变量,每个细节元名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 30 页 -素使用这些变量,当需要整体变更的时候,只需修改这些变量然后重新生成一下就可以了。以上,我们讨论了大致的Web 前端开发的组件化思路,后续将阐述组件化之后的协作过程和管控机制。管控平台在上一篇中我们提到了组件化的大致思路
19、,这一篇主要讲述在这么做之后,我们需要哪些外围手段去管控整个开发过程。从各种角度看,面对较大规模前端开发团队,都有必要建立这么一个开发阶段的协作平台。在这个平台上,我们要做哪些事情呢?1.HTML片段我们为什么要管理HTML 片段?因为有界面要用它们,当这些片段多了之后,需要有个地方来管理起来,可以检索、预览它们,还能看到大致描述。名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 30 页 -这应该是整个环节中一个相对很简单的东西,照理说,有目录结构,然后剩下的就是单个的HTML 片段文件了,这就可以解决存储和检索的问题了,但我们还要考虑更多。已有的 HTML 片段,如何被使用呢
20、?这肯定是一种类似include 的方式,通过某种特殊标签(不管是前端还是后端的方式)把这些片段引用进来,这时候就有了第一个问题:假设有界面 A 和界面 B同时引用了片段C,在某个开发人员修改片段 C内容的时候,他如何得知将会影响到界面A 和 B 呢?一个比较勉强的方式是全项目查找,但这在很多情况下是不够的。如果我们的 HTML 片段是作为独立的公共库存在的,它已经不能通过项目内查找去解决这一问题了,因为不管A 还是 B,只要他不处于片段 C的项目空间,就无从追寻。这时候很多人会问两个问题:1.跨项目的界面片段重用,意义在哪里?2.如果我们的产品是针对一个小领域,它的复杂度根本不需要划分多个项
21、目部分来协作完成。设想场景是面对很大的行业,各项目都是子产品,将来可能是其中若干个联合部署,这时候,保持其名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 30 页 -中的一致性是非常重要的。比如我们有个基本配置界面,在多个子产品中都要用,如果各自开发一个,其操作风格很可能就是不一致的,给人的印象就是不专业。所以会需要把常见的界面片段都归集起来,供业务方挑选使用。3.4.修改 C,只提供说明,但是不通知A和 B,不实时更新他们的版本,然后自行决定怎样升级,如何?5.这会有一个问题,每次有小功能升级的时候,代码是最容易同步合并的,所以才会有“持续集成”这个概念,如果是一直伴随升级,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年组件化编程知识 2022 组件 编程 知识

限制150内