Malagu 框架可以开发前端、后端和其他类型应用(比如没有监听任何端口,比如命令行应用)。不管什么样的应用,都会存在一些共性的地方。Malagu 框架抽象了一个应用程序接口 Application
。这个接口足够简单,只有一个 start
方法,用来启动应用。不同类型的应用的启动方式可能不同。比如前端应用在启动时,前端 Dom 对象会挂载到 Document 上。
// 应用程序接口
export interface Application {
start(): Promise<void>;
}
应用生命周期
应用启动的过程中,会触发不同阶段的生命周期方法的执行。ApplicationLifecycle 接口主要是应用生命周期的抽象。当您需要监听应用生命周期的某个阶段时,您可以通过实现 ApplicationLifecycle 全部或部分接口,并以 id 为 ApplicationLifecycle 注入到 IoC 容器即可。例如,我们在应用启动的时候初始化数据库连接池就可以实现该接口。
export interface ApplicationLifecycle<T extends Application> {
initialize?(): void;
onStart?(app: T): MaybePromise<void>;
onStop?(app: T): void;
}
独立启动应用
Malagu 框架通过命令行工具,外加框架本身的渐进式能力,使我们不用关心框架底层是如何启动的,框架会根据组件依赖情况,自动加载模块,并采用适合的方式启动应用程序,我们只需要使用 malagu serve
命令即可。在一些特殊的情况下,我们也可以独立启动应用。独立启动应用大体分为两步:
- 加载模块,构建 IoC 容器
- 获取应用程序对象,并启动应用
import 'reflect-metadata';
import { Container } from 'inversify';
import { CoreBackendModule } from '@malagu/core/lib/node/module';
import { Application } from '@malagu/core';
import { OtherModule } from '../module';
(async () => {
const container = new Container();
container.load(CoreBackendModule, OtherModule); // 加载模块,构建 IoC 容器
const application = container.get<Application>(Application); // 获取应用程序对象,并启动应用
await application.start();
})();