elpis全栈课程学习之elpis-core学习总结
核心原理
elpis-core是全栈框架 elpis的服务端内核,主要应用于服务端接口的开发以及页面的SSR 渲染,elpis-core 基于约定优于配置 的原理,通过一系列的loader 来加载对应的文件,大大节约用户的开发成本。elpis-core使用户的注意力使用始终集中于业务开发,而无需关注其他。
elpis-core目录结构
arduino
├─ 📁elpis-core
│ ├─ 📁loader
│ │ ├─ 📄config.js
│ │ ├─ 📄controller.js
│ │ ├─ 📄extend.js
│ │ ├─ 📄middleware.js
│ │ ├─ 📄router-schema.js
│ │ ├─ 📄router.js
│ │ └─ 📄service.js
| │ ├─ 📁utils
│ ├─ 📄env.js
│ ├─ 📄index.js
├─ 📄index.js
elpis-core应用的目录机构
arduino
├─ 📁app
│ ├─ 📁controller // 存放业务处理文件,进行业务逻辑的处理
│ ├─ 📁extend // 存放拓展文件,比如:日志文件...
│ ├─ 📁middleware // 中间件逻辑处理,挂载到koa实例进行一系列的处理
│ ├─ 📁public
│ │ ├─ 📁output
│ │ └─ 📁static
│ ├─ 📁router // 路由文件
│ ├─ 📁router-schema // 对 router 规则校验的文件
│ ├─ 📁service // 服务层的文件,主要用于服务端的交互
│ └─ 📄middleware.js // 全局的中间件
loader具体实现原理
通过glob 这个库读取相对应的目录,加载每个目录下的文件并挂载到Koa实例上
controller-loader模块的代码实现
js
// 读取app/controller下所有文件
const fileList = readFile(`.${sep}controller`, `.${sep}**${sep}**.js`, app)
const controllers = {}
fileList.forEach(file => {
// 提取文件名称
let name = path.resolve(file)
// 截取路径
name = subPath(name, 'controller')
// 将custom-module/custom-controller -> customModule/customController
name = toCamelCase(name)
//挂载controller到app实例
let tempController = controllers
const names = name.split(sep) // [customModule, customController]
for (let i = 0, len = names.length; i < len; i++) {
if (i === len - 1) {
const ControllerModule = require(path.resolve(file))(app)
// 是文件
tempController[names[i]] = new ControllerModule()
} else {
// 文件夹
if (!tempController[names[i]]) {
tempController[names[i]] = {}
}
tempController = tempController[names[i]]
}
}
})
app.controller = controllers
注:其余模块的loader与其类似,这里不过多赘述
总结
以上内容来源于抖音哲玄前端 博主的全栈实践课程,结合我的理解进行的思路整理,如有误,欢迎各位大佬指正。