為何從eggjs升級到midwayjs的原因詳解
引言
今天突然發(fā)現(xiàn)園區(qū)的銀杏葉突然全黃了,想起來兩周前到臨安去玩的時候還是青黃交加的一片呢。雖然最近溫度似乎也沒怎么降,但從最近路邊的落葉上看,真的是深秋了,可能就再需要一場秋雨,杭州就要開始入冬了吧
最近筆者在維護一個舊的node項目,項目基于eggjs開發(fā)的,數(shù)據(jù)庫是mysql,緩存redis,消息中間件用的是rocketMQ。項目早期用的是js,在改造typescript的過程中,越來越感覺到eggjs對typescript兼容性不好,加上midwayjs的Ioc機制是開發(fā)中的一個爽點,還是決定暢通不如短痛,升級midwayjs
midwayjs簡介
先放官方文檔傳送門
Midway 是阿里巴巴 - 淘寶前端架構(gòu)團隊,基于漸進式理念研發(fā)的 Node.js 框架,通過自研的依賴注入容器,搭配各種上層模塊,組合出適用于不同場景的解決方案
先看看關(guān)鍵字,依賴注入,對于前端同學(xué)來說,這是個相對陌生的點。也難怪,日常開發(fā)中這些使用的確實不多,java同學(xué)會了解的相對多一點,畢竟IoC能力是Java Spring 體系中非常重要的核心,而這也是MidWay的核心競爭力了。另外Midway全量使用TypeScript,結(jié)合TS裝飾器,讓開發(fā)體驗有質(zhì)的提升。項目使用中類型推導(dǎo)很好用,這對日常維護能起到非常正面的作用??梢韵瓤匆粋€官方的簡單??
import { Provide, Inject, Get } from '@midwayjs/decorator'; // user.controller.ts @Provide() // 實際可省略 @Controller() export class UserController { @Inject() userService: UserService; @Get('/') async get() { const user = await this.userService.getUser(); console.log(user); // world } }
@Provide 的作用是告訴依賴注入容器,我需要被容器所加載。 @Inject 裝飾器告訴容器,我需要將某個實例注入到屬性上。
通過這兩個裝飾器的搭配,我們可以方便的在任意類中拿到實例對象,就像上面的 this.userService。
為什么不是nestjs
社區(qū)內(nèi)還有類似的nestjs框架,兩者都是走的IoC方式,兩者都是框架的封裝(midwayjs-->eggjs-->koajs,nestjs-->express.js,當(dāng)然midwayjs支持切換依賴的web框架),提供一些開發(fā)中過于模版化的能力,簡化日常開發(fā)中的配置復(fù)雜度,讓你更能專注于業(yè)務(wù),兩者并沒有什么本質(zhì)上的區(qū)別。midwayjs是阿里的團隊開源的,nestjs是國外Trilon團隊的,性能上沒有做對比,應(yīng)該也不會有太大的差異,沒必要太糾結(jié)具體去用哪個框架
所以筆者并不太在意到底用什么框架,但是團隊內(nèi)的同學(xué)更熟悉eggjs,eggjs到midwayjs的學(xué)習(xí)曲線相對平滑,而且midway的文檔更友好一些,基于后續(xù)維護成本的考慮,在體驗并沒有打折的情況下,就選定了midwayjs了
接下來先看看IoC機制,以及Typescript裝飾器是什么
IoC機制與裝飾器
IoC(Inversion of Control)即是“控制反轉(zhuǎn)”,這并非是一種技術(shù),是面向?qū)ο缶幊痰囊环N設(shè)計思想。在Java中,IoC意味著你將設(shè)計好的對象交給容器控制,而不是在對象內(nèi)直接控制,理論很抽象,看一下偽代碼
/***** 下面為 Midway 內(nèi)部代碼 *****/ const container = new MidwayContainer(); container.bind(UserController); container.bind(UserService);
在請求時,會動態(tài)實例化這些 Class,MidwayContainer就是依賴注入容器,midwayjs的依賴注入的實現(xiàn)是injection,社區(qū)還有一些其他的實現(xiàn)這里就不再贅述了
說到了IoC,然后不得不提的就是裝飾器,當(dāng)前裝飾器提案已經(jīng)進入到了Stage 3階段,在標(biāo)準(zhǔn)化上也算有些進展
裝飾器是一種特殊的聲明,可附加在類、方法、訪問器、屬性、參數(shù)聲明上。
裝飾器使用 @expression 的形式,其中 expression 必須能夠演算為在運行時調(diào)用的函數(shù),其中包括裝飾聲明信息。其本質(zhì)就是一個函數(shù),它能夠動態(tài)地修改被裝飾的類或類成員,在這些部分的值未定義時進行初始化,或在這里已有值時,在值實例化后執(zhí)行一些額外的代碼。比如:
// @Controller 裝飾器告訴框架,這是一個 Web 控制器類型的類,而 @Get 裝飾器告訴框架,被修飾的 home 方法,將被暴露為 / 這個路由,可以由 GET 請求來訪問。 import { Controller, Get } from '@midwayjs/decorator'; @Controller('/') export class HomeController { @Get('/') async home() { return "Hello Midwayjs!"; } }
本文是深入midwayjs的第一篇,簡單介紹一下IoC和裝飾器相關(guān)的知識,先挖個坑,后續(xù)做一些更深入的分享
總結(jié)
midwayjs對于typescript強支持,讓項目的可維護性提高了一個檔次,而且midwayjs在20年的時候就已經(jīng)升級了midway-serverless體系,其實已經(jīng)擁有了除了作為后端應(yīng)用之外的能力了。后續(xù)隨著項目的升級,筆者還會繼續(xù)去分享midwayjs背后一些深入的技術(shù)點,以及踩過的坑
參考資料
控制反轉(zhuǎn)(IOC)和依賴注入(DI)的關(guān)系
Decorate your code with TypeScript decorators
以上就是為何從eggjs升級到midwayjs的原因詳解的詳細(xì)內(nèi)容,更多關(guān)于eggjs升級midwayjs的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Express使用multer實現(xiàn)文件上傳的示例代碼
這篇文章主要介紹了Express 使用 multer 實現(xiàn)文件上傳的操作步驟,文中通過代碼示例和圖文結(jié)合的方式講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-03-03Nodejs-cluster模塊知識點總結(jié)及實例用法
在本篇文章里小編給大家整理的是一篇關(guān)于Nodejs-cluster模塊知識點總結(jié)及實例用法,有興趣的朋友們可以跟著學(xué)習(xí)下。2021-12-12NodeJS服務(wù)器實現(xiàn)gzip壓縮的示例代碼
這篇文章主要介紹了NodeJS服務(wù)器實現(xiàn)gzip壓縮的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10Node.js中使用計時器定時執(zhí)行函數(shù)詳解
這篇文章主要介紹了Node.js中使用計時器定時執(zhí)行函數(shù)詳解,本文使用了Node.js中的setTimeout和setInterval函數(shù),需要的朋友可以參考下2014-08-08