一、Egg.js 是什么?
由阿里巴巴团队开源的一套基于koa的应用框架,已经在集团内部服务了大量的nodejs系统。
Egg.js 为企业级框架和应用而生,我们希望由 Egg.js 孕育出更多上层框架,帮助开发团队和开发人员降低开发和维护成本。
1.设计原则
Egg 的插件机制有很高的可扩展性,一个插件只做一件事。
(比如Nunjucks模板封装成了egg-view-nunjucks、MySQL 数据库封装成了egg-mysql)。Egg 通过框架聚合这些插件,并根据自己的业务场景定制配置,这样应用的开发成本就变得很低。
Egg 奉行『约定优于配置』,按照一套统一的约定进行应用开发,团队内部采用这种方式可以减少开发人员的学习成本,开发人员不再是『钉子』,可以流动起来。
2.与express区别
Express 是 Node.js 社区广泛使用的框架,简单且扩展性强,非常适合做个人项目。但框架本身缺少约定,标准的 MVC 模型会有各种千奇百怪的写法。Egg 按照约定进行开发,奉行『约定优于配置』,团队协作成本低。
基于koa,不同于koa以middleware为主要生态,egg根据不同的业务需求和场景,加入了plugin,extends等这些功能,可以让开发者摆脱在使用middleware功能时无法控制使用顺序的被动状态,而且还可以增加一些请求无关的一些功能。
3.架构
app/router.js:用于配置 URL 路由规则
app/controller/**:用于解析用户的输入,处理后返回相应的结果
app/service/**:用于编写业务逻辑层,可选
app/middleware/**:用于编写中间件,可选
app/public/**:用于放置静态资源,可选
app/extend/**:用于框架的扩展,可选
config/config.{env}.js:用于编写配置文件
config/plugin.js:用于配置需要加载的插件
test/**:用于单元测试
二、快速入门
1.快速初始化
我们推荐直接使用脚手架,只需几条简单指令,即可快速生成项目(npm >=6.1.0):
$ npm init egg --type=simple
$ npm i
启动项目:
$ npm run dev
$ open http://localhost:7001
2.编写 Controller
如果你熟悉 Web 开发或 MVC,肯定猜到我们第一步需要编写的是 Controller 和 Router。
通过 Controller 和 Router 来实现路由的跳转和页面的显示
配置路由映射:
3.静态资源
Egg 内置了 static 插件,线上环境建议部署到 CDN,无需该插件。
static 插件默认映射 /public/* -> app/public/* 目录
此处,我们把静态资源都放到 app/public 目录即可
4.模板渲染
绝大多数情况,我们都需要读取数据后渲染模板,然后呈现给用户。故我们需要引入对应的模板引擎。框架并不强制你使用某种模板引擎,开发者可以引入不同的插件来实现差异化定制。
例如使用 Nunjucks 来渲染,需要先安装对应插件
开启插件
为列表页编写模板文件,一般放置在 app/view 目录下
添加相应的 Controller 和 Router
5.编写 service
在实际应用中,Controller 一般不会自己产出数据,也不会包含复杂的逻辑,复杂的过程应抽象为业务逻辑层 Service。添加一个 Service 抓取数据 ,如下:
然后稍微修改下之前的 Controller:
6.编写扩展
扩展内编写一些常用的函数,用于加快开发。
这里,使用 View 插件支持的 Helper 来实现:
7.编写 Middleware
8.单元测试
单元测试非常重要,框架也提供了 egg-bin 来帮开发者无痛的编写测试。
测试文件应该放在项目根目录下的 test 目录下,并以 test.js 为后缀名,即 {app_root}/test/**/*.test.js。
然后配置依赖和 npm scripts:
"scripts": {"test":"egg-bin test", }
$ npm i egg-mock --save-dev
执行测试:
$ npm test