课程名称:web前端架构师
课程章节:第14周 第四章 egg基础知识
主讲老师:张轩
课程内容: eggjs 启动自定义和 egg typescript 支持原理
eggjs 启动自定义
我们常常需要在应用启动期间进行一些初始化工作,等初始化完成后应用才可以启动成功,并开始对外提供服务。
框架提供了统一的入口文件(app.js)进行启动过程自定义,这个文件返回一个 Boot 类,我们可以通过定义 Boot 类中的生命周期方法来执行启动应用过程中的初始化工作。 使用ts时入口文件就是 app.ts
框架提供了这些 生命周期函数供开发人员处理:
- 配置文件即将加载,这是最后动态修改配置的时机(configWillLoad)
- 配置文件加载完成(configDidLoad)
- 文件加载完成(didLoad)
- 插件启动完毕(willReady)
- worker 准备就绪(didReady)
- 应用启动完成(serverDidReady)
- 应用即将关闭(beforeClose)
configWillLoad
配置文件即将加载,这是最后动态修改配置的时机
此时 config 文件已经被读取并合并,但是还并未生效
这是应用层修改配置的最后时机
注意:此函数只支持同步调用
import { IBoot, Application } from 'egg';
export default class AppBook implements IBoot {
private readonly app: Application;
constructor(app: Application) {
this.app = app;
}
// 配置文件即将加载,这是最后动态修改配置的时机
configWillLoad(): void {
console.log(this.app.config.sourceUrl);
console.log(this.app.config.coreMiddleware);
this.app.config.coreMiddleware.push('myLogger');
}
}
egg typescript 支持原理
每次保存文件都会在 typings 目录下生成类型声明文件
typings 目录下的文件目录和我们源代码的文件目录结构完全一致
controller
在 controller.d.ts 文件中它利用了类型重载,导入我们编写的 controller 文件
import 'egg';
import ExportArticle from '../../../app/controller/article';
import ExportHome from '../../../app/controller/home';
declare module 'egg' {
interface IController {
article: ExportArticle;
home: ExportHome;
}
}
而上面的 IController 时在 EggApplication 下的,所有我们就可以使用 this.app.controller 拿到 controller
export class Application extends EggApplication {
/**
* global locals for view
* @see Context#locals
*/
locals: IApplicationLocals;
/**
* HTTP get method
*/
get(path: RouterPath, fn: string): void;
get(path: RouterPath, ...middleware: any[]): void;
/**
* HTTP post method
*/
post(path: RouterPath, fn: string): void;
post(path: RouterPath, ...middleware: any[]): void;
/**
* HTTP put method
*/
put(path: RouterPath, fn: string): void;
put(path: RouterPath, ...middleware: any[]): void;
/**
* HTTP patch method
*/
patch(path: RouterPath, fn: string): void;
patch(path: RouterPath, ...middleware: any[]): void;
/**
* HTTP delete method
*/
delete(path: RouterPath, fn: string): void;
delete(path: RouterPath, ...middleware: any[]): void;
/**
* restful router api
*/
resources(name: string, prefix: string, fn: string): Router;
resources(path: string, prefix: string, ...middleware: any[]): Router;
redirect(path: string, redirectPath: string): void;
controller: IController;
middleware: KoaApplication.Middleware[] & IMiddleware;
/**
* Run async function in the background
* @see Context#runInBackground
* @param {Function} scope - the first args is an anonymous ctx
*/
runInBackground(scope: (ctx: Context) => void): void;
}