Egg 概述
Egg 为企业级框架和应用而生,希望由 Egg 孕育出更多上层框架,帮助开发团队和开发人员降低开发和维护成本;
Egg 奉行
约定优于配置
,按照一套统一的约定进行应用开发,团队内部采用这种方式可以减少开发人员的学习成本,开发人员不再是钉子
,可以流动起来;
- 没有约定的团队,沟通成本是非常高的,比如有人会按目录分栈而其他人按目录分功能,开发者认知不一致很容易犯错;
- 但约定不等于扩展性差,相反 Egg 有很高的扩展性,可以按照团队的约定定制框架;
- 使用 Loader 可以让框架根据不同环境定义默认配置,还可以覆盖 Egg 的默认约定;
工程对比
-
使用 基础库 的工程
-
使用 Egg 的工程
Egg 的特点
整合了后端技术,提供一站式开发体验
制定了一套规范,统一了开发模式
提供了各种插件,具备灵活的扩展能力
Convention Over Configuration 约定优于配置
内置多进程管理
使用 MVC 模式
Egg 应用场景
中间服务器
纯后端服务
Hello World
使用 Egg 搭建工程
-
方式1: 使用 egg 脚手架
-
方式2: 手动搭建
# 安装 egg 核心库 npm i egg # 安装 egg 命令行工具 npm i -D egg-bin
实现代码
-
目录结构:
root ├── app # 应用程序目录,几乎所有核心代码都在此目录 │ ├── controller # 控制器目录,每个控制器用于处理请求 │ │ └── home.js # 某个控制器 │ └── router.js # 路由设置,将请求路径、方法映射到控制器 ├── config # 配置目录 │ └── config.default.js # 默认配置 └── package.json
-
编写代码
jsjsjs// app/controller/home.js const Controller = require('egg').Controller; class HomeController extends Controller { async index() { this.ctx.body = 'Hello world'; } } module.exports = HomeController;
// app/router.js module.exports = app => { const { router, controller } = app; router.get('/', controller.home.index); };
// config/config.default.js exports.keys = <此处改为你自己的 Cookie 安全字符串>;
-
添加
npm scripts
到package.json
:{ "scripts": { "dev": "egg-bin dev" } }
运行
访问:http://localhost:7001
npm run dev
核心概念
约定
Egg 选择了 Koa 作为其基础框架,在它的模型基础上,进一步对它进行了一些增强;
Egg 中使用了很多约定,包括对文件夹的约定、对文件名的约定等等,这些约定的存在,减少了大量的配置;
运行流程
生成配置
:egg 会在启动时读取 config 文件夹中的配置,以及 app/router.js 中的路由信息,然后将最终的配置生成到 run 文>件夹中
启动 egg
:egg 会在内部创建 Koa 实例,并作出适当的初始化工作,然后监听 7001 端口(默认)
匹配路由
:egg 在内部使用了 @koa/router ,会根据路由表中请求的路径和方法,把请求交给指定的 action 进行处理
请求处理
:egg 遵循 MVC 模式,请求始终是交给Controller
中的Action
进行处理
- Controller 表现为一个类,继承自 egg 中的 Controller
- Action 表现为一个 Controller 中的实例方法,用于处理请求
Koa👉 手写 Koa
上一篇