Web 開發模式演變歷史和趨勢
今天的《前端文摘》給大家分享一篇玉伯的文章。文章詳細介紹了 Web 開發的四種常用模式以及未來可能成為流行趨勢的 Node 全棧開發模式,相信你看了以後一定會有收穫。
一、簡單明快的早期時代
可稱之為 Web 1.0 時代,非常適合創業型小專案,不分前後端,經常 3-5 人搞定所有開發。頁面由 JSP、PHP 等工程師在服務端生成,瀏覽器負責展現。基本上是服務端給什麼瀏覽器就展現什麼,展現的控制在 Web Server 層。
這種模式的好處是:簡單明快,本地起一個 Tomcat 或 Apache 就能開發,除錯什麼的都還好,只要業務不太複雜。
然而業務總會變複雜,這是好事情,否則很可能就意味著創業失敗了。業務的複雜會讓 Service 越來越多,參與開發的人員也很可能從幾個人快速擴招到幾十人。在這種情況下,會遇到一些典型問題:
1、Service 越來越多,呼叫關係變複雜,前端搭建本地環境不再是一件簡單的事。考慮團隊協作,往往會考慮搭建集中式的開發伺服器來解決。這種解決方案對編譯型的後端開發來說也許還好,但對前端開發來說並不友好。天哪,我只是想調整下按鈕樣式,卻要本地開發、程式碼上傳、驗證生效等好幾個步驟。也許習慣了也還好,但開發伺服器總是不那麼穩定,出問題時往往需要依賴後端開發搞定。看似僅僅是前端開發難以本地化,但這對研發效率的影響其實蠻大。
2、JSP 等程式碼的可維護性越來越差。JSP 非常強大,可以內嵌 Java 程式碼。這種強大使得前後端的職責不清晰,JSP 變成了一個灰色地帶。經常為了趕專案,為了各種緊急需求,會在 JSP 裡揉雜大量業務程式碼。積攢到一定階段時,往往會帶來大量維護成本。
這個時期,為了提高可維護性,可以通過下面的方式實現前端的元件化:
理論上,如果大家都能按照最佳實踐去書寫程式碼,那麼無論是 JSP 還是 PHP,可維護性都不會差。但可維護性更多是工程含義,有時候需要通過限制帶來自由,需要某種約定,使得即便是新手也不會寫出太糟糕的程式碼。
如何讓前後端分工更合理高效,如何提高程式碼的可維護性,在 Web 開發中很重要。下面我們繼續來看,技術架構的演變如何解決這兩個問題。
二、後端為主的 MVC 時代
為了降低複雜度,以後端為出發點,有了 Web Server 層的架構升級,比如 Structs、Spring MVC 等,這是後端的 MVC 時代。
程式碼可維護性得到明顯好轉,MVC 是個非常好的協作模式,從架構層面讓開發者懂得什麼程式碼應該寫在什麼地方。為了讓 View 層更簡單幹脆,還可以選擇 Velocity、Freemaker 等模板,使得模板裡寫不了 Java 程式碼。看起來是功能變弱了,但正是這種限制使得前後端分工更清晰。然而依舊並不是那麼清晰,這個階段的典型問題是:
1、前端開發重度依賴開發環境。這種架構下,前後端協作有兩種模式:一種是前端寫 demo,寫好後,讓後端去套模板。淘寶早期包括現在依舊有大量業務線是這種模式。好處很明顯,demo 可以本地開發,很高效。不足是還需要後端套模板,有可能套錯,套完後還需要前端確定,來回溝通調整的成本比較大。另一種協作模式是前端負責瀏覽器端的所有開發和伺服器端的 View 層模板開發,支付寶是這種模式。好處是 UI 相關的程式碼都是前端去寫就好,後端不用太關注,不足就是前端開發重度繫結後端環境,環境成為影響前端開發效率的重要因素。
2、前後端職責依舊糾纏不清。Velocity 模板還是蠻強大的,變數、邏輯、巨集等特性,依舊可以通過拿到的上下文變數來實現各種業務邏輯。這樣,只要前端弱勢一點,往往就會被後端要求在模板層寫出不少業務程式碼。還有一個很大的灰色地帶是 Controller,頁面路由等功能本應該是前端最關注的,但卻是由後端來實現。Controller 本身與 Model 往往也會糾纏不清,看了讓人咬牙的程式碼經常會出現在 Controller 層。這些問題不能全歸結於程式設計師的素養,否則 JSP 就夠了。
經常會有人吐槽 Java,但 Java 在工程化開發方面真的做了大量思考和架構嘗試。Java 蠻符合馬雲的一句話:讓平凡人做非凡事。
三、Ajax 帶來的 SPA 時代
歷史滾滾往前,2004 年 Gmail 像風一樣的女子來到人間,很快 2005 年 Ajax 正式提出,加上 CDN 開始大量用於靜態資源儲存,於是出現了 JavaScript 王者歸來的 SPA (Single Page Application 單頁面應用)時代。
這種模式下,前後端的分工非常清晰,前後端的關鍵協作點是 Ajax 介面。看起來是如此美妙,但回過頭來看看的話,這與 JSP 時代區別不大。複雜度從服務端的 JSP 裡移到了瀏覽器的 JavaScript,瀏覽器端變得很複雜。類似 Spring MVC,這個時代開始出現瀏覽器端的分層架構:
對於 SPA 應用,有幾個很重要的挑戰:
1、前後端介面的約定。如果後端的介面一塌糊塗,如果後端的業務模型不夠穩定,那麼前端開發會很痛苦。這一塊在業界有 API Blueprint 等方案來約定和沉澱介面,在阿里,不少團隊也有類似嘗試,通過介面規則、介面平臺等方式來做。有了和後端一起沉澱的介面規則,還可以用來模擬資料,使得前後端可以在約定介面後實現高效並行開發。相信這一塊會越做越好。
2、前端開發的複雜度控制。SPA 應用大多以功能互動型為主,JavaScript 程式碼過十萬行很正常。大量 JS 程式碼的組織,與 View 層的繫結等,都不是容易的事情。典型的解決方案是業界的 Backbone,但 Backbone 做的事還很有限,依舊存在大量空白區域需要挑戰。
SPA 讓前端看到了一絲綠色,但依舊是在荒漠中行走。
四、前端為主的 MV* 時代
為了降低前端開發複雜度,除了 Backbone,還有大量框架湧現,比如 EmberJS、KnockoutJS、AngularJS 等等。這些框架總的原則是先按型別分層,比如 Templates、Controllers、Models,然後再在層內做切分,如下圖:
好處很明顯:
1、前後端職責很清晰。前端工作在瀏覽器端,後端工作在服務端。清晰的分工,可以讓開發並行,測試資料的模擬不難,前端可以本地開發。後端則可以專注於業務邏輯的處理,輸出 RESTful 等介面。
2、前端開發的複雜度可控。前端程式碼很重,但合理的分層,讓前端程式碼能各司其職。這一塊蠻有意思的,簡單如模板特性的選擇,就有很多很多講究。並非越強大越好,限制什麼,留下哪些自由,程式碼應該如何組織,所有這一切設計,得花一本的厚度去說明。
3、部署相對獨立,產品體驗可以快速改進。
但依舊有不足之處:
1、程式碼不能複用。比如後端依舊需要對資料做各種校驗,校驗邏輯無法複用瀏覽器端的程式碼。如果可以複用,那麼後端的資料校驗可以相對簡單化。
2、全非同步,對 SEO 不利。往往還需要服務端做同步渲染的降級方案。
3、效能並非最佳,特別是移動網際網路環境下。
4、SPA 不能滿足所有需求,依舊存在大量多頁面應用。URL Design 需要後端配合,前端無法完全掌控。
五、Node 帶來的全棧時代
前端為主的 MV* 模式解決了很多很多問題,但如上所述,依舊存在不少不足之處。隨著 Node.js 的興起,JavaScript 開始有能力執行在服務端。這意味著可以有一種新的研發模式:
在這種研發模式下,前後端的職責很清晰。對前端來說,兩個 UI 層各司其職:
1、Front-end UI layer 處理瀏覽器層的展現邏輯。通過 CSS 渲染樣式,通過 JavaScript 新增互動功能,HTML 的生成也可以放在這層,具體看應用場景。
2、Back-end UI layer 處理路由、模板、資料獲取、cookie 等。通過路由,前端終於可以自主把控 URL Design,這樣無論是單頁面應用還是多頁面應用,前端都可以自由調控。後端也終於可以擺脫對展現的強關注,轉而可以專心於業務邏輯層的開發。
通過 Node,Web Server 層也是 JavaScript 程式碼,這意味著部分程式碼可前後複用,需要 SEO 的場景可以在服務端同步渲染,由於非同步請求太多導致的效能問題也可以通過服務端來緩解。前一種模式的不足,通過這種模式幾乎都能完美解決掉。
與 JSP 模式相比,全棧模式看起來是一種迴歸,也的確是一種向原始開發模式的迴歸,不過是一種螺旋上升式的迴歸。
基於 Node 的全棧模式,依舊面臨很多挑戰:
1、需要前端對服務端程式設計有更進一步的認識。比如 network/tcp、PE 等知識的掌握。
2、Node 層與 Java 層的高效通訊。Node 模式下,都在伺服器端,RESTful HTTP 通訊未必高效,通過 SOAP 等方式通訊更高效。一切需要在驗證中前行。
3、對部署、運維層面的熟練了解,需要更多知識點和實操經驗。
4、大量歷史遺留問題如何過渡。這可能是最大最大的阻力。
六、小結
回顧歷史總是讓人感慨,展望未來則讓人興奮。上面講到的研發模式,除了最後一種還在探索期,其他各種在各大公司都已有大量實踐。幾點小結:
1、模式沒有好壞高下之分,只有合不合適。
2、Ajax 給前端開發帶來了一次質的飛躍,Node 很可能是第二次。
3、SoC(關注度分離) 是一條偉大的原則。上面種種模式,都是讓前後端的職責更清晰,分工更合理高效。
4、還有個原則,讓合適的人做合適的事。比如 Web Server 層的 UI Layer 開發,前端是更合適的人選。
歷史有時候會打轉,咋一看以為是回去了,實際上是螺旋轉了一圈,站在了一個新的起點。
相關文件:Web開發技術的演變
相關文章
- 《從零構建前後分離web專案》:開篇 - 縱觀WEB歷史演變Web
- Git 學習記錄之演變歷史Git
- 從事程式設計那些年經歷的跨平臺開發工具框架演變歷史程式設計框架
- 未來Web開發趨勢報告Web
- 2021年, web前端開發有哪些趨勢?Web前端
- 2019 年 Web 開發技術指南和趨勢Web
- 2021年Web前端開發的趨勢有哪些Web前端
- Angular Universal 的演進歷史Angular
- WEB開發框架效能排行與趨勢分析2-三大驚喜變化Web框架
- web全棧開發工程師的趨勢、價值Web全棧工程師
- 融合通訊技術趨勢和演進方向
- C++演變史 | Hello WorldC++
- 2022年資料市場的演變:大資料趨勢大資料
- 淺談web前端的發展趨勢Web前端
- 自然語言處理歷史史詩:NLP的正規化演變與Python全實現自然語言處理Python
- 把握前端開發歷史脈絡前端
- DNF端游到手遊的演變歷史:從ACT遊戲到MMORPG化遊戲
- iOS歷史(iOS系統發展歷史)iOS
- 高盛:歷史變遷作證中國產業鏈優勢產業
- 未來100:2022年趨勢和改變
- 5分鐘看懂,未來1年Web前端開發最新趨勢Web前端
- 2021年Web開發必須知道的7大優秀趨勢Web
- 長篇分析:從歷史演進角度談研發成本和製作傾向調整
- 從HTTP/0.9到HTTP/2:一文讀懂HTTP協議的歷史演變和設計思路HTTP協議
- Web開發的未來:2025 年未來幾年的主要趨勢Web
- 2019前端開發的發展趨勢前端
- Linux發展歷史Linux
- 線上教育的不同模式的發展趨勢模式
- 三國遊戲買量素材演變史遊戲
- 武俠遊戲買量素材演變史遊戲
- 傳奇遊戲買量素材演變史遊戲
- GTA開發歷史(四):噩夢降臨
- GTA開發歷史:親爸爸的時代
- chrome devtool 開發者工具 控制檯歷史、斷點歷史 匯出全部、儲存Chromedev斷點
- 我經歷過的監控系統演進史
- mysql架構和歷史MySql架構
- 地平線黃暢演講:邊緣 AI 計算發展趨勢AI
- 未來app開發的發展趨勢APP
- Git改變歷史-章節筆記Git筆記