做者:李剛鬆css
隨着前端技術的飛速發展,前端須要一種更加工程化的方式解決前端開發日益複雜的問題。前端工程化本質也是軟件工程的一種,因爲軟件工程並沒有嚴格的定義(或者說缺少統一的定義),所以前端工程化的內涵其實至關寬泛,通常來講,前端工程化重點關注的是研發和維護效率,全部最終目的是這個的,均可以算做前端工程化的範疇。 前端工程化近幾年也是技術熱點,基本上大型前端技術交流會議都有此專題,從規範、組件、編譯及構建、工做流、持續集成、監控等多個維度都有涉及,筆者嘗試從前端資源治理的角度談一下前端工程化,本文是系列文章的第一篇,主要講問題及解決的思路,不涉及具體的實現細節。html
首先,這裏所說的前端資源,並不是是僅指js、css、圖片等靜態資源,頁面、後端接口、配置數據、監控點等,均可以歸入前端資源的定義的範疇。前端
在工做中,你是否會碰到如下問題:webpack
上面的問題通常是大型複雜業務場景(一般是多個團隊合做開發,業務複雜,頁面成百上千甚至上萬)下才有的,若是你所在的團隊也有上面的問題,那麼我認爲你也須要對前端的資源進行治理。nginx
那麼什麼是前端資源治理呢?筆者對其的定義是:git
將前端相關的頁面、js/css/圖片/字體、接口、配置、監控點等的依賴關係進行收集、存儲和管理,並將割裂的組件系統、配置系統、監控系統、業務系統等進行重構和整合,最終造成以頁面管理爲基礎的統一的有序的平臺,全部關聯信息都可以被查詢和檢索,最終實現總體協做效率的提高。web
此處使用「治理」而不是「管理」的緣由,「治理」一詞更強調合做整改的過程。在不少互聯網企業,一般已經有一些獨立的組件系統、配置系統、監控系統等,可是這些系統不少都是獨立的碎片化的系統,彼此都是割裂的,割裂意味着缺少協同,進而影響研發效率。所以,前端資源治理的一個關鍵詞是「整合」,整合已有的系統。npm
第二個關鍵詞是「關聯關係管理」,前端相關的頁面、組件、js/css/圖片/字體、接口、配置、監控點及負責人等,他們是存在關聯關係的,好比頁面是誰負責的、誰修改的、引用了哪些組件、圖片、字體、接口、在什麼地方配置數據、監控點都有哪些等,咱們須要把這些關聯關係在管理端記錄下來,並提供檢索和查詢。json
前端資源信息看似繁雜,js、css、圖片、頁面、後端接口、配置數據、監控點等,可是他們有一個串聯的錨點,這個錨點就是頁面,不論是H五、小程序,仍是原生APP,不論是從研發的角度,仍是從反饋問題的角度,基本上都是以頁面爲單位進行的,其餘的如組件、CSS、圖片、接口、配置等,都是被頁面引用的,均可以經過頁面串聯起來的,下圖能夠清晰的表達出這些依賴關係。gulp
所以,實現前端資源治理的第一個要點是作好頁面管理,把頁面自身的信息,如頁面名稱、頁面地址、負責人、修改時間等信息進行提取、存儲,使之可以被查詢和檢索。在頁面管理基礎之上,咱們還要把js、css、圖片、頁面、後端接口、配置數據、監控點等各個前端資源之間的關聯關係也要存儲和管理起來,使之可以被查詢和檢索。
關聯關係歷來源上講,主要有如下幾種來源:
前端資源治理的第一要點是頁面信息管理,所以必須可以拿到頁面基本信息。頁面基本信息應該包括哪些呢?一般來講,至少應該包括頁面URL、頁面名稱、頁面建立人、建立時間等幾個字段。
當前的前端頁面開發,不論是H五、小程序,仍是原生APP,一般會通過編譯構建的過程(一般是命令行工具或者IDE,好比基於gulp和webpack的工做流工具),在構建完成階段能夠提取出頁面的基本信息。如下是編譯構建提取頁面信息的流程:
頁面的編譯構建流程,通常分爲兩種:
對於上面的狀況,咱們能夠考慮定一個規則,好比取最近的5條log,並移除持續集成系統生成的log,管理端存儲的時候回,以用戶名+時間爲key,去掉重複的部分。
構建流程分析出頁面基本信息後,需提交到管理端保存,因此管理端須要提供post接口。管理端以此爲基礎,造成」頁面管理系統「。
構建流程除能夠分析基本信息外,還能夠分析出頁面的版本信息,好比頁面依賴的組件依賴表、靜態資源依賴表(js/css/圖片)、接口依賴表、修改人、修改時間等。 靜態依賴分析一般有3種方式:
在不少互聯網企業,一般已經有一些獨立的成熟的CMS系統(如給運營用的內容配置系統,配置活動時間、商品ID等)、監控系統(如測速系統、業務監控系統、異常監控系統)等,一般這些系統由不一樣的團隊開發,並且常常都有一個叫作"頁面管理"的東西,且要手工配置頁面地址。這些系統中的監控點配置、運營配置等信息,都是以頁面維度進行建立和使用的,可是這些信息很難經過對前端代碼靜態分析的方法進行提取(好比運營配置信息,這個能夠是前端直接使用,也多是後端使用,要分析的話兩端代碼都要分析,比較麻煩)。咱們的思路應該是在管理端經過頁面管理來進行關聯,實質上是要作系統整合。
整合的思路也比較簡單,就是原來各個系統廢棄掉原來自身的」頁面管理「,而是使用前面靜態分析提取到的統一的頁面管理,監控系統、運營配置系統等系統均可以以此爲入口進入,從而把頁面相關的各個管理系統關聯起來,進而把各類能力串聯。
對於大型應用來講,通常都有一些業務統計數據,最典型的就是點擊流數據了。這種數據既不在代碼中,也不在管理端配置,並且經過統計和分析才能拿到。前面提到的「某個限時的頁面已經到點下線,可是仍然有流量,不知道流量入口在哪裏」這種問題的解決,其實依賴於點擊流的統計分析數據了,點擊流系統通常都有「來源分析」,這種數據也不是敏感數據,因此能夠考慮跟頁面管理作關聯和整合,或者提供API給頁面管理系統。另外還有一個例子就是,接口和頁面的關聯關係,前面提到經過靜態分析獲得的頁面和接口的依賴表有可能不夠準確,可是接口訪問Web Server的時候,通常都有access.log,能夠經過access.log來作分析,拿到比較完整的頁面依賴的接口信息,以及接口依賴的頁面信息,有些接口的調用須要有open api的那種註冊調用機制,就另當別論了。
管理端應該提供正反兩個方向的查詢和檢索能力:
對於關聯關係的存儲,用關係型DB的話,通常只能使用like查詢,可能要掃描全表,於是性能比較差,能夠考慮存儲到MongoDB中建立索引,或者存儲到ElasticSearch中創建索引。
前面提到的,其實有一個假設的前提「只有一個Web應用,且接口都是前端發起的」,可是對於其餘狀況,思路是相似的:
本文探討了前端資源治理的含義以及要解決的問題,並介紹了實現前端資源治理的思路,是筆者近期在前端工程化方面的思考,部分已經完成,部分正在推動。本文並不涉及實現的細節,細節在後面的系列文章中進一步講解。 前端治理的兩個關鍵點,一個是系統整合,一個是關聯關係管理,總體串聯的核心是頁面管理。
若是你以爲這篇內容對你有價值,請點贊,並關注咱們的官網和咱們的微信公衆號(WecTeam),每週都有優質文章推送: