🌟前言
哈喽小伙伴们,新的专栏 Node 已开启;这个专栏里边会收录一些Node的基础知识和项目实战;今天我们继续带大家了解Node的框架 Egg ;让我们一起来看看吧🤘
🌟Egg.js 是什么?
Egg-官方网址
Egg.js 是阿里开发团队基于 Node.js 和 Koa开发的的开源企业级框架,团队架构师和技术负责人可以基于 egg 孕育出适合自己团队的上层业务框架,帮助开发团队降低开发和维护成本。
Express 和 Koa 是 Node.js 社区广泛使用的框架,简单且扩展性强,非常适合做个人项目。但框架本身缺少约定,标准的 MVC 模型会有各种千奇百怪的写法。Egg 按照约定进行开发,奉行『约定优于配置』,团队协作成本低。
Egg.js 基于 ES6、ES7、Typescript及 Koa2 使得 Nodejs 具有更规范的开发模式、更低的学习成本、更优雅的代码、更少的开发成本、更少的维护成本。
🌟Egg.js 的特性:
1. 提供基于 Egg 定制上层框架的能力
2. 高度可扩展的插件机制
3. 内置多进程管理
4. 基于 Koa 开发,性能优异
5. 框架稳定,测试覆盖率高
6. 渐进式开发
🌟Egg.js 的历史?
2013 年蚂蚁的 chair 框架,可以视为 egg 的前身。
2015 年 11 月,在苏千的召集下,阿里各 BU 的前端骨干齐聚黄龙,闭门共建。 2016 年初,各 BU 的基础 web 框架完成升级,在同一套规范的基础上进行差异化定制。
2016 年中,广泛使用在绝大部分阿里的前端 Node.js 应用。
2016 年 09 月,在 JSConf China 2016 上亮相并宣布开源。
2017 年初,官网文档 egg - 为企业级框架和应用而生 亮相,并将在本月发布 egg@1.0版本。
2017 年 12 月左右 Egg 社区版 2.0 正式发布,性能提升 30%,基于 koa2 拥抱 Async
2018 年 7 月最新 egg 的版本是 2.2.1
经过几年的沉淀 Egg 已经非常成熟。
🌟Egg 继承于 Koa
Koa 是一个非常优秀的框架,然而对于企业级应用来说,它还比较基础。而 Egg 选择了 Koa 作为其基础框架,在它的模型基础上,进一步对它进行了一些增强。
Node.js 8 正式进入 LTS 后,async function 可以在 Node.js 中使用并且没有任何性能问题了,Egg 2.x 基于 Koa 2.x,框架底层以及所有内置插件都使用 async function 编写,并保持了对 Egg 1.x 以及 generator function 的完全兼容,应用层只需要升级到 Node.js 8 即可从 Egg 1.x 迁移到 Egg 2.x。
底层基于 Koa 2.x,异步解决方案基于 async function。
官方插件以及 Egg 核心使用 async function 编写。
建议业务层迁移到 async function 方案。
只支持 Node.js 8 及以上的版本。
🌟使用脚手架搭建项目环境
使用Eggjs开发项目,推荐直接使用脚手架,只需几条简单指令,即可快速生成用于生产的项目开发环境。通过快速选择适合对应业务模型的脚手架,快速启动Egg.js 项目的开发。
🌟环境准备
名称 | 说明 |
操作系统 | 支持 macOS,Linux,Windows |
运行环境 | Nodejs 建议选择 LTS 版本,Nodejs 最低要求 8.x。 |
🌟搭建项目环境方式
🌟无需安装egg脚手架初始化项目
直接使用脚手架,只需几条简单指令,即可快速生成项目(npm >=6.1.0): 无需安装egg脚手架,即可快速初始化,生成项目(npm >=6.1.0):
$ mkdir egg-example && cd egg-example $ npm init egg --type=simple $ npm i
启动项目:
$ npm run dev $ open http://localhost:7001
🌟安装egg脚手架初始化项目
使用NPM全局安装egg脚手架:
npm i egg-init -g
命令:
$ egg-init -h init egg project from boilerplate. Usage: egg-init [dir] --type=simple 选项: --type boilerplate type [字符串] --dir target directory [字符串] --force, -f force to override directory [布尔] --template local path to boilerplate [字符串] --package boilerplate package name [字符串] --registry, -r npm registry, support china/npm/custom, default to auto detect [字符串] --silent don't ask, just use default value [布尔] --version 显示版本号 [布尔] -h, --help 显示帮助信息 [布尔]
🌟快速初始化
egg-init 创建项目
$ egg-init egg-example --type=simple $ cd egg-example $ npm install
你可以使用骨架类型,像下面这样:
$ npm init egg --type=simple
骨架类型 | 说明 |
simple | 简单 egg 应用程序骨架 |
empty | 空的 egg 应用程序骨架 |
plugin | egg plugin 骨架 |
framework | egg framework 骨架 |
启动项目
$ npm run dev $ open http://localhost:7001
🌟启动项目
在本地开发时,使用 egg-bin dev 来启动服务。通过这种方式启动应用进行开发活动,当我们修改代码并保存后,应用会自动重启实时生效。
🌟npm命令
将egg-bin dev 添加 npm scripts 到 package.json:
{ "scripts": { "dev": "egg-bin dev" } }
这样我们就可以通过 npm run dev 命令启动应用。
🌟环境配置
本地启动的应用是以 env: local 启动的,读取的配置也是 config.default.js 和 config.local.js 合并的结果。
🌟指定端口
本地启动应用默认监听 7001 端口,可指定其他端口,例如:
{ "scripts": { "dev": "egg-bin dev --port 7001" } }
🌟目录结构
当我们使用脚手架(egg-init)创建出项目后,会生成项目目录结构,对于项目目录结构我们必须了解。
🌟目录约定规范
egg-project ├── app | ├── router.js │ ├── controller │ │ └── home.js │ ├── service (可选) │ │ └── user.js │ ├── middleware (可选) │ │ └── response_time.js │ ├── schedule (可选) │ │ └── my_task.js │ ├── public (可选) │ │ └── reset.css │ ├── view (可选) │ │ └── home.tpl │ └── extend (可选) │ ├── helper.js (可选) │ ├── request.js (可选) │ ├── response.js (可选) │ ├── context.js (可选) │ ├── application.js (可选) │ └── agent.js (可选) ├── config │ ├── plugin.js │ ├── config.default.js │ ├── config.prod.js │ ├── config.test.js (可选) │ ├── config.local.js (可选) │ └── config.unittest.js (可选) ├── test │ ├── middleware │ │ └── response_time.test.js │ └── controller │ └── home.test.js ├── package.json ├── app.js (可选) ├── agent.js (可选) └── README.md
框架约定的目录:
路径 |
描述 |
app/router.js |
用于配置 URL 路由规则,具体参见 Router。 |
app/controller/** |
用于解析用户的输入,处理后返回相应的结果,具体参见 Controller。 |
app/service/** |
用于编写业务逻辑层,可选,建议使用,具体参见 Service。 |
app/middleware/** |
用于编写中间件,可选,具体参见 Middleware。 |
app/public/** |
用于放置静态资源,可选,具体参见内置插件 egg-static。 |
app/extend/** |
用于框架的扩展,可选,具体参见框架扩展。 |
config/config.{env}.js |
用于编写配置文件,具体参见配置。 |
config/plugin.js |
用于配置需要加载的插件,具体参见插件。 |
test/** |
用于单元测试,具体参见单元测试。 |
app.js 和 agent.js |
用于自定义启动时的初始化工作,可选,具体参见启动自定义。关于agent.js的作用参见Agent机制。 |
由内置插件约定的目录:
路径 | 描述 |
app/public/** |
用于放置静态资源,可选,具体参见内置插件 egg-static。 |
app/schedule/** |
用于定时任务,可选,具体参见定时任务。 |
若需自定义自己的目录规范,参见 Loader API:
路径 | 描述 |
app/view/** |
用于放置模板文件,可选,由模板插件约定,具体参见模板渲染。 |
app/model/** |
用于放置领域模型,可选,由领域类相关插件约定,如 egg-sequelize |