手记

【金秋打卡】第1天 eggjs 基础

课程名称: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;
  }

0人推荐
随时随地看视频
慕课网APP