被用于运行时和应用程序的模块化功能。Malagu 使用模块化设计,将功能作为组件来提供。一个应用随着业务的发展往往会变得越来越复杂和臃肿,不同应用之间又往往存在不同维度的共性。组件化能很好的解决上面的问题:
- 通过将复杂和臃肿的应用横向拆分成一个个业务组件
- 通过把存在共性的不同应用纵向提炼抽象成一个个基础组件
另外,Malagu 框架本身也是一个特别复杂的项目,Malagu 框架同样可以基于自身的组件机制来实现,让 Malagu 框架更具活力。
加载机制
Malagu 组件本质上就是一个 npm 包,我们只需要在一个普通的 npm 包的 package.json
文件的 keywords
属性中添加 malagu-component
关键字,则被 Malagu 的命令行工具识别为一个 Malagu 组件,Malagu 的命令行工具则按照组件的加载机制进行加载。其中,加载机制主要包含两部分:属性加载和模块加载。使用 Malagu 命令行工具加载,可以极大简化组件的组装,当然,我们也可以手动组装 Malagu 组件,这时候,package.json
中的 keywords
属性无需做任何配置了。
组件种类
Malagu 组件设计是一种高度抽象的设计,模型足够的简单。我们可以实现编译时组件,干预 Malagu 应用的运行、构建与部署。也可以开发前端、后端和前后端一体化组件。对于 Malagu 来说,不关心组件类型是什么,Malagu 有一套统一且简单的模型来抽象这一切。
Core 组件
框架默认基础组件都在 @malagu
npm 组织下,例如安装 Core 组件可以通过 npm install @malagu/core
安装。Core 组件主要包含如下能力:
- 应用生命周期管理
- 依赖注入装饰器
- AOP 面向切面编程
- EL 表达式
- 属性配置管理
- 管道
- 日志管理
- 异常接口
- 工具类
其他组件一般是依赖 Core 组件,使用 Core 组件的依赖注入、日志、应用生命周期等相关能力。我们也推荐你这么做。
Web 组件
Web 组件,即 @malagu/web
,依赖 Core 组件。Malagu 并非只是一个 Web 应用开发框架,我们可以使用Malagu 开发非 Web 应用类型,比如命令行工具、桌面应用等等。如果我们开发的是一个 Web 应用,Web 组件一般是必不可少。Web 组件对 Web 应用场景常用能力的抽象与封装。具体包含如下能力:
- 中间件(可以方便对接 Express 中间件)
- CORS 管理
- Cookie 管理
- Session 管理
- 链路追踪
- HTTP 协议接口(映射规则和请求处理器)
- 工具类
Web 组件只是偏底层的抽象,如果单独使用 Web 组件开发 Web 应用比较低效。所有我们一般情况下会与 Web 组件的子组件 MVC 组件和 RPC 组件结合在一起使用。
- MVC 组件,即
@malagu/mvc
,基于 Web 组件的扩展接口,实现了一套装饰器风格的 REST API 定义方式 - RPC 组件,即
@malagu/rpc
,基于 Web 组件的扩展接口,实现了一套 RPC 风格 API 定义方式
实际使用中,我们可以选择其中一种或者两种风格定义 API。当然,我们也可以直接扩展 Web 组件的接口,类似 MVC 组件和 RPC 组件,定义自己所需要的书写风格。
云组件
Malagu 是一个 Serverless Frist 应用开发框架,不仅体现在 Serverless 场景中的冷启动优化、数据库连接管理、Session 管理等等方面,还体现在 Malagu 应用对云计算资源的分层抽象与解耦,从而实现平台不锁定。而云组件,即 @malagu/cloud
,是一个云计算资源的底层抽象以及云计算通用的能力,目的是为了屏蔽不同云厂商之间的差异。具体实现由子组件实现。其中,@malagu/faas-adapter
组件就是云组件的一个子组件,@malagu/faas-adapter
组件是对 FaaS 能力的抽象,属于第二层抽象,在它下面才是真正的具体实现,如 @malagu/scf-adapter
、@malagu/fc-adapter
、@malagu/lambda-adapter
、@malagu/vercel-adapter
和 @malagu/express-adapter
。这些具体实现就与具体的云厂商相关了。云组件主要包含一下能力:
- 各种云计算资源接口定义
- 云账号接口
- 地域接口
- 客户端配置选项
更多基础组件介绍,请移步于基础组件。