阿里egg.js初體驗(一)

egg.js是阿里推出的基於koa的node開發框架,今天抽空體驗了下,按官方教程作一個Hacker News。其實官方有腳手架提供,可是此次咱們不用。css

開始以前,咱們先看下KOA對於中間件的洋蔥模型,瞭解這個,對於咱們以後理解一個請求的執行路徑會頗有幫助。
68747470733a2f2f7261772e6769746875622e636f6d2f66656e676d6b322f6b6f612d67756964652f6d61737465722f6f6e696f6e2e706e67
好了,讓咱們開始咱們的egg之旅吧!html

1, 先初始化項目結構:node

$ mkdir egg-example
$ cd egg-example
$ npm init
$ npm i egg --save
$ npm i egg-bin --save-dev

2, 在package.json裏,添加以下命令:npm

"scripts": {
    "dev": "egg-bin dev"
  }

3, 開始編寫代碼,這以前,咱們應該對項目的目錄結構有個約定,官方的說明在這裏 https://eggjs.org/zh-cn/basic... 咱們到時候在回來講下這個目錄。json

4 咱們須要一個controller,一個router,一個config,內如以下安全

// app/controller/home.js
const Controller = require('egg').Controller;

class HomeController extends Controller {
  async index() {
    this.ctx.body = 'Hello world';
  }
}

module.exports = HomeController;

// app/router.js
module.exports = app => {
  const { router, controller } = app;
  router.get('/', controller.home.index);
};


// config/config.default.js
exports.keys = <此處改成你本身的 Cookie 安全字符串>;

此時,目錄結構以下:app

egg-example
├── app
│   ├── controller
│   │   └── home.js
│   └── router.js
├── config
│   └── config.default.js
└── package.json

好了,如今檢查下,運行 npm run dev,
http://127.0.0.1:7001/ 檢查下,一切ok框架

這裏有幾個地方要注意下koa

  1. Controller 有class和exports兩個寫法,那麼這兩個寫法有什麼區別呢?異步

    按照類的方式編寫Controller,不只可讓咱們更好的對 Controller層代碼進行抽象(例如將一些統一的處理抽象成一些私有方法),還能夠經過自定義Controller 基類的方式封裝應用中經常使用的方法。至於方法的方式,官方不推薦使用,只是爲了作兼容,其中,每個 Controller 都是一個 async function,它的入參爲請求的上下文 Context 對象的實例,經過它咱們能夠拿到框架封裝好的各類便捷屬性和方法
  2. config也有module.exports 和 exports兩種寫法,那麼這兩種寫法有什麼區別呢?

    module.exports是Module系統建立對象的語法,可是若是你但願你的
    module是一個類的實例,你能夠將實例賦予moduel.exports,如這時候
    module.exprots指向的就是一個A的實例了,能夠用如下方式調用A的方
    法 module.exports.xxx(),等價於 a.xxx()。可是若是隻是exports=
    new ClassA();這個只是簡單的將本模塊變量exports從新綁定了而已。注
    意,對module.exports的綁定不能是異步綁定或者回調中!
    
    能夠這樣理解,其餘模塊使用本模塊時,用的是module.exports指向的東
    西,而exports是模塊內部變量,外部模塊是沒法訪問的。
    module.exports和exports是兩個變量,只是一開始這兩個是指向同一個對
    象而已。能夠在模塊內部用exports做爲module.exports的快捷方式

如今,咱們看下官方的目錄結構規範:

egg-project
├── package.json
├── app.js (可選)
├── agent.js (可選)
├── 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

如上,由框架約定的目錄:
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。

(未完待續)

相關文章
相關標籤/搜索