Egg 10000 Star + 2 years ✨✨✨
『大吉大利,明早吃蛋。』
底部有文化衫活動邀您參加。
2016 年 9 月,我們在 JSConf China 2016 上宣佈了 Egg 開源,至今整整 2 年了。
在Egg 2.0 釋出通告 提到,核心程式碼已經很穩定,後續重心主要在 開發者體驗方面的優化。
Egg 是阿里 Node.js 的核心基礎框架,面向『企業級的 Web 基礎框架』這個領域,提供了「微核心 + 外掛機制 + 框架定製能力」,完美達成生態共建和差異化定製的平衡點。
既適合個人小專案快速開發,也適合團隊架構師基於自身的技術架構在 Egg 基礎上擴展出適合特定團隊業務場景的框架。
它沉澱自阿里在各行各業不同領域的大規模工程實踐經驗,穩定支撐了多年天貓雙11大促,頂級流量壓力。
接下來跟大家分享下,過去 9 個月裡面,我們的一些產出和資料,本文較長,請慢慢品用:
- 開發者資料分享
- 文化衫活動邀請
- 開發者體驗優化
- TypeScript 的支援
- 新增「生命週期」
- Alinode 接入指南
- 和 Java 的互聯互通方案
- 實踐案例 - 用 Egg 重構的 cnode 社群
- 來自語雀團隊的 sequelize ORM 實踐分享
- 與 Webpack 等前端工程的實踐分享
- 錯誤處理和 opentracing 的 RFC
- egg-init 骨架重構方案
- 未來規劃
## 開發者資料

- 官網 PV 在 1.2w 左右。
- npm egg 模組數 1006 個,GitHub 依賴庫 3738 個。
- 一千多個 Pull Request,2200 個 Issue,130 多位 Contributors 。
- 共釋出了 81 個版本, ofollow,noindex">Release Note 。
- 社群實踐專案: cnodejs/egg-cnode , eggjs/awesome-egg
- 知乎專欄 Node.js 一共釋出了 48 篇文章,7600 訂閱,閱讀資料未知(知乎創作者中心看不上咱,不給內測資格 :sob:)。
正在使用 Egg 的公司,不完全統計:
順便分享一個 cnpm 的統計資料:


## 文化衫活動
歡迎大家訪問以下連結,分享你們的實踐經驗, 有機會獲得 Egg 文化衫和相關周邊喔~
另外,第 10000 Star 的同學是 @zhyjor ,請聯絡我們。
2018 年 EggJS 怎麼樣了?對它的看法有什麼變化?
## 開發者體驗優化
接下來跟大家分享下這段時間來,我們在『開發者體驗』方面做的一些優化。
### TypeScript
這幾年來 TypeScript 很受歡迎,它的靜態型別檢查,智慧提示,IDE 友好性等特性,對於大規模企業級應用,是非常的有價值的,被視為是企業級 JS 開發的未來之一。
阿里內部實踐 TS 也蠻久了,在 5 個月前,也把我們的其中一部分成熟的實踐,分享出來:
天豬:當 Egg 遇到 TypeScript,收穫茶葉蛋一枚非常感謝@吖猩 在這領域的持續貢獻:
這塊目前還在持續優化中,有興趣的同學可以參與以下幾項優化:
- egg-ts-helper 增加對 js 的支援,這樣非 ts 的同學,也能享受到智慧提示和靜態檢查的 Buffer 加成。
- 完善外掛自帶的 d.ts 方便其他開發者。
- 分享你的上層封裝,如通過裝飾器來註冊路由或 AOP。(內部有不少實踐,但還未達成共識)
PS: Egg.js 本身不會使用 TypeScript 重寫,對於框架本身而言,JS 的靈活性可以讓它更容易實現一些特性,同時它也並沒有那麼複雜的業務邏輯,TypeScript 並無法給框架研發帶來更多的幫助。
### 生命週期
之前 Egg 提供給開發者在啟動期的鉤子不多,只有 beforeStart 幾個。
感謝 killagu 同學給我們補充了更細緻的生命週期,相關的 RFC 和文件如下:
- [RFC] egg-core 增加應用啟動階段 · Issue #2520
- Egg 文件 - 生命週期 (目前文件還有較大的優化空間,我們將在後續繼續完善。)
// app.js class AppBootHook { configDidLoad() { // Config, Plugin files have did load. } async didLoad() { // All files have did load, start plugin here. } async willReady() { // All plugins have started, can do some thing before app ready. } async didReady() { // Worker is ready, can do some things don't need to block the app boot. } async serverDidReady() { // Server is listening. } async beforeClose() { // Do some thing before app close. } }
### Alinode
Node 發展到今天,已經被越來越廣泛地應用到前後端分離、全棧開發、客戶端工具等領域。
然而,相對於應用層的蓬勃發展,其 Runtime 對於絕大部分前端出身的開發者來說,處於黑盒的狀態,這一點並沒有得到很好的改善,從而也阻礙了 Node.js 在業務中的應用和推廣。
作為一個 Node 開發者,最頭痛的事莫過於莫名其妙的 CPU 100% 和記憶體洩露導致的 OOM。
所幸的是,阿里雲@樸靈 團隊 的 Node.js 效能平臺 為 Node 開發者提供了: 效能監控、安全提醒、故障排查、效能優化
等服務的整體性解決方案,提供完善的工具鏈和服務,協助開發者快速發現和定位線上問題。這些年來,為我們解決了非常多的線上問題,為業務保駕護航。
相關分享:
當然,在日常的答疑中,很多同學也表達了對資料安全方面的擔憂。從我個人的角度來看,Alinode 的採集指令碼,都是開源了,不會採集隱私資料。實在不行,在壓測期接入用用也行,絕對可以讓我們少掉一點頭髮,良心推薦。
### 和 Java 互聯互通的方案
Node.js 在螞蟻和阿里已經發展了四、五年時間,從最開始「前端工程師的玩具」,到 Web、BFF 場景的破局,逐步走到線上甚至是一些核心業務,非常不容易。
回頭想想 Nodejs 為什麼能活下來?依靠的絕不僅僅是:非阻塞I/O、事件驅動、輕量這些官方宣傳的特性, 我們認為更重要一點是我們打通了和 Java 的橋樑,實現了互聯互通,這才讓它真正融入阿里的技術體系。
伴隨 螞蟻 SOFA Java 技術棧 的開源,我們也開源了 Nodejs RPC 相關模組,希望能填補 Nodejs 社群這塊的空白,也將我們幾年來在 Nodejs 基礎技術的一些經驗做個總結和分享。
推薦閱讀小丸子姐姐的相關科普文章:
### egg-cnode
樸老師發起的 cnodejs/egg-cnode 專案,用 Egg 重寫了 cnode 社群應用。
目前完成了功能層面的重構以及測試用例的補全:
- 檔案數減少 41,減少 22%
- 程式碼行數減少 2460 行,減少 4.7%
- 測試程式碼減少 980 行,減少 39%,覆蓋率高於原專案。
目前還有較大的優化空間,因為第一階段專注於功能遷移,不做大的優化,有些使用方式不符合 Egg 的最佳實踐,歡迎有興趣的同學加入一起完善。
### 值得關注的 RFC 和分享
在 eggjs 團隊的日常協作中,遵循「基於 GitLab 的硬碟式非同步協作模式」。
通過 issue 發起 RFC 提案 -> 討論定稿-> 提交 Pull Request -> Code Review -> 釋出。
這樣便於沉澱,即使是當時沒有參與討論的開發者,事後也能通過 issue 瞭解某個功能設計的前因後果。
Θ 來自 語雀團隊 的 ORM 實踐分享
- 語雀是基於 Egg 技術棧研發的,算是為數不多的涉及到各個技術點的 Node 大應用。
- Egg 文件 - Sequelize
Θ 與 Webpack 等前端工程的實踐分享
- Egg 文件 - Assets 靜態資源
- 來自easywebpack 的實踐
- 上層同構框架: alibaba/beidou 和Serlina
Θ 錯誤處理 && 問題跟蹤
- [RFC] egg-opentracing · Issue #39
- [RFC] 應用自定義 4xx 和 5xx 的方案 · Issue #1086
- [RFC] 統計 egg 載入過程的各步驟的耗時 · Issue #1898
- handle unconsume multipart request data in egg itself. · Issue #2897
Θ 工具優化
目前的 egg-init 存在以下問題:
egg-init egg-init add controller Test
因此提出了 『 [RFC] egg-init refactor 』,應該下個月可以完工並分享給大家。
Θ 科普文
提到 Egg 值得自豪的應該是我們的文件吧,我們深知前端開發者在後端知識面還有很多需要科普的,也很樂意分享我們的實踐:
pockry:專訪死馬:為什麼說Egg.js是企業級Node框架## 未來規劃
老實說沒有太多新特性,還是那個原因:Egg 採用的是 『微核心 + 外掛 + 上層框架』 模式。
Egg 自身的迭代採取外掛化的開發機制,功能分散在不同的模組中,可能開發者在使用時感知不到它的版本變更,但其實它一直都在進化。每週都可能有新的特性和 BugFix 釋出,Egg 更像是一個『改良派』而不是『改革派』,它會在相容的前提下不斷進化。
接下來的規劃,還將繼續放在 『 開發者體驗優化 + 實踐經驗分享』 方面。
- egg cli 工具鏈和骨架的重構優化。
- TypeScript 的繼續優化,以及增加對 js 專案智慧提示方面的支援。
- 更多的實踐專案和科普分享。
- 國際化。
僅憑我們自己的精力是遠遠不夠的,歡迎社群的大家一起加入,共同推動 Node 的發展。
## 寫在最後
如果你喜歡 Egg,請支援我們:
- 分享本文,為我們點贊。
- 來分享下你們的實踐,無論大小,這很重要,謝謝,將有機會獲得我們的文化衫。