一、Egg 簡(jiǎn)介
Egg.js 為企業(yè)級(jí)框架和應(yīng)用而生,我們希望由 Egg.js 孕育出更多上層框架,幫助開(kāi)發(fā)團(tuán)隊(duì)和開(kāi)發(fā)人員降低開(kāi)發(fā)和維護(hù)成本。
(感謝阿里?。?/strong>
如何評(píng)價(jià)阿里開(kāi)源的企業(yè)級(jí) Node.js 框架 EggJS?



二、Egg 初體驗(yàn)
我們推薦直接使用腳手架,只需幾條簡(jiǎn)單指令,即可快速生成項(xiàng)目:
$ mkdir egg-example && cd egg-example
$ npm init egg --type=simple
$ npm i
啟動(dòng)項(xiàng)目:
$ npm run dev
$ open localhost:7001
如果下載失敗,從這里克隆項(xiàng)目到本地
三、Egg VS Express/Koa
3.1 從 Express 到 Koa
Koa 默認(rèn)選擇了
async function作為異步編程模型-
Koa 的中間件和 Express 不同,Koa 選擇了洋蔥圈模型。所有的請(qǐng)求經(jīng)過(guò)一個(gè)中間件的時(shí)候都會(huì)執(zhí)行兩次,對(duì)比 Express 形式的中間件,Koa 的模型可以非常方便的實(shí)現(xiàn)后置處理邏輯
image.png 和 Express 只有 Request 和 Response 兩個(gè)對(duì)象不同,Koa 增加了一個(gè) Context 的對(duì)象,作為這次請(qǐng)求的上下文對(duì)象。我們可以將一次請(qǐng)求相關(guān)的上下文都掛載到這個(gè)對(duì)象上。相較于 request 和 response 而言更加符合語(yǔ)義。
同時(shí) Context 上也掛載了 Request 和 Response 兩個(gè)對(duì)象。和 Express 類(lèi)似,這兩個(gè)對(duì)象都提供了大量的便捷方法輔助開(kāi)發(fā),例如:
get request.query
get request.hostname
set response.body
set response.status
3.2 從 Koa 到 Egg
Koa 是一個(gè)非常優(yōu)秀的框架,然而對(duì)于企業(yè)級(jí)應(yīng)用來(lái)說(shuō),它還比較基礎(chǔ)。而 Egg 選擇了 Koa 作為其基礎(chǔ)框架,在它的模型基礎(chǔ)上,進(jìn)一步對(duì)它進(jìn)行了一些增強(qiáng)。
3.3 項(xiàng)目實(shí)例對(duì)比
- 安裝 Mysql
mysql -u root -p // 輸入安裝結(jié)束時(shí)設(shè)置的密碼,如111111
- 建立數(shù)據(jù)表
create database test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
use test;
create table todoList(
id int auto_increment primary key,
title char(30) not null
);
-
前端項(xiàng)目:
-
后端項(xiàng)目:
四、Egg 優(yōu)勢(shì)
1. 設(shè)計(jì)原則
Egg 奉行『約定優(yōu)于配置』,按照一套統(tǒng)一的約定進(jìn)行應(yīng)用開(kāi)發(fā),團(tuán)隊(duì)內(nèi)部采用這種方式可以減少開(kāi)發(fā)人員的學(xué)習(xí)成本,開(kāi)發(fā)人員不再是『釘子』,可以流動(dòng)起來(lái)。沒(méi)有約定的團(tuán)隊(duì),溝通成本是非常高的,比如有人會(huì)按目錄分棧而其他人按目錄分功能,開(kāi)發(fā)者認(rèn)知不一致很容易犯錯(cuò)。但約定不等于擴(kuò)展性差,相反 Egg 有很高的擴(kuò)展性,可以按照?qǐng)F(tuán)隊(duì)的約定定制框架。使用 Loader 可以讓框架根據(jù)不同環(huán)境定義默認(rèn)配置,還可以覆蓋 Egg 的默認(rèn)約定。
2. 特性
- 提供基于 Egg 定制上層框架的能力
- 高度可擴(kuò)展的插件機(jī)制
- 內(nèi)置多進(jìn)程管理
- 基于 Koa 開(kāi)發(fā),性能優(yōu)異
- 框架穩(wěn)定,測(cè)試覆蓋率高
- 漸進(jìn)式開(kāi)發(fā)
3. 漸進(jìn)式開(kāi)發(fā)(參考)
4. 應(yīng)用、插件和框架
從上面的使用場(chǎng)景可以看到應(yīng)用、插件和框架三者之間的關(guān)系。
我們?cè)趹?yīng)用中完成業(yè)務(wù),需要指定一個(gè)框架才能運(yùn)行起來(lái),當(dāng)需要某個(gè)特性場(chǎng)景的功能時(shí)可以配置插件(比如 MySQL)。
插件只完成特定功能,當(dāng)兩個(gè)獨(dú)立的功能有互相依賴(lài)時(shí),還是分開(kāi)兩個(gè)插件,但需要配置依賴(lài)。
框架是一個(gè)啟動(dòng)器(默認(rèn)就是 Egg),必須有它才能運(yùn)行起來(lái)??蚣苓€是一個(gè)封裝器,將插件的功能聚合起來(lái)統(tǒng)一提供,框架也可以配置插件。
在框架的基礎(chǔ)上還可以擴(kuò)展出新的框架,也就是說(shuō)框架是可以無(wú)限級(jí)繼承的,有點(diǎn)像類(lèi)的繼承。

五、插件、框架開(kāi)發(fā)實(shí)戰(zhàn)(待定)
To be continue...
