為何從eggjs升級(jí)到midwayjs的原因詳解
引言
今天突然發(fā)現(xiàn)園區(qū)的銀杏葉突然全黃了,想起來(lái)兩周前到臨安去玩的時(shí)候還是青黃交加的一片呢。雖然最近溫度似乎也沒(méi)怎么降,但從最近路邊的落葉上看,真的是深秋了,可能就再需要一場(chǎng)秋雨,杭州就要開(kāi)始入冬了吧
最近筆者在維護(hù)一個(gè)舊的node項(xiàng)目,項(xiàng)目基于eggjs開(kāi)發(fā)的,數(shù)據(jù)庫(kù)是mysql,緩存redis,消息中間件用的是rocketMQ。項(xiàng)目早期用的是js,在改造typescript的過(guò)程中,越來(lái)越感覺(jué)到eggjs對(duì)typescript兼容性不好,加上midwayjs的Ioc機(jī)制是開(kāi)發(fā)中的一個(gè)爽點(diǎn),還是決定暢通不如短痛,升級(jí)midwayjs
midwayjs簡(jiǎn)介
先放官方文檔傳送門
Midway 是阿里巴巴 - 淘寶前端架構(gòu)團(tuán)隊(duì),基于漸進(jìn)式理念研發(fā)的 Node.js 框架,通過(guò)自研的依賴注入容器,搭配各種上層模塊,組合出適用于不同場(chǎng)景的解決方案
先看看關(guān)鍵字,依賴注入,對(duì)于前端同學(xué)來(lái)說(shuō),這是個(gè)相對(duì)陌生的點(diǎn)。也難怪,日常開(kāi)發(fā)中這些使用的確實(shí)不多,java同學(xué)會(huì)了解的相對(duì)多一點(diǎn),畢竟IoC能力是Java Spring 體系中非常重要的核心,而這也是MidWay的核心競(jìng)爭(zhēng)力了。另外Midway全量使用TypeScript,結(jié)合TS裝飾器,讓開(kāi)發(fā)體驗(yàn)有質(zhì)的提升。項(xiàng)目使用中類型推導(dǎo)很好用,這對(duì)日常維護(hù)能起到非常正面的作用??梢韵瓤匆粋€(gè)官方的簡(jiǎn)單??
import { Provide, Inject, Get } from '@midwayjs/decorator';
// user.controller.ts
@Provide() // 實(shí)際可省略
@Controller()
export class UserController {
@Inject()
userService: UserService;
@Get('/')
async get() {
const user = await this.userService.getUser();
console.log(user); // world
}
}
@Provide 的作用是告訴依賴注入容器,我需要被容器所加載。 @Inject 裝飾器告訴容器,我需要將某個(gè)實(shí)例注入到屬性上。

通過(guò)這兩個(gè)裝飾器的搭配,我們可以方便的在任意類中拿到實(shí)例對(duì)象,就像上面的 this.userService。
為什么不是nestjs
社區(qū)內(nèi)還有類似的nestjs框架,兩者都是走的IoC方式,兩者都是框架的封裝(midwayjs-->eggjs-->koajs,nestjs-->express.js,當(dāng)然midwayjs支持切換依賴的web框架),提供一些開(kāi)發(fā)中過(guò)于模版化的能力,簡(jiǎn)化日常開(kāi)發(fā)中的配置復(fù)雜度,讓你更能專注于業(yè)務(wù),兩者并沒(méi)有什么本質(zhì)上的區(qū)別。midwayjs是阿里的團(tuán)隊(duì)開(kāi)源的,nestjs是國(guó)外Trilon團(tuán)隊(duì)的,性能上沒(méi)有做對(duì)比,應(yīng)該也不會(huì)有太大的差異,沒(méi)必要太糾結(jié)具體去用哪個(gè)框架
所以筆者并不太在意到底用什么框架,但是團(tuán)隊(duì)內(nèi)的同學(xué)更熟悉eggjs,eggjs到midwayjs的學(xué)習(xí)曲線相對(duì)平滑,而且midway的文檔更友好一些,基于后續(xù)維護(hù)成本的考慮,在體驗(yàn)并沒(méi)有打折的情況下,就選定了midwayjs了
接下來(lái)先看看IoC機(jī)制,以及Typescript裝飾器是什么
IoC機(jī)制與裝飾器
IoC(Inversion of Control)即是“控制反轉(zhuǎn)”,這并非是一種技術(shù),是面向?qū)ο缶幊痰囊环N設(shè)計(jì)思想。在Java中,IoC意味著你將設(shè)計(jì)好的對(duì)象交給容器控制,而不是在對(duì)象內(nèi)直接控制,理論很抽象,看一下偽代碼
/***** 下面為 Midway 內(nèi)部代碼 *****/ const container = new MidwayContainer(); container.bind(UserController); container.bind(UserService);
在請(qǐng)求時(shí),會(huì)動(dòng)態(tài)實(shí)例化這些 Class,MidwayContainer就是依賴注入容器,midwayjs的依賴注入的實(shí)現(xiàn)是injection,社區(qū)還有一些其他的實(shí)現(xiàn)這里就不再贅述了
說(shuō)到了IoC,然后不得不提的就是裝飾器,當(dāng)前裝飾器提案已經(jīng)進(jìn)入到了Stage 3階段,在標(biāo)準(zhǔn)化上也算有些進(jìn)展
裝飾器是一種特殊的聲明,可附加在類、方法、訪問(wèn)器、屬性、參數(shù)聲明上。
裝飾器使用 @expression 的形式,其中 expression 必須能夠演算為在運(yùn)行時(shí)調(diào)用的函數(shù),其中包括裝飾聲明信息。其本質(zhì)就是一個(gè)函數(shù),它能夠動(dòng)態(tài)地修改被裝飾的類或類成員,在這些部分的值未定義時(shí)進(jìn)行初始化,或在這里已有值時(shí),在值實(shí)例化后執(zhí)行一些額外的代碼。比如:
// @Controller 裝飾器告訴框架,這是一個(gè) Web 控制器類型的類,而 @Get 裝飾器告訴框架,被修飾的 home 方法,將被暴露為 / 這個(gè)路由,可以由 GET 請(qǐng)求來(lái)訪問(wèn)。
import { Controller, Get } from '@midwayjs/decorator';
@Controller('/')
export class HomeController {
@Get('/')
async home() {
return "Hello Midwayjs!";
}
}
本文是深入midwayjs的第一篇,簡(jiǎn)單介紹一下IoC和裝飾器相關(guān)的知識(shí),先挖個(gè)坑,后續(xù)做一些更深入的分享
總結(jié)
midwayjs對(duì)于typescript強(qiáng)支持,讓項(xiàng)目的可維護(hù)性提高了一個(gè)檔次,而且midwayjs在20年的時(shí)候就已經(jīng)升級(jí)了midway-serverless體系,其實(shí)已經(jīng)擁有了除了作為后端應(yīng)用之外的能力了。后續(xù)隨著項(xiàng)目的升級(jí),筆者還會(huì)繼續(xù)去分享midwayjs背后一些深入的技術(shù)點(diǎn),以及踩過(guò)的坑
參考資料
控制反轉(zhuǎn)(IOC)和依賴注入(DI)的關(guān)系
Decorate your code with TypeScript decorators
以上就是為何從eggjs升級(jí)到midwayjs的原因詳解的詳細(xì)內(nèi)容,更多關(guān)于eggjs升級(jí)midwayjs的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
node.js支持多用戶web終端實(shí)現(xiàn)及安全方案
這篇文章主要介紹了node.js支持多用戶web終端實(shí)現(xiàn)方案以及web終端安全性保證的解決方法,一起學(xué)習(xí)參考下。2017-11-11
Node+Express+MongoDB實(shí)現(xiàn)登錄注冊(cè)功能實(shí)例
這篇文章主要介紹了Node+Express+MongoDB實(shí)現(xiàn)登錄注冊(cè)功能,需要的朋友可以參考下2017-04-04
Node.js中module.exports?和exports使用誤區(qū)
本文主要介紹了Node.js中module.exports?和exports使用誤區(qū),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
koa大型web項(xiàng)目中使用路由裝飾器的方法示例
這篇文章主要介紹了koa大型web項(xiàng)目中使用路由裝飾器的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
node.js解決全局安裝pnpm后無(wú)法使用的問(wèn)題
在全局安裝pnpm后,如果出現(xiàn)無(wú)法使用的問(wèn)題,一般是由于沒(méi)有添加系統(tǒng)變量導(dǎo)致的,本文就來(lái)介紹一下node.js解決全局安裝pnpm后無(wú)法使用的問(wèn)題,感興趣的可以了解一下2024-10-10
NPM 安裝cordova時(shí)警告:npm WARN deprecated minimatch@2.0.10: Pleas
這篇文章主要介紹了NPM 安裝cordova時(shí)警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to的相關(guān)資料,需要的朋友可以參考下2016-12-12

