微前端设计方案(前端微应用化)
微前端设计方案(前端微应用化)
2024-11-22 03:04:59  作者:握在手心里  网址:https://m.xinb2b.cn/know/giy492334.html

【架构拾集】,是我用来记录项目实施过程中的优秀架构集。

微应用化即在开发和运行时,应用都是以单一、微小应用的形式存在。

微应用化与微前端架构相当的类似,它们在开发时都是独立应用,在构建时又可以按照需求单独加载。如果以微前端的单独开发、单独部署、运行时聚合的基本思想来看,微应用化就是微前端的一种实践。只是使用微应用化意味着:我们只能使用唯一的一种前端框架。如果从框架不限的角度来定义,怕是离微前端有些远,不过大团队怕是不会想同时支持多个前端框架。

适用场景

为了方便后期我的查阅,我还是简单地写个相应架构的电梯演进。

关键因素描述对于想拆解单体前端应用的团队我们的架构微应用化是一个类微前端架构它可以在开发环境将应用拆分成一个个的模块化应用,在构建时以单体的形式构建但他不同于微前端架构它的优势是实施成本低、技术难度小、维护成本低

技术远景

微服务化,即每个前端应用一个独立的服务化前端应用,并配套一套统一的应用管理和启动机制,诸如微前端框架 Single-SPA 或者 mooa 。

微件化,即通过对构建系统的 hack,使不同的前端应用可以使用同一套依赖。它在应用微服务化的基本上,改进了重复加载依赖文件的问题。

架构设计方案

在刚结束的项目里,我们采用了这种架构方式来构建应用,我们将其称之为微应用。原因主要有两个,一个是每个应用都是以功能模块划分的,一个则是应用最后仍然是以单体应用的形式存在的。我们的方式就是在开发环境将单体应用拆分成一个个的模块应用,而在构建时是以单体应用的形式构建,而在运行时是以应用模块的形式存在。

开发时构建时运行时应用形式微小应用单体微小模块

值得注意的是,我们能成功实施微应用化的一个关键因素是,前端框架本身是能支持功能模块的 Lazyload。不过,事实上支持 Lazyload 的另外一个关键因素是:webpack 对于 chunk 的使用。

由于我懒,所以我直接从 GitHub 上扒一个 Lazyload Demo 来作为示例。如下是一个 Lazyload 的路由示例:

export const ROUTES: Routes = [ { path: '', pathMatch: 'full', redirectTo: 'dashboard' }, { path: 'dashboard', loadChildren: '../dashboard/dashboard.module#DashboardModule' }, { path: 'settings', loadChildren: '../settings/settings.module#SettingsModule' }, { path: 'reports', loadChildren: '../reports/reports.module#ReportsModule' }];

其对应的目标结构如下所示:

├── app│ ├── app.component.ts│ └── app.module.ts├── dashboard│ ├── dashboard.component.ts│ └── dashboard.module.ts├── main.ts├── reports│ ├── reports.component.ts│ └── reports.module.ts└── settings ├── settings.component.ts └── settings.module.ts

上面的代码对应着对应的 module。只需要在使用的时候,Angular 构建的时候会将 module 独立构建成 *.chunk.js。假设现在我们有 dashboard、settings、reports 三个应用,那么现在的工程里的三个应用都是以空白 module 形式而存在的。它可以在其它 module 还未开发的时候,不影响系统的构建。那么再加上主的功能,一共会有四个代码仓库:

主代码库。只包含一个空白的框架式代码,它是一个单独的应用可以独立构建,构建完是带 Lazyload 的工程。dashboard、settings、reports 三个应用。它们都是各自独立的应用,在构建时复制对应模块的代码到主工程。

当系统开始构建时,我们会从独立的 dashboard 应用中拷贝相应的 module 代码及依赖,拷贝到上述的这个工程里,然后替换。而这个 dashboard 应用内,自己又是一个完整的 Angular 应用,它可以独立地开发运行。

持续集成设计

系统的持续集成的触发机制可以由这几部分集成:

功能模块(features module) 代码更新,会触发对应的模块的持续构建主的应用代码更新,会触发整个系统的持续构建功能模块持续集成成功,触发整个系统的持续构建

如上一节中架构设计方案所述,主应用构建的工程中,我只需要复制对应的代码即可。

测试策略

考虑到微前端架构在实施上的一些特殊性,我们有必要在传统的测试金字塔的基础上添加一些额外的测试:

依赖一致检测测试功能模块生成测试

依赖一致性测试

由于不同的功能模块,需要保持一致的依赖版本。因此有必要对依赖版本进行测试、对比,以避免在线上依赖并不一致的时候,出现一些意料之外的 Bug。

对于前端项目来说,这个依赖管理配置文件就是 package.json 。我们只需要从不同的项目中,读取这个文件,然后对比其中的版本即可。使得每个工程的依赖可以尽可能地保持一致。

功能模块生成测试

由于项目加载模块的方式,是通过前端框架自带的的 Lazyload 功能来实现的。理论上,我们就不需要测试 lazyload 的功能是否正确。如果需要的话,我们只需要以下三部分其中的一个

测试复制的模块能复制到对应的目录上测试生成的模块代码大小是否正常E2E 测试

要对模块是否能正确复制进行测试,最简单的方式是编写脚本,在持续集成的过程中运行测试脚本,如果没有检测到则 exit(-1),持续集成构建失败。

测试模块代码大小是否合理的原因在于,我们可能没有正确的在对应的目测替换功能模块。如下是一个生成的 Lazyload 模块示例,正常情况下每个 chunk.js 文件应该是要大于空白的模块的大小:

Date: 2018-08-05T06:31:39.188ZHash: c1e57b16329e1ec9bb5eTime: 44397mschunk {0} 0.bb599f286b4bd7a5671c.chunk.js (common) 22.7 kB [rendered]chunk {1} 1.0124f60f4b26e51b6eac.chunk.js () 22.9 kB [rendered]chunk {2} 2.563bd899f2d57f903f05.chunk.js () 22.7kB [rendered]chunk {3} main.b812524b18403b7b0cc4.bundle.js (main) 1.54 MB [initial] [rendered]chunk {4} polyfills.3b18b0b8f25d1038155d.bundle.js (polyfills) 87 kB [initial] [rendered]chunk {5} styles.425af9d9b93b3ae95ff2.bundle.css (styles) 22 kB [initial] [rendered]chunk {6} inline.a41bfd7c50df83afde20.bundle.js (inline) 2.54 kB [entry] [rendered]

但是上述这部分的测试,其依赖于在构建的时候测试日志。同样的需要在持续集成中编写脚本,并 exit(-1)。

使用 E2E 测试对于微前端或者微服务化架构来说,是一种特别有效的方式。唯一的问题可能是,它运行起来比较慢。

结论

微应用化,又可以称之为组合式集成,即通过软件工程的方式,在开发环境对单体应用进行拆分,在构建环境将应用组合在一起构建成一个应用。


  • 野人来了怎么做出来的(关于野人来了)
  • 2024-11-22关于野人来了一提到“野人来了”模式,大家估计都很熟悉吧,大家可以化身反派“野人”来感染人类,不过一些地图中变成的却不是“野人”,你知道为什么吗?怎么弄出“野人”玩法呢?1.创建一张玩法地图(具体设置按个人爱好);。
  • 人间世律师扮演者
  • 2024-11-22人间世律师扮演者扮演者是肖越,属生肖兔,属兔女天生俊俏美丽,娴静温柔,有着一颗纯洁的心在工作上总是认真细致,高度负责,加上有帮夫运,她不但自己非常能干,丈夫的事业上出现了一些问题,她也能够帮助对方排忧解难如果属兔女愿。
  • 梯度是什么意思(梯度的意思)
  • 2024-11-22梯度的意思梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)设体系中某处的物理参数(如温度、速度、浓度。
  • 8.12中元将至日子再忙(8.12中元将至日子再忙)
  • 2024-11-228.12中元将至日子再忙8.12中元将至,日子过得再忙,老传统不能忘,牢记“吃四宝”,平安顺遂今年的8月12日是我国的传统节日,中元节民间又称其为七月半、祭祖节,也是佛教中的盂兰盆节;七月半在立秋之后,是百姓在初秋庆祝作物丰。
  • cgtn是什么台(大家可以了解一下)
  • 2024-11-22大家可以了解一下中国国际电视台(英文简称CGTN,中文别称中国环球电视网)是中国中央电视台下属的新国际传播机构,成立于2016年12月31日该机构包括6个电视频道、3个海外分台、1个视频通讯社和新媒体集群,以丰富的内。
  • 番茄小说网审核不过的问题(番茄小说网新人能来吗)
  • 2024-11-22番茄小说网新人能来吗自去年四月入注番茄网后,我一共写了4本书一本马马虎虎,一本混个稀饭吃,一本扑待鼻青脸肿,现在是第四本今天更新后4.5万字,日收两块钱我是写文10年的老作者,说这么多是为了说明:网站没有什么新作者老作者。
  • 天寒白屋贫的上一句是什么(天寒白屋贫原文和译文是什么)
  • 2024-11-22天寒白屋贫原文和译文是什么天寒白屋贫的上一句:日暮苍山远出自唐代诗人刘长卿的《逢雪宿芙蓉山主人》《逢雪宿芙蓉山主人》日暮苍山远,天寒白屋贫柴门闻犬吠,风雪夜归人译文暮色降临山色苍茫愈觉路途远,天寒冷茅草屋显得更贫困柴门外忽传来。
  • 曾志伟最爱的女人现状(前妻力挺曾志伟)
  • 2024-11-22前妻力挺曾志伟艺人宝妈和安妮一同披上婚纱出席喜饼店活动,相隔45年再次披上婚纱,谈到前夫曾志伟被爆对蓝洁瑛性侵,宝妈首度打破沉默,表示已认识对方48年,「太懂这个人了,绝对不是这样的人」,更指曾志伟异性缘比刘德华、。
  • 爱上特种兵的夏初和梁木泽:因爱而改变习惯
  • 2024-11-22爱上特种兵的夏初和梁木泽:因爱而改变习惯文/薇芥子关注薇芥子,俗世红尘中,与你共同品味情感故事《爱上特种兵》原著小说是折纸蚂蚁的《军装下的绕指柔》,讲述的是特种兵雷霆小队队长梁牧泽(黄景瑜饰演)与解放军医院的住院医夏初(李沁饰演)之间的爱情。
  • 治疗糖尿病的三大基本疗法(把这5个建议记好)
  • 2024-11-22把这5个建议记好糖尿病是一种由于胰岛素分泌不足或是胰岛素抵抗,出现的体内血糖升高,出现尿中带糖的疾病糖尿病患者临床多表现为多尿、多饮、多食和体重下降如若糖尿病人日常不注重管控血糖,还会引起一系列糖尿病并发症,如糖尿病。
  • 小舞突然复活到唐三的怀里(求婚名场面到来)
  • 2024-11-22求婚名场面到来哈喽,大家好,我是木子时隔一周,《斗罗大陆》动漫第213集预告视频也已经更新了从预告视频来看唐三已经成功吸收了大明(天青牛蟒)二明(泰坦巨猿)的魂环魂骨,星斗大森林的事情也就此告一段落,接下来就该轮到。
  • 佟大为演绎真心英雄(佟大为演绎男版)
  • 2024-11-22佟大为演绎男版由佟大为、于明加、于小伟、周晓欧、丁嘉丽等主演的现代家庭剧《门第》,今晚20:20即将登陆辽宁卫视该剧讲述佟大为、于明加两个门第差异极大的年轻人,一段错综复杂的婚姻生活谈门第:生活需要自嘲精神在《门第。