Elpis 一个能够自定义的nodejs前后端框架

一、Elpis

Elips-Core设计模式:

elpis-core 的架构可以看作是 Koa + 自动化加载器 (Loaders)

  • App 实例:作为全局上下文,保存了所有的配置、控制器、服务、中间件。

  • 分层模型

  1. Routing: 定义 API 路径与 Controller 方法的映射。
  2. Middleware: 全局或局部拦截器(如鉴权、参数校验)。
  3. Controller: 负责解析输入,调用 Service。
  4. Service: 负责数据库操作或第三方 API 调用。
  5. Extend : 支持通过 extend 机制直接扩展 app 实例的功能。
  6. Router-Schema: 定义 API 参数校验规则(配合 AJV 使用)。
  7. Router : 将定义的路由注册到 koa-router 中。
  • 启动流程
  1. 初始化 Koa 实例及环境配置。
  2. 依序执行 Loaders(Config -> Middleware -> Router-Schema -> Controller -> Service -> Extend -> Router)。
  3. 启动监听服务。

二、Loader

Config Loader ()

  • 加载 config.default.js 作为基础配置
  • 根据环境变量加载对应的环境配置(local/beta/procution)
  • 环境配置object.assign覆盖默认配置,最终挂在到 app.config

Middleware Loader (中间件加载器)

  • 扫描 app/middleware/*.js 所有中间件文件
  • 支持多级目录结构
  • 自动转换文件名为驼峰命名 (error-handler.js -> errorHandler)
  • 挂载到 app.middlewares 使用 (app.middlewares.xxx)

Router-Schema Loader (路由校验规则加载器)

  • 加载所有 JSON Schema 格式的 API 参数校验规则
  • 合并所有规则到 app.routerSchema
  • 配合 api-params-verify 中间件使用,基于 AJV 进行参数校验

Controller Loader (控制器加载器)

  • 与 Service Loader 类似,加载并实例化所有 Controller
  • 将controller定义成class,方便实例化继承,增加代码维护性
  • 定义base统一处理类,处理成功和失败
  • 挂载到 app.controller
  • 提供render方法渲染页面实现ssr

Service Loader (业务层)

  • 扫描 app/service/*.js 并实例化所有 Service 类
  • 将service定义成class,方便实例化继承,增加代码维护性
  • 支持多级目录结构和驼峰命名转换
  • 每个 Service 自动实例化 (new ServiceModule())
  • 挂载到 app.service.xxx (eg. app.service.project.getList())

Extend Loader (扩展加载器)

  • 扩展 app 对象的能力
  • 不支持多级目录,直接挂载到 app 上
  • 例如日志能力 app.logger (app.logger.info('...'))
  • 防止命名冲突 (检查 app 已有属性)

Router Loader (路由加载器)

  • 创建 KoaRouter 实例
  • 加载所有路由定义文件
  • 提供兜底路由,临时重定向到首页
  • 注册路由到 Koa 应用

框架的加载顺序经过精心设计,确保依赖关系正确:

bash 复制代码
1. middlewareLoader     # 加载中间件(供后续使用)
2. routerSchemaLoader   # 加载路由验证规则
3. controllerLoader     # 加载控制器
4. serviceLoader        # 加载服务层
5. configLoader         # 加载配置文件
6. extendLoader         # 加载扩展功能
7. 全局中间件注册       # 注册全局中间件
8. routerLoader         # 最后加载路由(依赖上述所有组件)

三、核心特性

约定优于配置

  • 严格的目录结构约定
  • 自动化的模块扫描和加载
  • 统一的命名规范 (驼峰转换)

分层架构

  • Router(定义接口执行Controller中的方法) -> Controller -> Service 清晰的调用链
  • 职责分离,便于维护和测试

可扩展性

  • Extend 机制可自由扩展框架能力(eg:log4js)

多环境支持

  • 配置环境按环境隔离
  • 日志策略按环境区分 (本地->控制台 / 生产 -> 落盘)

自动化参数校验

  • 基于 JSON Schema 的声明式校验
  • AJV 引擎自动校验请求参数

四、定义一个完整的 API 流程

定义 Router

javascript 复制代码
module.exports = (app, router) => {
  const { project: projectController } = app.controller
  router.get('/api/project/list', projectController.getList.bind(projectController))
}

定义 Router-Schema

css 复制代码
module.exports = {
  '/api/project/list': {
    get: {
      query: {
        type: 'object',
        properties: {
          proj_key: { type: 'string' },
        },
        required: ['proj_key']
      }
    }
  }
}

定义 Controller

scala 复制代码
module.exports = (app) => {
  const BaseController = require('./base')(app)
  return class ProjectController extends BaseController {
    /**
     * 获取项目列表
     * @param {object} ctx 上下文
     */
    async getList (ctx) {
      const { project: projectService } = app.service
      const projectList = await projectService.getList()
      this.success(ctx, projectList)
    }
  }
}

定义 Service

javascript 复制代码
module.exports = (app) => {
  const BaseService = require('./base')(app);
  return class projectService extends BaseService {
    async getList () {
      return [{
        name: 'project1',
        desc: ' project1 desc'
      },
      {
        name: 'project2',
        desc: ' project2 desc'
      },
      {
        name: 'project3',
        desc: ' project3 desc'
      }]
    }
  }
}

五. 应用方法与场景

应用方法

  1. 定义基类 :建议通过 BaseController 提供统一的 success/fail 返回格式。
  2. 利用 Service :在 Controller 中通过 app.service.xxx 调用对应服务。
  3. 参数校验 :在 router-schema 中定义 JSON Schema,配合中间件实现 API 入参自动校验。

适用场景

  • 中后台管理系统:需要快速搭建标准化的 API 服务。
  • 微服务节点:轻量级,启动快,易于维护。
  • 模版渲染应用 :支持集成 Nunjucks 等模板引擎(例如在 app/middleware.js 中配置)。
复制代码
相关推荐
米饭同学i2 小时前
微信小程序实现动态环形进度条组件
前端·微信小程序
特别橙的橙汁2 小时前
Node.js 调用可执行文件时的 stdout 缓冲区问题
前端·node.js·swift
yiranlater2 小时前
点云八叉树处理
前端
榴莲CC2 小时前
VK1620 抗噪数显LED驱动芯片数码管显示IC内置 RC振荡器/8级整体亮度可调
前端
@Autowire2 小时前
Layout-box-sizing是 CSS 中控制元素盒模型计算方式的核心属性,直接决定了元素的 width/height 是否包含内边距和边框
前端
alamhubb2 小时前
反感pnpm的全链路污染?可以了解下这个对原项目零侵入,零修改完全兼容npm的monorepo工具
前端·javascript·node.js
叁两2 小时前
“死了么”用户数翻800倍,估值近1亿,那我来做个“活着呢”!
前端·人工智能·产品
AdleyTales2 小时前
vscode识别不了@提示找不到路径解决
前端·javascript·vscode
去哪儿技术沙龙3 小时前
去哪儿网前端代码自动生成技术实践
前端·ai编程