elpis-core:基于 node 实现服务端内核引擎

151 阅读3分钟

项目介绍

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: '/'
});

启动流程的设计

  1. 渐进式加载(从基础配置到业务模块,逐步构建应用。每个步骤都有明确的职责和依赖关系)。
  2. 错误容错(每个步骤都有异常处理机制。确保单个模块发生异常而影响整体启动)。
  3. 日志记录(每个步骤都有启动日志包括项目发生异常,便于调试和监控整个项目的运行)。
  4. 模块化设计(六个加载器分别处理不同类型的模块,支持按需加载和扩展)。
  5. 优雅降级(全局中间件文件不存在时不会报错,提供了默认配置和兜底处理)

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设计

  • 架构之巧:基于约定的自动模块发现

  • 性能之优:轻量级启动和高效加载

  • 安全之固:多重安全防护机制

  • 开发之友:优秀的开发体验

注:引用哲玄前端《大前端全栈实践》