引言
本文内容来源于抖音-哲玄前端的全栈视频课程,该项目是基于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);
}
},
};
以上内容为初步阶段性总结,难免有不足之处,请谅解