Malagu 框架可以开发前端、后端和其他类型应用(比如没有监听任何端口,比如命令行应用)。不管什么样的应用,都会存在一些共性的地方。Malagu 框架抽象了一个应用程序接口 Application 。这个接口足够简单,只有一个 start 方法,用来启动应用。不同类型的应用的启动方式可能不同。比如前端应用在启动时,前端 Dom 对象会挂载到 Document 上。

  1. // 应用程序接口
  2. export interface Application {
  3. start(): Promise<void>;
  4. }

应用生命周期

应用启动的过程中,会触发不同阶段的生命周期方法的执行。ApplicationLifecycle 接口主要是应用生命周期的抽象。当您需要监听应用生命周期的某个阶段时,您可以通过实现 ApplicationLifecycle 全部或部分接口,并以 id 为 ApplicationLifecycle 注入到 IoC 容器即可。例如,我们在应用启动的时候初始化数据库连接池就可以实现该接口。

  1. export interface ApplicationLifecycle<T extends Application> {
  2. initialize?(): void;
  3. onStart?(app: T): MaybePromise<void>;
  4. onStop?(app: T): void;
  5. }

独立启动应用

Malagu 框架通过命令行工具,外加框架本身的渐进式能力,使我们不用关心框架底层是如何启动的,框架会根据组件依赖情况,自动加载模块,并采用适合的方式启动应用程序,我们只需要使用 malagu serve 命令即可。在一些特殊的情况下,我们也可以独立启动应用。独立启动应用大体分为两步:

  1. 加载模块,构建 IoC 容器
  2. 获取应用程序对象,并启动应用
  1. import 'reflect-metadata';
  2. import { Container } from 'inversify';
  3. import { CoreBackendModule } from '@malagu/core/lib/node/module';
  4. import { Application } from '@malagu/core';
  5. import { OtherModule } from '../module';
  6. (async () => {
  7. const container = new Container();
  8. container.load(CoreBackendModule, OtherModule); // 加载模块,构建 IoC 容器
  9. const application = container.get<Application>(Application); // 获取应用程序对象,并启动应用
  10. await application.start();
  11. })();