提醒你們:注意文章的時效性,畢竟不一樣的時間節點,框架成熟度不一樣。分享這篇文章主要是但願可以讓你們認清框架的定位和應對的業務場景,框架沒有好壞之分,只有是否適合本身。html
原標題:關於nodejs-web框架的調研java
做者:xingyuzhenode
日期: Feb 25, 2018git
原文: github.com/xingyuzhe/b…github
如下內容實際上是補漏, 算是對1月份一點工做的總結。web
加入了新團隊, 初次接觸, 粗略的查看了一些項目(nodejs server端), 發現存在幾個問題:redis
對於新成立的團隊,存在以上問題能夠理解, 本次是討論和解決第一個問題。typescript
對於集團範圍內而言,同種技術存在多種不一樣規範和框架很正常, 可是對於一個幾十人的團隊而言, 資源有限,仍是集中力量統一一下效率高些, 有鑑於此, 以爲作一個種子項目比較合適: 一個企業定製框架, 共同維護, 同步更新, 信息共享和沉澱最佳實踐。express
跟領導聊了一下, 總結了一下當前狀態團隊對於這塊內容的一些主觀訴求:npm
根據上面的要求, 篩選出了eggjs和nestjs2個web框架, 其中nestjs是團隊一部分同窗比較喜歡和嘗試使用了的。
首先從外層信息作些調查。
我通讀了eggjs和nestjs的文檔,查閱了一些資料, 簡單對好比下:
-- | eggjs | nestjs |
---|---|---|
github stars | 7014 | 4291 |
github forks | 720 | 250 |
gitHub dependents | 1591/305 | 0/0 |
npm search results | 565 | 53+ |
github contributors | 101 | 31 |
github core contributors | 4(10+) | 1(2+) |
github releases | 49 | 19 |
github issues | 86/1416 | 20/347 |
基礎框架依賴 | koa2 | express |
文檔 | 業界良心 | 通常 |
核心原理 | 載入-掛載 | 模塊容器-依賴注入(經過裝飾器和元數據實現) |
核心理念 | 微內核-插件機制 | 組件樹-裝飾器-流程控制 |
eggjs的特色和解決的主要問題:
nestjs的特色和解決的主要問題:
從上述狀況來看, 2個框架都在123這幾項作了工做, 完成了一個框架所應具有的基本訴求; 整體上看eggjs更加成熟和全面, 配套/生態相對完善的多, 低風險; nestjs則比較青澀和單一, 可是在組件樹、流程控制、錯誤層級處理上有本身的特點, 理念上更加OOP,學習並吸取這些理念是很可取的, 但暫時不建議在覈心產品線上投入使用。
詳細閱讀了核心相關代碼, 粗略閱讀了cluster等一些模塊和插件的代碼, 代碼讀起來整體比較流暢, 發現框架的核心實現很是簡單明瞭:
框架基礎依賴一個很是獨立的loader模塊, 功能就是加載代碼文件和掛載函數到指定對象。
框架自己核心類只有6個: koa自己的application, context, response, request, egg自身新增的controller, service 這2個類, 後續全部的掛載動做都在這幾個類上面進行
框架明確了app, framework, plugin3個概念, 依賴方式大概是這樣:
框架啓動的核心流程主要是這樣:
因爲eggjs本身實現了cluster, 自帶進程管理和進程間通訊功能, 因此egg自身部署時並不須要pm2這個工具, 官方文檔上也對此作了解釋。不過因爲這塊內容的引入(cluster還涉及到schedule、socket等功能),給框架自己帶來了大量額外的代碼和邏輯, 整體提高了框架的複雜度。
可是有些時候因爲某些緣由並不但願直接使用框架提供的cluster解決方案, 另外我查看了下pm2的API, 也是有進程間通訊的API的, 固然用起來可能沒有自定義實現時那樣自由, 也還沒有據說該API有被普遍使用過, 不過, cluster相關的內容可否做爲一個擴展包, 而不是強耦合進框架核心流程中? 這樣框架自己更加簡單純潔, 或者更容易被接受一些?
爲此嘗試抽離了eggjs的核心代碼, 目標是僅保留最最核心的代碼(移除cluster等周邊代碼), 具有egg的擴展機制和能正常直接使用eggjs的周邊插件, 結果最後只須要幾百行代碼, 不多幾個文件便可完成。後續在此基礎上整理了一個上層框架, 預想做爲業務項目的基礎框架使用,主要涉及如下一些方面:
以後花了點時間用這個上層框架開發了一個抽獎小項目, 開發體驗還算流暢, 雖然說是草量級項目, 不過也是五臟俱全, 做爲example還挺適合。
粗略查看了下nestjs的源碼, nestjs的核心其實就是一個IoC模塊管理容器的實現, 這塊內容的邏輯實現做者處理的仍是相對複雜的多, 這裏吐槽下做者的代碼組織方式和略顯隨意的註釋大量的接口引用和糟糕的歷史提交記錄...,真是額外提升了閱讀的難度. TypeScript的加持和做者本人的光環也不能阻擋這一點。言歸正傳, 這裏說下它的核心原理和流程。
要想理解nestjs的源碼先要理解和掌握如下知識:
這個IoC容器實現的核心流程是這樣: scanner掃描全部module並提取關係存入module->module存入 container-> injector建立實例(依賴注入)-> instanceLoader加載實例
咱們再拿nestjs實現上面eggjs版本lottery的例子, 大概是這樣:
結合源碼和實際開發體驗來講:
從整體上講, eggjs相對成熟, 更貼合實際開發需求。 nestjs的優點就是在一些細節上的約束和控制以及理念上的新穎(僅相對node-web框架而言), 可是這些並非核心訴求。
另外eggjs團隊作的工做內容相對於nestjs而言至關的多, 這些與人力、時間資源的投入是分不開的。
最後, 對於想要的新框架的處理結論已經有了:
1 社區模式(節省資源)
2 造輪子模式
3 所應具有的特性
補充: 隨着各類工具的發展, 加上eggjs使用也有一段時日,最初一些模糊的預感變得清晰: 1 egg內置cluster模式帶來的額外麻煩太多, 如今各類配套工具逐漸完善, 這個功能並無什麼用
2 egg模塊隔離度不夠但矛盾的是有時候又有限制, 簡單的說就是代碼組織模式上做爲框架不夠好, 須要自行定製上層規範; egg的是plugin模式, 相對於nest的component模式仍是不夠用;
3 egg的ts開發的流暢度差那麼一點
4 實際的項目, 須要各類配套設施、工具、系統的協做聯合,框架只是一個組成部分, 就應該只作它應該作的事就能夠了
各有優劣, 訴求不同, 選擇就不同: 1 eggjs: 短平快穩,上手極快, 文檔完善,配套齊全, 能極大縮短工期。 2 nestjs: 有點追求, 複雜度高的協做項目, 核心訴求是代碼組織模式的
以前egg很好的知足了咱們的訴求, 可是下一個項目, 會考慮使用nestjs或者自行開發框架(足夠閒的話)。
egg官方維護者atian25的評論:點擊詳見
atian25補充下幾點:
Cluster 裏面並無 schedule
Socket 那個是爲了實現高級的 IPC
Cluster 仍是很建議使用的,若是有什麼特殊的定製需求,何不如提下 RFC/ISSUE 你們討論下
egg-core + egg-cluster 才成爲 egg,你要是想定製,能夠相似 egg-core + my-cluster(雖然不建議)
框架複雜度其實反而是下降了,由於 PM2 的代碼比 egg-cluster 複雜多了
Egg 的定位是框架的框架,跟 thinkjs/sails/nest 這些是無法直接對比的,由於不是一個層面的概念。就像你只能對比 Express 和 Koa,而不能對比 nest 和 Koa,由於 nest 是在 Express 之上的封裝。
基於 Egg 封裝的針對某個領域的上層框架,才能對比。譬如徹底能夠用官方的 TS 方案,再封裝集成幾個裝飾器,成爲一個上層框架。就能夠拿來對比了。
關注公衆號,發現更多精彩