egg.js 简单认识

809 阅读3分钟

这是我参与8月更文挑战的第31天,活动详情查看:8月更文挑战

为什么选择egg

  • 对于一个初学node的前端来说。我跟倾向于一个成熟而规范的东西。然后理解它。

egg.js 是什么

Egg.js 为企业级框架和应用而生,由阿里团队,基于koa 框架基础上开发的一套框架,koa 是有 express 框架的原班人马开发。 而 Egg 选择了 Koa 作为其基础框架,在它的模型基础上,进一步对它进行了一些增强。

Express 是 Node.js 社区广泛使用的框架,简单且扩展性强,非常适合做个人项目。但框架本身缺少约定,标准的 MVC 模型会有各种千奇百怪的写法。Egg 按照约定进行开发,奉行『约定优于配置』,团队协作成本低。

安装

推荐直接使用脚手架,只需几条简单指令,即可快速生成项目: eggjs.org/zh-cn/intro…


$ mkdir egg-example && cd egg-example
$ npm init egg --type=simple
$ npm i
启动项目:

$ npm run dev
$ open http://localhost:7001

npm

www.npmjs.com/package/egg…

$ npm i egg-init -g
$ egg-init -h

目录约定参看

eggjs.org/zh-cn/basic…

视频教程

www.bilibili.com/video/av383…

视频课件

  • pan.baidu.com/s/1a8-RY-aBm3YkH2ZqJKmztg
egg中的mvc /app
  • controoller 控制器 负责一些业务逻辑的处理
  • serviece 服务(模型)和数据打交道(查询数据库,请求数据)
  • view 视图 模版 页面的展示
egg中的中间件 middleware
  • middleware 中间件
extend 框架扩展
schedule 计划,定时任务

路由

得到get参数,和动态路由参数的配置方法

在app/controller中定义路由中间件,新建news.js,创建一个控制器和方法

动态路由参数获取 ctx.params 参数获取方法 ctx.query

'use strict';

const Controller = require('egg').Controller;

class NewsController extends Controller {
  async index() {
    const { ctx } = this;
    console.log(ctx.query); // 得到get传值
    ctx.body = ctx.query; // 修改返回数据
  }
  async list() {
    const { ctx } = this;
    console.log(ctx.params); // 得到动态路由传值
    ctx.body = ctx.params; // 修改返回数据
  }

}

module.exports = NewsController;

在router.js 中添加

'use strict';

/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {
  const { router, controller } = app;
  router.get('/', controller.home.index);
  router.get('/home', controller.home.myhome);
  router.get('/news', controller.news.index);
  router.get('/news/list:id', controller.news.list);
};
使用view 模版

这里我们使用egg-view-ejs 参看 www.npmjs.com/package/egg…

npm i egg-view-ejs --save

配置plugin

// {app_root}/config/plugin.js
exports.ejs = {
  enable: true,
  package: 'egg-view-ejs',
};

配置 view、

// {app_root}/config/config.default.js
exports.view = {
  mapping: {
    '.ejs': 'ejs',
  },
};

配置 view 后的代码是

/* eslint valid-jsdoc: "off" */

'use strict';

/**
 * @param {Egg.EggAppInfo} appInfo app info
 */
module.exports = appInfo => {
  /**
   * built-in config
   * @type {Egg.EggAppConfig}
   **/
  const config = exports = {};

  // use for cookie sign key, should change to your own and keep security
  config.keys = appInfo.name + '_1562745060241_7841';

  // add your middleware config here
  config.middleware = [];
  //修改开始,添加到这里
  config.view = {
    mapping: {
      '.html': 'ejs', // 配置使用ejs来解析html
    },
  };
  //修改结束
  // add your user config here
  const userConfig = {
    // myAppName: 'egg',
  };

  return {
    ...config,
    ...userConfig,
  };
};

然后就可以开始使用了,在app/view里面新建index.html

<body>
  <h3>接受到的字符串:<%=msg%></h3>
  <ul>
    <% for(var i = 0 ; i<list.length ; i++) {%>
    <li><%=list[i]%></li>
    <% } %>
  </ul>
</body>

控制器中指定解析的模版,通过 注意这里每一个函数都是async,而解析模版是一个异步的操作需要

使用 await ctx.render 解析模版

  async index() {
    const { ctx } = this;
    // 注意这里是 await 解析index模版
    const msg = '传入一个字符串';
    const list = [ 111, 222, 333 ];
    await ctx.render('index', {
      msg,
      list,
    });
  }
如何使用静态资源
  在app/public 下面images 下面直接 添加图片
  <img src="/public/images/1.jpg">
为什么要使用typings

www.jianshu.com/p/5447f65cd…

npm install typings --global //安装 如果使用ts 那么我们要用到typings这个文件

github.com/typings/typ…

blog.csdn.net/z_sherry/ar…

安装 mysql 的支持 参看

eggjs.org/zh-cn/tutor…