01-Egg-邂逅

187 阅读4分钟

1.含义

  • Express是基于ES5的web开发框架
  • Koa1.x是Express原班人马打造的基于ES6的web开发框架
  • Koa2.x是Express原班人马打造的基于ES7的web开发框架
  • Egg是阿里基于Koa的有约束规范企业级web开发框架
  • 三个框架之间的关系其实是一部编程界的进化论

2.什么是有约束和规范

和ESLint检查JS代码一样, 有一套标准, 必须严格遵守这套标准 ,否则就会报错

详情: eggjs.org/zh-cn/basic…

3.为什么选择Egg, 而不是Express或Koa

  • Express 和 Koa没有约束和规范, 会导致团队的沟通成本和项目的维护成本变高
  • EggJS有约束和规范, 会大大降低团队的沟通成本和项目的维护成本
  • 阿里内部大量企业级项目使用egg开发, 实践出真知
  • Node社区5位国人核心贡献者4人在阿里, 技术有保障
  • 阿里前端安全专家,负责 egg-security 等类库, 安全有保障

总结: 个人开发选Express/Koa,企业开发选Egg

4.基本使用

  • 手动安装手动配置

  • 利用egg脚手架工具安装使用(egg-init)

首先手动安装手动配置初步了解一下Egg

npm init --y
npm i egg --save
// egg模块就是egg.js的核心模块
npm i egg-bin --save-dev 
// egg-bin模块, 这个模块是用于快速启动项目, 用于本地开发调试的模块

然后在配置一下package.json中的脚本

"dev": "egg-bin dev"

下面我们就可以搭建一下egg的基本结构了

egg有自己的标准所以要文件名称一模一样才可以运行

首先建立一个app目录

app目录下有controller目录(表示存储模块文件),controller目录下的文件名称就不受限制了

那我们先编写一个home.js的文件

然后再建立一个public目录表示存储静态资源

然后再建立一个router.js的文件来对路由进行管理

注意我说的所有文件都是在app目录下的

然后和app同级下建立一个config目录

config目录下有一个config.default.js文件(表示默认配置)

效果图

废物不多说,直接上代码

exports.keys = 'sandy.*?'; // 用于生成客户端中保存的userId
// 在router.js中必须暴露出去一个方法, 这个方法接收一个参数, 这个参数就是服务端的实例对象
module.exports = app => {
  /*
  {
    env: 'local',
    name: 'egg-example',
    baseDir: 'C:\\Users\\Jonathan_Lee\\Desktop\\Node_Common\\egg-example',
    subdomainOffset: 2,
    config: '<egg config>',
    controller: '<egg controller>',
    httpclient: '<egg httpclient>',
    loggers: '<egg loggers>',
    middlewares: '<egg middlewares>',
    router: '<egg router>',
    serviceClasses: '<egg serviceClasses>'
  }
  * */
  // console.log(app);
  // 1.从服务端的实例对象中解构出处理路由的对象和处理控制器的对象
  const {router, controller} = app;
  // 2.利用处理路由的对象监听路由的请求
  //   由于EggJS是基于KOA的, 所以监听方式和KOA一样
  /*
  在EggJS中不用导入控制器, 只要拿到了从服务器实例中解构出来的控制器对象
  就相当于拿到了controller目录, 我们就可以通过点语法拿到这个目录中的文件
  只要拿到了controller目录中的文件, 我们就可以通过点语法拿到这个文件中的方法
  * */
  router.get('/', controller.home.index);
}
const Controller = require('egg').Controller;

class HomeController extends Controller {
  async index() {
    /*
    在EggJS中, EggJS会自动给控制器的this挂载一些属性
    this.ctx: 当前请求的上下文 Context 对象的实例,通过它我们可以拿到框架封装好的处理当前请求的各种便捷属性和方法。
    this.app: 当前应用 Application 对象的实例,通过它我们可以拿到框架提供的全局对象和方法。
    this.service:应用定义的 Service,通过它我们可以访问到抽象出的业务层,等价于 this.ctx.service 。
    this.config:应用运行时的配置项。
    this.logger:logger 对象,上面有四个方法(debug,info,warn,error),分别代表打印四个不同级别的日志,使用方法和效果与 context logger 中介绍的一样,但是通过这个 logger 对象记录的日志,在日志前面会加上打印该日志的文件路径,以便快速定位日志打印位置。
    * */
    this.ctx.body = '邂逅Egg';
  }
}

module.exports = HomeController;

效果图