追逐全栈-从Elpis-core出发

139 阅读2分钟

引言

本文内容来源于抖音-哲玄前端的全栈视频课程,该项目是基于Koa实现的服务端框架,通过一系列的约定,达到简化应用开发的效果。抖音“哲玄前端”,《全栈实践课》

目录结构

Elpis/
 |--app/
      |--controller/ //存放 controller文件 ,用于处理请求相关
      |--extend/     //接入拓展工具
      |--middleware/  //存放各种中间件,并在middleware.js引入使用
      |--public/       //公共资源文件
      |--router/        //路由
      |--router-schema/   //存放规则文件
      |--service/       //service,数据处理和第三方服务调用
      |--middleware.js   //全局中间件引入
 |--config/              //各种环境的不同配置文件
 |--Elpis-Core/           //项目主体
 |--logs/      //日志文件
 |--index.js   //入口文件,启动项目
  

  

以上是整体的大致目录结构,在app路径下,我们存放约定,然后Elpis-core会从这些目录读取对应的文件并初始化加载,然后挂载到Koa实例上。

下面我们来看下Elpis-Core里面的内容,以及相关操作

可以看到的是,在loader文件夹里面的js文件都可以在app路径下找到对应的文件,这块呢,就是属于公共的配置类型,也就是拿到app里对应文件夹下的每个文件,进行挂载,具体的业务功能,参考上方同名文件,我们可以看下controller.js文件

以上就是要实现的功能,那么下面我们就是在项目入口文件,启动elpis-core

// 引入ElpisCore
const ElpisCore = require("./elpis-Core");
// 启动项目
ElpisCore.start({
  name: "elpis",
});

在引擎入口文件,加载各个处理器,即Elpis-Core/index.js

const Koa = require("koa");
const path = require("path");
const { sep } = path; //兼容不同操作系统斜杠
const env = require("./env");
const middlewareLoader = require("./loader/middleware");
const routerSchemaLoader = require("./loader/router-schema");
const routerLoader = require("./loader/router");
const serviceLoader = require("./loader/service");
const controllerLoader = require("./loader/controller");
const extendsLoader = require("./loader/extend");
const configLoader = require("./loader/config");
module.exports = {
  /**
   * 启动服务
   * @param options 配置项
   * options={
   * name //项目名称
   * honmePage //项目首页
   * }
   */
  start(options = {}) {
    // koa实例

    const app = new Koa();
    // 应用配置
    app.options = options;
    // 基础路径
    app.baseDir = process.cwd();
    // 业务文件路径
    app.businessPath = path.resolve(app.baseDir, `.${sep}app`);
    // 初始化环境配置
    app.env = env();
    // 加载middleware
    middlewareLoader(app);

    console.log(`-- [start] load middleware done --`);
    // 加载routerSchema
    routerSchemaLoader(app);
    console.log(`-- [start] load routerschema done --`);
    // 加载controller
    controllerLoader(app);
    console.log(`-- [start] load controller done --`);
    // 加载service
    serviceLoader(app);
    console.log(`-- [start] load service done --`);
    // 加载config
    configLoader(app);
    console.log(`-- [start] load config done --`);
    // 加载extends
    extendsLoader(app);
    console.log(`-- [start] load extends done --`);

    // 注册全局中间件
    try {
      require(`${app.businessPath}${sep}middleware.js`)(app);
      console.log(`-- [start] load global middleware done --`);
    } catch (e) {
      console.log("[exception] there is no global middleware file");
    }

    // 加载router,注册路由
    routerLoader(app);
    console.log(`-- [start] load router done --`);
    try {
      // 启动服务
      const port = process.env.PORT || 8080;
      const host = process.env.IP || "0.0.0.0";
      app.listen(port, host);
      console.log("server runnning", port);
    } catch (err) {
      console.error(err);
    }
  },
};

以上内容为初步阶段性总结,难免有不足之处,请谅解