首页 > 其他分享 >模块化、组件化和插件化的区别

模块化、组件化和插件化的区别

时间:2023-08-25 15:05:30浏览次数:122  
标签:插件 模块化 Module common 模块 组件

单工程模式

移动开发诞生,我们开发移动项目,我相信大多用的是单工程单任务的开发模式,二话不说,直接就开始写起,是不是这样呢? new Project -> 分包 -> 写起。我相信都经历过,也写的比较爽,为什么呢? 这种模式不涉及乱七八糟的处理方式, 上手快,开发快,足够敏捷。那么原因是什么呢?Mobile Project 刚起步,项目都偏小,一些附加业务还没绑到App上。

模块化

Android Studio出来了,多出来了一个新的概念, Project, Module… 模块;当时以包的形式分离的公共包common,现在成了AS中的Module。大家都知道,Module包含两种格式: application, library。也就是说,一个Module就是一个小的项目,也是AS概念中的模块。因此我们开始设计common模块, common_business模块,甚至db模块。模块的好处是什么? 相比于包来讲,模块更灵活,耦合更低,随意插拔,想引入哪个就引入哪个。根据不同的关注点,将一个项目的可以共享的部分抽取出来,形成独立的Module,就是模块化。模块化不只包含公共部分,当然也可以是业务模块。

组件化

平时看看论坛,好多人都在问: 模块化和组件化有什么区别? 到底有什么区别呢,其实很小;但并不是完全相同的概念。 通过以上模块化的概念讲述,应该对模块化有了一个了解,那么区别是什么呢?

组件化是建立在模块化思想上的一次演进,一个变种。组件化本来就是模块化的概念。但是组件化的核心是 什么? 是模块角色的可转换性。是的,就是可转换性。

组件化的核心是角色的转换。 在打包时, 是library; 在调试时, 是application。

怎么理解组件化的概念 ?

Module的模式分两种, application和library。 library就是引用库,如你抽取的common。 application就是一个apk, 是一个完整的项目。

在调试时,我只关心我负责的模块,我希望我的模块是一个单独的app,因为这样更小,业务更专一,相对来讲修改与调试就会越省时省心,编译就会越快。试想当你需要改一段代码,既要关注自己的,也要关注别人的,是一种什么体验 ? 或者, 编译一个项目10M的代码和一个工程全部1G的代码,哪个比较舒服一些?

插件化

又有人问了: 插件化和组件化又有什么区别呢?插件化严格意义来讲,其实也算是模块化的观念。将一个完整的工程,按业务划分为不同的插件,都是分治法的一种体现。化整为零,相互配合。,越小的模块越容易维护。 插件化按理也算是模块化的一种体现,和组件化就不一个概念了。那么,到底有什么区别呢?

组件化的单位是组件(module)。 插件化的单位是apk(一个完整的应用)。 组件化实现的是解耦与加快编译, 隔离不需要关注的部分。 插件化实现的也是解耦与加快编译,同时实现热插拔也就是热更新。 组件化的灵活性在于按加载时机切换,分离出独立的业务组件,比如微信的朋友圈 插件化的灵活性在于是加载apk, 完全可以动态下载,动态更新,比组件化更灵活。 组件化能做的只是, 朋友圈已经有了,我想单独调试,维护,和别人不耦合。但是和整个项目还是有关联的。 插件化可以说朋友圈就是一个app, 我需要整合了,把它整合进微信这个大的app里面 其实从框架名称就可以看出: 组 和 插。 组本来就是一个系统,你把微信分为朋友圈,聊天, 通讯录按意义上划为独立模块,但并不是真正意义上的独立模块。 插本来就是不同的apk, 你把微信的朋友圈,聊天,通讯录单独做一个完全独立的app, 需要微信的时候插在一起,就是一个大型的app了。 插件化的加载是动态的,这点很重要,也是灵活的根源。

以上是对三个思想的解析,相信应该能明白不同的概念的具体意义和区别在哪了。在《关于移动架构的思考与总结》中我指出,所谓架构,无非两个方面: 分层和通信方式。 其实广义的架构也可以说是这两个方面:子模块(子系统)划分和通信。

子模块划分

除了大家公认的common部分, 业务模块的划分尤为重要,相比于狭义上的架构,广义上的子系统的划分的关注点,很考验技术经验以及对业务的理解。

通信方式

模块化的通信方式,无非是相互引入;我抽取了common, 其他模块使用自然要引入这个module 组件化的通信方式,按理说可以划分为多种,主流的是隐式和路由。隐式的存在使解耦与灵活大大降低,因此路由是主流 插件化的通信方式,不同插件本身就是不同的进程了。因此通信方式偏向于Binder机制类似的进程间通信

标签:插件,模块化,Module,common,模块,组件
From: https://blog.51cto.com/u_16233752/7230969

相关文章

  • 海康大华宇视等网络摄像机RTSP流采用websecket和H5进行RTSP网页无插件直播点播
    一.背景分析随着移动互联网时代的到来,安防监控领域为了适应互联网的发展要求,首先由国内安防监控龙头企业(海康、大华、宇视)带头先后开发了萤石云、乐橙云等互联网视频云服务,为广大个人或者企业监控用户提供的优质的视频互联网监控服务;而事实上,不管是海康大华等老牌监控厂商、还是新......
  • springboot结合baomidou dynamic-datasource组件实现多数据源
    当系统数据量过大,系统性能问题逐渐浮出水面。使用主从模式,不失是一个较好的选择。即业务在主库执行,不影响业务的查询考虑走从库。这时,程序需要动态多数据源配置。......
  • Windows PC、 Linux、 Android、 iOS多平台支持H5无插件播放RTSP摄像机解决方案
    需求分析视频流媒体监控行业已经进入互联网时代,浏览器承载了绝大多数的互联网访问流量,目前在网页上播RTSP流的普遍做法是将RTSP转成互联网直播协议RTMP或者HLS;而RTMP协议播放需要Flash插件,且其衍生的FLV或者HLS协议延迟很大(2s以上),根本达不到视频流媒体传输低延迟的要求。早年风靡......
  • Vue3内置组件suspense用法
    1、作用在使用异步组件时,由于需要等待组件加载完成后才能显示,因此可能会出现页面空白或显示错误信息的情况。而Suspense组件的作用就是在异步组件加载完成前显示一个占位符,提高用户体验。2、用法首先子组件AsyncShow:使用了promise包裹代码<template><div><h1>{{re......
  • 14.4K Star,一款外观漂亮、运行快速、动画细腻的开源免费UI组件库
    之前给大家推荐了很多后台模版,有读者希望推荐一些跟通用的好看组件,毕竟出了后台还有很多其他场景嘛。所以,今天继续给大家推荐一个广受好评的UI组件库:NextUI主要特性NextUI的主要目标是简化开发流程,为增强的用户体验提供美观且适应性强的系统设计。它有以下几点核心特性:可个......
  • VS插件DevExpress CodeRush v23.1 - 支持Visual Studio ARM
    DevExpress CodeRush是一个强大的VisualStudio.NET插件,它利用整合技术,通过促进开发者和团队效率来提升开发者体验。CodeRush能帮助你以极高的效率创建和维护源代码。Consume-first申明,强大的模板,智能的选择工具,智能代码分析和创新的导航以及一个无与伦比的重构集,在它们的帮助......
  • 【Angular】如何将自定义组件绑定为FormControl?
    参考资料:简单Demo:AngularFormcontrolenameCustomComponent关键实现说明:ControlValueAccessor:CustomFormComponentsinAngularAngular自定义表单控件(中文)关于muti:true的说明......
  • discuz3.4,关于安装dev8133插件(购买帖子内容),在论坛对用户组开启评分功能后,用户一点击
    漏洞修补方案一:后端措施在source/module/forum/forum_misc.php文件中,$post=C::t('forum_post')->fetch('tid:'.$_G['tid'],$_GET['pid']);//这一步调用大C的静态方法t()从表forum_post中根据tid和pid共同查询出当前要评分的帖子主体内容对此处查询出来的$post数据直接后端进......
  • .NET6中使用Autofac组件
      Autofac是.NETIoC容器.它管理类之间的依赖关系,从而使应用在规模及复杂性增长的情况下依然可以轻易地修改.它的实现方式是将常规的.net类当做组件处理.1.安装Nuget包2.在Api中创建一个AutofacModule的类usingAutofac;usingSystem.Reflection;namespace......
  • Vue动态创建组件实例并挂载到body
    方式一importVuefrom'vue'/***@paramComponent组件实例的选项对象*@paramprops组件实例中的prop*/exportfunctioncreate(Component,props){constcomp=new(Vue.extend(Component))({propsData:props}).$mount()document.body.appendChild(......