被用于运行时和应用程序的模块化功能。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 。这些具体实现就与具体的云厂商相关了。云组件主要包含一下能力:

  • 各种云计算资源接口定义
  • 云账号接口
  • 地域接口
  • 客户端配置选项

更多基础组件介绍,请移步于基础组件