文件级别的模块化
;组件级别的模块化
;视图级别的模块化
;业务功能级别前端模块化
。业务功能级别前端模块化在后台开发人员眼中再熟悉不过了,咱们一般说的"用户模块","订单模块","评论模块"等都是从业务功能视角来划分的。随着前端承载的功能愈来愈厚重,如今已经不仅是简单渲染一个视图而已,它每每也包含不少的业务逻辑和状态,因此愈来愈多的前端工程中也出现了 model、controller、states 等概念,若是前端模块化仅仅停留在文件、组件级别,那么整个工程将变得难以维护和拓展。前端
看了不少时下流行的前端工程结构,每每是这样:vue
├── src │ ├── assets │ ├── components │ ├── layouts │ ├── models //vuex或者dva,按业务功能划分模块 │ │ ├── user │ │ ├── order │ │ └── comment │ ├── pages │ ├── services │ ├── utils
能够看到,在 models(store)这个领域,仍是有按照业务功能划分了模块,可是...也仅限于 models 而已,脱离 view,单纯一个 model 模块有什么意义?这样的模块化完整吗?能独立开发吗?能灵活插拔吗?能横向扩展吗?react
一个完整的模块应当包含:git
它们应当集中归类到一个目录下面,而不是零碎的分散在各个角落,独立开发的时候我只须要拥有这个目录的修改权限而不是整个工程,插拔模块的时候只须要 copy 或 del 这个目录,而不是翻出各个目录去查找相关文件...github
因此我指望的工程结构应当是这样:vuex
├── src │ ├── assets //公用资源 │ ├── components //公用组件 │ ├── utils //公用工具 │ ├── modules //多个独立的业务模块 │ │ │ │ │ ├── user //用户模块 │ │ │ ├── assets //私用资源 │ │ │ ├── components //私用组件 │ │ │ ├── utils //私用工具 │ │ │ ├── model //model │ │ │ └── views //一个或多个视图 │ │ │ ├── page1 │ │ │ ├── page2 │ │ │ ├── list │ │ │ ├── editor │ │ │ └── layout │ │ │ │ │ ├── order //订单模块 │ │ │ ├── assets //私用资源 │ │ │ ├── components //私用组件 │ │ │ ├── utils //私用工具 │ │ │ ├── model //model │ │ │ └── views //一个或多个视图 │ │ │ ├── page1 │ │ │ ├── page2 │ │ │ ├── list │ │ │ ├── editor │ │ │ └── layout │ │ │ │ │ ├── comment //评论模块 │ │ │ ├── ...
能够看到每一个 module 都有一套独立的目录结构,各类资源都被区分为公用资源
和 模块私有资源
,全部模块仅依赖公用资源,模块与模块之间切割得十分干净了。npm
把 page(view)也归类到不一样到模块,你可能会问:若是一个 view 里面包含了多个模块到内容,那这个 view 应当属于哪一个模块呢?这种状况下,咱们须要对该 view 进行切割,让其变成多个功能更单一的子 view,view 是能够嵌套的不是吗?后端
当某客户但愿购买一个"文章模块“,固然是围绕文章模块相关的代码和资源一并打包给他,单独给他一个 view 或者 model 是毫无心义的,那样也跑不起来。前端框架
按需加载也是同样:按需加载的应当是整个模块,而不是传统意义上的懒加载某个 component框架
因此,工程化打包的时候,应当把整个模块文件夹下全部代码打包成一个独立的 bundle,包括 views、model、components 和其它辅助代码。
模块是按照“高内聚、低耦合”的原则划分的,模块与模块之间是松散的,大量的方法和接口应当封装在模块内部,仅按需对外暴露和导出。若是 2 个模块之间联系特别紧密,那是否要考虑一下它们是否是要合并成一个模块
从几什么时候前端也开始思考和借鉴后端“微服务”的概念,但愿能找到一种方案让复杂的前端业务也能应用自治,可是目前来讲这是一种美好的想法,具体怎么落地尚没有成熟案例,而尽量的内聚、隔离模块之间的关系却是理念共识。
上面只是思考与思路,实现这个思路固然有各类具体的方案,好比我原创的:medux 系列框架,欢迎探讨: