elpis-core:一个基于koa和node.js实现的轻量级Web框架

12 阅读3分钟

核心概念 -> node.js,koa,Egg.js

node.js 介绍

node.js 是一个基于Chrome V8引擎的 javaScript 运行环境,用于在服务器端运行 javaScript 代码,使我们前端人员能够通过我们熟悉的语言去进行服务器端开发,也就是后端开发,减少了我们的学习成本。

node.js 主要作用是提供一个时间驱动,非阻塞式的I/O模型,使 javaScript 能够高效的处理大量并发请求,在传统的 web 应用中,每个请求都需要一个独立的线程来处理,而 node.js 采用单线程循环模型减少了系统资源的使用。node.js 提供了系统级的API,例如文件操作,网络请求等,实现 tcp/ip 的通信等等功能。

koa 介绍

koa 是一个 node.js 的 web 框架,旨在提供更简洁,更高效的开发。koa 本身只包含了一些中间件的架构和上下文处理,大体可以分为三个部分: 上下文(Context): 简称ctx,封装了 requset 和 response 对象,可以通过 ctx 来直接获取这些请求相关的内容,并且设置对应的响应信息。 中间件(Middleware):采用洋葱模型中间件机制,按照顺序执行,支持异步和扩展各种外部功能以及我们自己编写的一些错误兜底处理和校验等功能。 应用(Application):koa 的 应用实例,可以通过 app.use() 方法来注册各种各样的中间件,调用 app.listen() 来启动服务器。

const Koa = require('koa');
const app = new Koa();

// 中间件:日志记录
app.use(async (ctx, next) => {
  console.log('请求开始:', ctx.path);
  await next(); // 执行下一个中间件
  console.log('请求结束:', ctx.path);
});

// 中间件:处理业务逻辑
app.use(async (ctx) => {
  ctx.body = 'Hello, Koa!';
});

app.listen(3000, () => {
  console.log('服务运行在 http://localhost:3000');
});

Egg.js

egg.js 是一个为企业级应用设计的 node.js 框架,通过约定优先于配置的理念,提供了一套完整的开发规范和时间。

elpis-core

elpis-core就是我们自己实现的一个简易版本的egg.js,借鉴了核心设计理念和架构模式,更轻量化实现的一个项目。

什么是约定优于配置

项目框架预设了一套标准的目录结构,命名规范,行为逻辑等规则,开发者可以去进行个性化的设计,减少了开发者需要手动配置的内容。

image.png

elpis-Core下的这几个loader,都是在实现自动扫描文件并挂载到app上,我们的业务逻辑实现都放在app中去实现。

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 configLoader = require('./loader/config')
const controllerLoader = require('./loader/controller')
const extendLoader = require('./loader/extend')

module.exports = {
    start(options = {}) {
        const app = new Koa()

        // 应用配置
        app.options = options;

        // 基础路径
        app.baseDir = process.cwd()

        // 业务文件路径
        app.businessPath = path.resolve(app.baseDir, `.${sep}app`)

        // 初始化环境配置
        app.env = env(app)

        // 加载configLoader
        configLoader(app)

        // 加载serviceLoader
        serviceLoader(app)

        // 加载middlewareLoader
        middlewareLoader(app)

        // 加载routerSchemLoader
        routerSchemaLoader(app)

        // 加载controllerLoader
        controllerLoader(app)

        // 加载extendLoader
        extendLoader(app)

        // 注册 elpis 全局中间件
        try {
            const elpisMiddlewarePath = path.resolve(__dirname, `..${sep}app${sep}middleware.js`)
            const eplisMiddleware = require(elpisMiddlewarePath)
            eplisMiddleware(app);
        } catch (e) {   
            console.log('[app:exception] there is no middleware file')
        }

        // 注册全局中间件
        try {
            require(`${app.businessPath}${sep}middleware.js`)(app)
        } catch (e) {
            console.log('[app:exception] there is no middleware file')
        }

        // 加载 routerLoader
        routerLoader(app)

        try {
            const port = process.env.PORT || 8081; // 将默认端口改为8081
            const host = process.env.IP || '0.0.0.0';
            console.log(`server run at ${port}`)
            app.listen(port, host)
        } catch (e) {
            console.error(e)
        }
        return app
    }
}

定义好之后在index页面进行引入,然后使用koa实例运行启动。

总结

elpis-Core 就是一个参考借鉴 Egg.js 实现的一个服务器内核引擎。在该项目中,实现了service(数据层),controller(数据处理层),router(接口注册),router-scheam(定义接口格式,参照RESTful风格),middleware(接口校验,检验接口完整性,api兜底报错,api必要参数校验,api签名校验),extend(包含日志服务和数据库连接)