騰訊Now直播前端工程化的實踐之路前端
受訪嘉賓 | 程柳鋒
編輯 | Yonie
在百花齊放的前端圈,層出不窮的組件框架已讓前端開發者目不暇接,另外,再加上業務和開發團隊的不斷髮展,前端開發人員面臨的問題愈來愈多。日漸突出問題主要爲:如何高效的與團隊成員進行合做開發?項目愈來愈多,不一樣技術棧的項目如何統一維護?如何制定和踐行統一的開發規範?如何高效的部署和發佈產品?
這個時候 前端工程化 概念的出現,解決了上面讓開發者頭痛的問題。它旨在制訂規範化的前端工做流,並規範統一項目的模塊化開發和前端資源,讓代碼的維護和互相協做更加容易更加方便。同時,讓你們可以釋放生產力,提升開發效率,更好更快地完成團隊開發以及項目後期維護和擴展。
可是前端工程化具體是如何實踐的呢?帶着這樣的問題,咱們採訪了參加本次 ArchSummit 全球架構師峯會的騰訊 Now 直播產品 IVWEB 團隊社區、工程化的負責人——程柳鋒,程老師與咱們分享了騰訊 Now 直播在前端工程化上的具體實踐方案。如下是本次的採訪內容:
InfoQ:請您先作下自我介紹吧。
程柳鋒:我是程柳鋒,來自騰訊,前後參與騰訊 NOW 直播、NOW 語音交友、手 Q 羣視頻、羣送禮等與直播相關的的泛娛樂產品的開發。另外我仍是整個騰訊 IVWEB 團隊社區、工程化的負責人。現階段主要關注團隊的工程化建設,包括新技術的預研和落地,另外也積極探索行業前沿技術好比:WebAssembly、PWA 等。
InfoQ:一線開發人員參與前端項目過程當中須要關注哪些因素?
程柳鋒:在產品迭代過程當中,前端的定位每每是處於應用層,負責 UI 開發和用戶交互體驗的工做。你們平常開發時接觸的 To C 的產品居多,好比 BAT、美團、滴滴等大廠的產品。這類產品的量級比較大,基本上日均 DAU 能達到幾百、幾千萬,甚至過億。所以,這類產品對用戶體驗要求很是高,一個微小的 JS 腳本錯誤很容易引起血案。
以咱們團隊爲例,對於每一位開發者都有較高的專業能力要求,一般概括爲三個要素。按照重要性順序以下:小程序
最後是研發效率,就是如何在較短的時間內,快速地進行業務需求的開發和上線。
InfoQ:如今騰訊上線前端項目,或者說升級項目版本,大概須要多長時間呢?
程柳鋒:上線時間會根據具體的項目類型地變化而變化。咱們內部總體採用敏捷開發模式,一般一個項目從啓動到上線在 2~3 周,其中一週爲開發時間,一週爲測試上線的時間。
另外,對於重點攻堅項目咱們以前也有大膽的嘗試。舉個例子,在 2018 年年初時,直播領域裏的答題玩法特別火爆。各家直播平臺好比:花椒、映客、熊貓直播,包括騰訊、高德地圖、支付寶等都在作直播答題的應用。咱們當時作這種攻堅項目,第一個版本從產品方案設計到最後上線發佈僅僅花費兩週時間。相對來講時間仍是很是緊湊的,對一線開發人員做戰能力有着較高的要求。
InfoQ:前端工程化是您負責的重要工做之一,它都包括哪些內容呢?
程柳鋒:前端工程化是一個團隊的基礎設施之一,它更加偏向工程架構、研發流程相關的內容,主要有這樣幾個目的:前端工程化
隨着業務的快速發展,產品需求爆炸式增加,團隊成員不斷擴充,前端工程化的首要目的就是知足快速發展的業務須要。前端工程化須要標準化研發方式、研發流程(開發、測試、發佈、線上監控),讓你們從建立項目到最終項目上線、監控使用相同的開發習慣。這個是前端工程化的主要目的。瀏覽器
第二個目的,把團隊的經驗(好比作項目時踩的坑、通過試驗得以驗證的新特性等)沉澱到腳手架和開發套件中,使其餘同窗在開發新項目時能夠複用這些經驗。前端框架
1.業務場景的不斷的複雜,不少事情須要前端去承載。像 H五、跨端應用,以及如今 WebAssembly、PWA 等新技術,他們的出現都讓瀏覽器端能夠承載的事情更多了,不少業務邏輯由服務端、客戶端遷移到了前端。網絡
2.2009 年 Node.js 的興起給前端工程化提供了工具層面的支持,如今你們寫的構建工具、腳手架工具、代碼規範檢查,以及咱們作的 Pre Render,都是在 Node.js 的基礎之上作的。前端工程化的概念還須要經過工具來加以踐行和佐證,咱們經過 Node.js 編寫 CLI 或基於 nw.js/Electron 的 GUI 工具,在項目的建立階段,你們可使用統一的命令來建立項目、頁面或組件;在項目的開發階段,針對不一樣技術棧的項目可使用不一樣的開發套件進行本地開發、調試、和規範檢查。
InfoQ:從 2009 年到如今也有 10 年的時間了,你以爲如今前端工程化大概發展到什麼階段了?
程柳鋒:前端工程化的價和團隊規模成正相關的關係,團隊規模越大,工程化的價值就更高。能夠分爲幾個階段:架構
2.另外,Webpack 能夠作的事情有不少。整個社區的 Loader、插件十分豐富。好比 HappyPack,其多進程多實例打包方案能夠實現快速打包,相對 Fis3 來講,其打包效率是很是高的。包括如今 Webpack 官方也原生提供了 thread-loader,也能夠經過它進行多進程多實例的快速打包,從而讓打包時間獲得極大的優化。app
3.Webpack 和其餘構建工具的差異在於 Webpack 打包理念是革命性的。Webpack 把全部的資源都當作模塊(好比 JS、CSS 圖片、字體,或富媒體的文件等)。與其餘構建工具相比,Webpack 最顯著的特徵是它經過各類 loader 去處理模塊,這也是你們爲何一直叫 Webpack 模塊打包器的緣由。Grunt 和 Gulp 的構建過程都是以 Task Runner 的方式去作的。Gulp 是流式的構建,而 Grunt 每次的構建產物會存儲到本地的 tmp 目錄中,Gulp 是直接放到內存裏,構建的時候相對 Grunt 更快一點。
InfoQ:騰訊把構建工具從 Fis3 遷移到了 Webpack4?在切換的過程當中有沒有遇到什麼困難呢?又是怎麼解決的?
程柳鋒:咱們當時切換的時候確實遇到了不少困難。第一個困難是 Fis3 裏面支持了一些比較好的特性,而在 Webpack 卻沒有。這裏面也能夠舉一些咱們在實際遷移過程當中遇到的例子,好比說 Fis3 支持 inline 語法,能夠將 HTML 片斷引用到另一個 HTML 中,也能夠將一個圖片 inline 過來自動 Base64,還能夠合成雪碧圖,總的來講它能夠精細化的控制資源。但在 Webpack 中是不支持 inline 語法、雪碧圖的合成。咱們解決的方案是實現相關的 Loader,好比 inline Loader。對於雪碧圖的 sprites-loader,在項目遷移的過程當中咱們把 Fis3 的資源內聯語法 (?_inline) 和合成雪碧圖語法 (?_sprite) 作了下兼容,新舊項目中都支持了。
其次,Fis3 中支持資源引入時的絕對路徑寫法,在遷移至 Webpack4 的過程當中也須要對它作兼容支持。
還有一個比較大的差異就是打包方式的不一樣。用 Fis3 打包時是以 HTML 爲入口,但在 Webpack4 中是以 JS 爲入口,打包的入口發生了很大的變化。這時候,咱們也須要對以前的邏輯作些適配。
InfoQ:各個項目中使用的技術棧大不相同,這對項目組件化帶來了什麼樣的影響?
程柳鋒:這其實會帶來的一個最大的影響是,不一樣技術棧項目的組件沒法複用到另外一個項目。因此針對於組件化的複用,咱們也作了一些適配,固然,不是全部的組件都適配,咱們只是對基礎的組件作同構。上層的業務組件能夠複用同構好的基礎組件。同構相對來說比較難,但爲了以後維護的便利性也是值得的。最好仍是根據各自的技術棧實現不一樣的業務組件,並統一維護。
InfoQ:騰訊 NOW 直播產品在團隊工具鏈、規範等開發配套設施的建設過程當中遇到了哪些問題?
程柳鋒:這裏面咱們也是遇到了很多問題。我先從規範提及吧。咱們團隊成立之初,是從騰訊的 IMWEB 團隊孵化出來的,這時咱們的工具鏈大多延用他們的工具鏈。隨着這業務的快速發展,暴露出不少業務自身的痛點,原來的工具鏈沒法知足現有需求。爲了解決這個問題,咱們創建了新的工具鏈和規範。咱們首先創建了 Git 提交規範、Git 工做流規範、分支規範、README 規範、監控規範等。可是規範創建以後又面臨另外一個巨大挑戰:如何將這些規範落地實施呢?咱們在這方面作了不少嘗試:框架
另外在工具建設的落地方面,咱們會作不少工具平臺,好比監控平臺、移動測試代理、組件平臺等,但這些平臺怎麼落地?咱們也作了一些操做。以監控平臺爲例,咱們會把每一個業務對應的 JS 錯誤 ID、JS 報錯率統計出來,並作一下排名。對於排名靠後的項目,會把相關人員、業務的名單展現出來,並通知相關的技術負責人、業務老闆等。這個作法仍是比較好的,有利於你們及時發現問題和解決問題,同時也幫助整個團隊改進工具平臺。
InfoQ:在前端工程化的發展過程當中,騰訊 Now 直播產品經歷了怎樣的技術架構變化?
程柳鋒:一開始騰訊前端工程化的建設與其餘公司仍是有必定的差距,甚至說是落後的。最開始咱們團隊的前端工程化侷限於 Fis 構建的工程化。Fis 能夠很好支持本地開發,但不支持建立項目、單元測試、端對端測試、代碼檢查的工程化。因此咱們第一階段作的事情就是換掉 Fis,使用 Webpack 做爲咱們的構建工具。
以前,整個騰訊 CI 這塊的建設比較落後,CI 作得事情也比較有限。在作了腳手架和構建工具切換後,咱們團隊搭建了 Jenkins,以便於代碼的可持續集成。
搭建了 Jenkins 以後,接下來慢慢的遷移到整個公司,並接入了橘子 CI(Orange CI),藉助 Orange CI 把不少 CD 的事情也一塊兒作了。由於以前接入的 CI 還不完全,咱們 CI 完成以後,開發者仍然須要在平臺上面手動的點擊發布,預上線發佈仍是有不少的人工操做。但咱們 CI 完成以後,每次 CI 完成以後它會自動構建出一個包。less
若是是正常的 push,默認狀況下,構建出來的包會自動的部署到測試環境,完成測試環境的部署任務。
1.前端工程化能夠作不少事情,前面提到了有三個階段,那麼第四個階段就是中臺化,咱們能夠聯合多個部門共建前端工程化,讓它的生態和體系更加完善,從而有效的避免重複造輪子的事情,這是每一個公司將來都要重點實踐的事情。
2.前端技術發展異常活躍,新的技術和框架不斷的出現。對於新的技術方案,咱們要及時的把它們整合進來,並探索它們的工程化,好比說像小程序、Flutter、Serverless 等這些新技術的工程化方案。
3.咱們認爲前端工程化將來的定位將更加超前。新技術的預研有很大一部分是放在前端工程化中來作的。舉個例子,以前咱們的項目是 React 16.2.0 版本,這個版本咱們用了一年多,但隨着 React 框架不斷的發佈,當 React 發佈到 16.8.0 的時候,React 會帶來不少新特性,若是再用以前的 16.2.0 版本,開發者將沒法感知 React 的新特性。這時候,經過前端工程化的方式,能夠幫助你們快速的體驗新特性。另外,還包括一些技術方案的嘗試,好比像 WebAssembly、PWA 等,經過前端工程化的方式,可以更好的賦能咱們業務。