为了选择合适的底层框架,小编整理了awesome-nodejs的仓库(每个分类按github star数排序),从Web框架部分可以看到非常丰富,那么我们如何选择。
awesome-nodejs地址: https://github.com/huaize2020/awesome-nodejs/blob/main/README-zh-CN.md
主流的Web框架选型主要分为两大流派,基于Express 和 基于Koa,他们都是由同一团队打造。Express和Koa在设计思路上的区别在于:
Express本身功能内置了很多中间件,集成度高,使用省心,上手即用;
Koa使用精简的内核,更轻量,使用需要使用者做技术选型按需搭建积木;
基于以上的设计思路上的差别,基于对灵活配置型的考虑,笔者选择了 基于Koa 的 流派。但他们都太底层,对于搭建企业级业务框架还需要做较多定制。
Egg.js是什么
基于上述的诉求,最后小编选择了Egg.js。
Egg.js地址:https://eggjs.org/zh-cn/
Egg.js是阿里开源的基于Koa2企业级Node.JS框架,其核心设计就是希望基于Egg.js孕育出更多上层框架。
引用官网的一句话
我们深知企业级应用在追求规范和共建的同时,还需要考虑如何平衡不同团队之间的差异,求同存异。所以我们没有选择社区常见框架的大集市模式(集成如数据库、模板引擎、前端框架等功能),而是专注于提供 Web 开发的核心功能和一套灵活可扩展的插件机制。「——官网」
定制目标
在开始定制业务框架前,我们先设定一下需要定制的目标。
扩展Controller,添加API成功/失败返回结果函数;
设置默认模板引擎为 pug;
扩展ctx,添加util, 将dayjs作为统一日期处理库;
编码
如果对Egg.js不太熟悉,建议可以先学习下Egg.js的基本使用。
框架初始化
通过以下命令,初始化项目。其中 –type=framework 表示框架骨架
villa-framework为框架名和项目文件夹名
$ npm init egg –type=framework villa-framework
以下是初始化出来的目录
villa-framework
├── app
│ ├── extend
│ └── service
├── config
│ ├── config.default.js
│ └── plugin.js
├── lib
│ └── framework.js
├── test
│ ├── fixtures
│ └── framework.test.js
├── README.md
├── index.js
└── package.json
其中app、config目录基本跟正常的Egg.js应用无差异,但增加了framework.js文件,对应用进行扩展。
// lib/framework.js
'use strict';
const path = require('path');
const egg = require('egg');
const EGG_PATH = Symbol.for('egg#eggPath');
class Application extends egg.Application {
get [EGG_PATH]() {
return path.dirname(__dirname);
}
}
class Agent extends egg.Agent {
get [EGG_PATH]() {
return path.dirname(__dirname);
}
}
module.exports = Object.assign(egg, {
Application,
Agent,
});
扩展Controller,添加成功失败返回结果处理函数
// 以下是Egg.js Controller使用的代码
const Controller = require('egg').Controller;
// 未来修改为
const Controller = require('villa-framework').Controller;
由上面源码我们知道,Controller来自egg对象,因此我们只需要替换为我们定义的Controller即可。