本文原創:zhangwei前端
在前言中,首先想提出這樣三個問題:web
1.前端開發者學習Node開發的意義?express
2.Node開發能夠幫助咱們解決哪些問題?後端
3.什麼是Koa框架?數組
近些年,隨着前端領域涉及的範圍愈來愈廣,前端開發者關注的事情也愈來愈多。以前大多數人對於前端的定義是負責頁面展現,並不須要去關心數據。但隨着業務的發展,更多的前端開發者開始關注接口的定義、先後端的交互以及數據結構的設計與實現。Node相對於傳統的C、C++、Python、Java等語言更容易上手,其語法特性也容易被前端開發者所接受,由於Node應該是前端學習的首選。學習Node能夠定義更清晰的架構,幫助前端擴展業務範圍,也意味着更多的可能性。promise
如今先後端的定義愈發模糊,在許多公司的中大型項目中,架構已經由傳統的先後雙層結構發展爲前中後三層結構。與此同時前端開發者最爲清楚本身須要哪些數據結構,因此將數據結構的定義交給前端開發者是比較好的作法。此外還能夠將後端中和客戶端更爲緊密的部分抽離出來,造成中間件,好比服務端渲染、數據聚合、接口轉發等等。markdown
Koa框架是一個基於Node實現的web框架。數據結構
對比於Express框架,丟棄了回調函數,並有效地加強了異常處理。架構
丟棄回調函數是由於Koa使用Promise配合Async函數實現異步,解決了Node回調地獄的問題。 Express框架實現錯誤處理是經過錯誤處理中間件,這樣把錯誤一層一層拋出來,交由錯誤處理中間件處理;而到了Koa則是經過全局錯誤事件監聽,這樣把錯誤處理寫在最外層便可。app
Koa框架的發展:
Express => Koa => Koa2(Koa框架的發展史本質上是Node的web框架的發展史)
其實質上是中間件實現方式上的變動:
線性結構=>generator+co庫=>Promise+Async
Express實現的原理是對Node.js的http進行了封裝。
缺點:Express基於的是ES5語法,所以要實現異步代碼,只有一個方法就是回調。當嵌套層次較多的時候,就會出現咱們比較熟悉的回調地獄的問題。
Koa1.0是基於Es6的generator重寫的一個web框架。
Koa2.0在Koa1.0的基礎上,使用了Es6語法進行了重構,使用Promise配合Async實現異步。
Express線性模型中間件是經過堆棧實現的。
與中間件有關的部分:
router文件夾處理的是路由的邏輯。
pplication.js掛載了全部的核心方法。
express.js繼承application.js並對外暴露接口。
其中application.js包含了兩個比較重要的方法,proto.use和proto.handle兩個方法。
proto.use將咱們須要掛載的中間件存儲到自身的stack屬性上。
proto.handle的核心思想是經過對於next方法的遞歸調用,對stack中的中間件取出執行。
當有異步代碼時,將會跳過異步代碼(next)執行,須要等待當前隊列中的事件所有執行完畢,所以代碼的輸出是線性的。
Koa的中間件實現方式上與Express不一樣,Express選擇了線性模型,Koa選擇了洋蔥圈模型。
洋蔥圈模型特色:全部的請求通過一箇中間件的時候都會執行兩次;很是方便的實現後置處理邏輯。
Koa與Express相比在中間件實現方式上最大的不一樣是use方法的不一樣。
在Koa的use函數內,中間件入棧,在compose函數中對中間件數組進行遞歸調用,返回一個promise鏈。整個過程的核心就是調用compose函數,將中間件函數數組轉化爲compose函數const fn = compose(this.middlewaire);而後調用fn,就會依次執行全部的中間件函數;並且上下文ctx也會貫穿全部的中間件函數。
一句話歸納學習Node開發對於一個前端開發者的意義:短時間小收益,中期高收益,長期必然趨勢。咱們能夠有更豐富的手段去進行業務上的改進,也能夠對先後端交互有更爲深入的認識。而Koa框架對比Express,不管從結構上仍是語法上都更爲適合之後前端的發展,因此更爲推薦採用Koa框架去進行前端擴展的開發。