项目介绍
elpis-core是基于Koa框架,并参考egg.js设计,实现服务端内核引擎 。
项目定位
- 轻量级、高性能的Node.js服务端内核引擎
- 基于Koa框架构建
- 企业级应用开发解决方案
核心特性
- 轻量级启动:一行代码启动应用
- 模块化架构:清晰的目录结构
- 自动加载机制:基于约定的模块发现
- 安全防护:内置API签名验证,以及请求参数的校验
技术架构
- 核心组件:主入口、环境管理、模块加载器集合
- 设计理念:约定由于配置,分层的架构设计、模块化的设计
- 架构模式:MVC架构,职责分离
项目文件目录
elpis // 项目目录
app // 文件目录
controller // 业务逻辑处理目录
extend // 其他扩展目录
middleware // 自定义中间件目录
public // 公共文件目录
router // router 接口的定义目录
router-schema // 参数的校验目录
service // 服务,数据的处理目录
middleware.js // 中间件注册文件
config // 环境配置目录
elpis-core // 内核实现目录
loader // loader 目录
controller // controllerLoader 实现
extend // extendLoader 实现
middleware // middlewareLoader 实现
router // routerLoader 实现
router-schema // routerSchemaLoader 实现
service // serviceLoader 实现
logs // 存放日志文件目录
.eslintignore // eslint校验忽略文件
.eslintrc // eslint 校验规则
.gitignore // git提交忽略文件
index.js // 整个项目的入口
package.json // 项目包
README.md // 说明文档
elpis-core的使用
// 引入 elpis-core
const ElpisCore = require("./elpis-core");
// 启动项目
ElpisCore.start({
name: 'Elpis',
homePage: '/'
});
启动流程的设计
- 渐进式加载(从基础配置到业务模块,逐步构建应用。每个步骤都有明确的职责和依赖关系)。
- 错误容错(每个步骤都有异常处理机制。确保单个模块发生异常而影响整体启动)。
- 日志记录(每个步骤都有启动日志包括项目发生异常,便于调试和监控整个项目的运行)。
- 模块化设计(六个加载器分别处理不同类型的模块,支持按需加载和扩展)。
- 优雅降级(全局中间件文件不存在时不会报错,提供了默认配置和兜底处理)
elpis-core启动流程
七步启动流程
- 创建Koa实例
const app = new Koa();
作用:为整个应用提供HTTP服务的基础
- 基础配置初始化
app.options = options;
app.baseDir = process.cwd();
app.businessPath = path.resolve(app.baseDir, `./app`);
作用:为续模块加载提供上下文环境
- 环境配置
app.options = options;
app.baseDir = process.cwd();
app.businessPath = path.resolve(app.baseDir, `./app`);
作用:支持多环境(本地、测试、生产)配置
- 模块加载(6个加载器)
// 1. 中间件加载器
middlewareLoader(app);
// 2. 路由模式加载器
routerSchemaLoader(app);
// 3. 控制器加载器
controllerLoader(app);
// 4. 服务层加载器
serviceLoader(app);
// 5. 配置加载器
configLoader(app);
// 6. 扩展加载器
extendLoader(app);
实现自动模块发现和依赖的注入
- 中间件注册
// 配置静态根目录
const koaStatic = require("koa-static");
app.use(koaStatic(path.resolve(process.cwd(), "./app/public")));
// 模版渲染引擎
const koaNunjucks = require("koa-nunjucks-2");
app.use(
koaNunjucks({
ext: "tpl",
path: path.resolve(process.cwd(), "./app/public"),
nunjucksConfig: {
// 关闭模板缓存,每次请求都会重新读取模板文件,开发阶段用这个方便调试
noCache: true,
// 删除模板标签后的换行符,使生成的 HTML 更紧凑
trimBlocks: true,
// 自动 HTML 转义,防止 XSS(默认是开启的)
autoescape: true,
},
})
);
// 引入 ctx.body 解析中间件
const koaBodyparser = require("koa-bodyparser");
app.use(
koaBodyparser({
formLimit: "1000mb",
enableTypes: ["json", "form", "text"],
})
);
// 异常捕获中间件
app.use(app.middlewares.errorHandler);
// API 签名校验中间件
app.use(app.middlewares.apiSignVerify);
// API 参数校验中间件
app.use(app.middlewares.apiParamsVerfiy);
作用:处理中间件(如日志、安全、错误处理)
- 路由注册
routerLoader(app);
作用:建立URL到控制器的映射关系
- 启动服务
try {
const port = process.env.POST || 8080;
const host = process.env.IP || "0.0.0.0";
app.listen(port, host);
console.log(`Service running on port ${port}`);
} catch (error) {
console.log(error);
}
作用:应用正式启动,开始接收HTTP请求
总结
-
设计之美:简洁而不简单的API设计
-
架构之巧:基于约定的自动模块发现
-
性能之优:轻量级启动和高效加载
-
安全之固:多重安全防护机制
-
开发之友:优秀的开发体验
注:引用哲玄前端《大前端全栈实践》