Egg.js
简介
Egg.js 为企业级框架和应用而生,帮助开发团队和开发人员降低开发和维护成本。
专注于提供 Web 开发的核心功能和一套灵活可扩展的插件机制,不会做出技术选型,因为固定的技术选型会使框架的扩展性变差,无法满足各种定制需求。
Egg 的插件机制有很高的可扩展性,一个插件只做一件事,Egg 通过框架聚合这些插件,并根据自己的业务场景定制配置,这样应用的开发成本就变得很低。
Egg 奉行『约定优于配置』,按照一套统一的约定进行应用开发,Egg 有很高的扩展性,可以按照团队的约定定制框架。使用 Loader 可以让框架根据不同环境定义默认配置,还可以覆盖 Egg 的默认约定。
特性
- 提供基于 Egg 定制上层框架的能力
- 高度可扩展的插件机制
- 内置多进程管理
- 基于 Koa 开发,性能优异
- 框架稳定,测试覆盖率高
- 渐进式开发(根据设备的支持情况来提供更多功能,提供离线能力,推送通知,甚至原生应用的外观和速度,以及对资源进行本地缓存。)
Egg和koa
如上述,Koa 是一个非常优秀的框架,然而对于企业级应用来说,它还比较基础。
而 Egg 选择了 Koa 作为其基础框架,在它的模型基础上,进一步对它进行了一些增强。
- 在 Express 和 Koa 中,经常会引入许许多多的中间件来提供各种各样的功能,而 Egg 提供了一个更加强大的插件机制,让这些独立领域的功能模块可以更加容易编写。
- extend:扩展基础对象的上下文,提供各种工具类、属性。
- middleware:增加一个或多个中间件,提供请求的前置、后置处理逻辑。
- config:配置各个环境下插件自身的默认配置项。
- 一个独立领域下的插件实现,可以在代码维护性非常高的情况下实现非常完善的功能,而插件也支持配置各个环境下的默认(最佳)配置,让我们使用插件的时候几乎可以不需要修改配置项。
快速搭建环境
-
运行环境
- 建议选择Node.js稳定版本,最低要求 8.x
-
初始化项目
-
npm init egg --type=simple //--type=simple可以去掉然后自己配置 cd demo npm install
-
-
启动项目
-
npm run dev 浏览器打开:localhost:7001
-
注意:实际项目中,推荐使用脚手架直接初始化,所以这里不做手动初始化项目了。
-
如果了解java的可以看出eggjs的项目目录结构以及处理请求的模式和javaweb很像,controller,service,view;不陌生的是都是MVCde 开发模式,不同就是如何拿数据给请求者
-
项目目录
-
app文件夹: 项目开发文件,程序员主要操作的文件,项目的大部分代码都会写在这里。 config文件夹: 这个是整个项目的配置目录,项目和服务端的配置都在这里边进行设置。 logs文件夹: 日志文件夹,正常情况下不用修改和查看里边内容。 node_modules: 项目所需要的模块文件,这个前端应该都非常了解,不多作介绍。 run文件夹: 运行项目时,生成的配置文件,基本不修改里边的文件。 test文件夹: 测试使用的配合文件,这个在测试时会使用。 .autod.conf.js: egg.js自己生成的配置文件,不需要进行修改。 eslinttrc和eslintignore: 代码格式化的配置文件。 gitgnore: git设置忽略管理的配置文件。 package.json: 包管理和命令配置文件,这个文件经常进行配置。
-
app目录中
controller文件夹: 控制器,渲染和简单的业务逻辑都会写道这个文件里。配置路由时也会用到(路由配置需要的文件都要写在控制器里)。 public文件夹: 公用文件夹,把一些公用资源都放在这个文件夹下。 router.js: 项目的路由配置文件,当用户访问服务的时候,在没有中间件的情况下,会先访问router.js文件。 service文件夹: 这个是当我们的业务逻辑比较复杂或和数据库打交道时,会把业务逻辑放到这个文件中。 view文件夹: 模板文件夹,相当于表现层的专属文件夹,这个项目,我们使用接口的形式,所以不需要建立view文件夹。 extend文件: 当我们需要写一些模板中使用的扩展方法时,我们会放到这个文件夹里。 middleware: 中间件文件夹,用来写中间件的,比如最常用的路由首位。
-
扩展插件
在基于 Egg 的框架或者应用中,我们可以通过定义 app/extend/{application,context,request,response}.js
这里表示可以创建application,context,request,response四个js文件
来扩展 Koa 中对应的四个对象的原型,通过这个功能,我们可以快速的增加更多的辅助方法,例如我们在 app/extend/context.js
中写入下列代码:
// ./app/extend/context.j