一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Web 研發(fā)模式演變

 集微筆記 2014-04-23

前不久徐飛寫了一篇很好的文章:Web 應(yīng)用的組件化開發(fā)。本文嘗試從歷史發(fā)展角度,說(shuō)說(shuō)各種研發(fā)模式的優(yōu)劣。

一、簡(jiǎn)單明快的早期時(shí)代

1

可稱之為 Web 1.0 時(shí)代,非常適合創(chuàng)業(yè)型小項(xiàng)目,不分前后端,經(jīng)常 3-5 人搞定所有開發(fā)。頁(yè)面由 JSP、PHP 等工程師在服務(wù)端生成,瀏覽器負(fù)責(zé)展現(xiàn)?;旧鲜欠?wù)端給什么瀏覽器就展現(xiàn)什么,展現(xiàn)的控制在 Web Server 層。

這種模式的好處是:簡(jiǎn)單明快,本地起一個(gè) Tomcat 或 Apache 就能開發(fā),調(diào)試什么的都還好,只要業(yè)務(wù)不太復(fù)雜。

然而業(yè)務(wù)總會(huì)變復(fù)雜,這是好事情,否則很可能就意味著創(chuàng)業(yè)失敗了。業(yè)務(wù)的復(fù)雜會(huì)讓 Service 越來(lái)越多,參與開發(fā)的人員也很可能從幾個(gè)人快速擴(kuò)招到幾十人。在這種情況下,會(huì)遇到一些典型問題:

1、Service 越來(lái)越多,調(diào)用關(guān)系變復(fù)雜,前端搭建本地環(huán)境不再是一件簡(jiǎn)單的事。考慮團(tuán)隊(duì)協(xié)作,往往會(huì)考慮搭建集中式的開發(fā)服務(wù)器來(lái)解決。這種解決方案對(duì)編譯型的后端開發(fā)來(lái)說(shuō)也許還好,但對(duì)前端開發(fā)來(lái)說(shuō)并不友好。天哪,我只是想調(diào)整下按鈕樣式,卻要本地開發(fā)、代碼上傳、驗(yàn)證生效等好幾個(gè)步驟。也許習(xí)慣了也還好,但開發(fā)服務(wù)器總是不那么穩(wěn)定,出問題時(shí)往往需要依賴后端開發(fā)搞定??此苾H僅是前端開發(fā)難以本地化,但這對(duì)研發(fā)效率的影響其實(shí)蠻大。

2、**JSP 等代碼的可維護(hù)性越來(lái)越差。**JSP 非常強(qiáng)大,可以內(nèi)嵌 Java 代碼。這種強(qiáng)大使得前后端的職責(zé)不清晰,JSP 變成了一個(gè)灰色地帶。經(jīng)常為了趕項(xiàng)目,為了各種緊急需求,會(huì)在 JSP 里揉雜大量業(yè)務(wù)代碼。積攢到一定階段時(shí),往往會(huì)帶來(lái)大量維護(hù)成本。

這個(gè)時(shí)期,為了提高可維護(hù)性,可以通過下面的方式實(shí)現(xiàn)前端的組件化:

2

理論上,如果大家都能按照最佳實(shí)踐去書寫代碼,那么無(wú)論是 JSP 還是 PHP,可維護(hù)性都不會(huì)差。但可維護(hù)性更多是工程含義,有時(shí)候需要通過限制帶來(lái)自由,需要某種約定,使得即便是新手也不會(huì)寫出太糟糕的代碼。

如何讓前后端分工更合理高效,如何提高代碼的可維護(hù)性,在 Web 開發(fā)中很重要。下面我們繼續(xù)來(lái)看,技術(shù)架構(gòu)的演變?nèi)绾谓鉀Q這兩個(gè)問題。

二、后端為主的 MVC 時(shí)代

為了降低復(fù)雜度,以后端為出發(fā)點(diǎn),有了 Web Server 層的架構(gòu)升級(jí),比如 Structs、Spring MVC 等,這是后端的 MVC 時(shí)代。

3

代碼可維護(hù)性得到明顯好轉(zhuǎn),MVC 是個(gè)非常好的協(xié)作模式,從架構(gòu)層面讓開發(fā)者懂得什么代碼應(yīng)該寫在什么地方。為了讓 View 層更簡(jiǎn)單干脆,還可以選擇 Velocity、Freemaker 等模板,使得模板里寫不了 Java 代碼??雌饋?lái)是功能變?nèi)趿?,但正是這種限制使得前后端分工更清晰。然而依舊并不是那么清晰,這個(gè)階段的典型問題是:

1、前端開發(fā)重度依賴開發(fā)環(huán)境。這種架構(gòu)下,前后端協(xié)作有兩種模式:一種是前端寫 demo,寫好后,讓后端去套模板。淘寶早期包括現(xiàn)在依舊有大量業(yè)務(wù)線是這種模式。好處很明顯,demo 可以本地開發(fā),很高效。不足是還需要后端套模板,有可能套錯(cuò),套完后還需要前端確定,來(lái)回溝通調(diào)整的成本比較大。另一種協(xié)作模式是前端負(fù)責(zé)瀏覽器端的所有開發(fā)和服務(wù)器端的 View 層模板開發(fā),支付寶是這種模式。好處是 UI 相關(guān)的代碼都是前端去寫就好,后端不用太關(guān)注,不足就是前端開發(fā)重度綁定后端環(huán)境,環(huán)境成為影響前端開發(fā)效率的重要因素。

2、**前后端職責(zé)依舊糾纏不清。**Velocity 模板還是蠻強(qiáng)大的,變量、邏輯、宏等特性,依舊可以通過拿到的上下文變量來(lái)實(shí)現(xiàn)各種業(yè)務(wù)邏輯。這樣,只要前端弱勢(shì)一點(diǎn),往往就會(huì)被后端要求在模板層寫出不少業(yè)務(wù)代碼。還有一個(gè)很大的灰色地帶是 Controller,頁(yè)面路由等功能本應(yīng)該是前端最關(guān)注的,但卻是由后端來(lái)實(shí)現(xiàn)。Controller 本身與 Model 往往也會(huì)糾纏不清,看了讓人咬牙的代碼經(jīng)常會(huì)出現(xiàn)在 Controller 層。這些問題不能全歸結(jié)于程序員的素養(yǎng),否則 JSP 就夠了。

經(jīng)常會(huì)有人吐槽 Java,但 Java 在工程化開發(fā)方面真的做了大量思考和架構(gòu)嘗試。Java 蠻符合馬云的一句話:讓平凡人做非凡事。

三、Ajax 帶來(lái)的 SPA 時(shí)代

歷史滾滾往前,2004 年 Gmail 像風(fēng)一樣的女子來(lái)到人間,很快 2005 年 Ajax 正式提出,加上 CDN 開始大量用于靜態(tài)資源存儲(chǔ),于是出現(xiàn)了 JavaScript 王者歸來(lái)的 SPA (Single Page Application 單頁(yè)面應(yīng)用)時(shí)代。

4

這種模式下,前后端的分工非常清晰,前后端的關(guān)鍵協(xié)作點(diǎn)是 Ajax 接口??雌饋?lái)是如此美妙,但回過頭來(lái)看看的話,這與 JSP 時(shí)代區(qū)別不大。復(fù)雜度從服務(wù)端的 JSP 里移到了瀏覽器的 JavaScript,瀏覽器端變得很復(fù)雜。類似 Spring MVC,這個(gè)時(shí)代開始出現(xiàn)瀏覽器端的分層架構(gòu):

5

對(duì)于 SPA 應(yīng)用,有幾個(gè)很重要的挑戰(zhàn):

1、前后端接口的約定。如果后端的接口一塌糊涂,如果后端的業(yè)務(wù)模型不夠穩(wěn)定,那么前端開發(fā)會(huì)很痛苦。這一塊在業(yè)界有 API Blueprint 等方案來(lái)約定和沉淀接口,在阿里,不少團(tuán)隊(duì)也有類似嘗試,通過接口規(guī)則、接口平臺(tái)等方式來(lái)做。有了和后端一起沉淀的接口規(guī)則,還可以用來(lái)模擬數(shù)據(jù),使得前后端可以在約定接口后實(shí)現(xiàn)高效并行開發(fā)。相信這一塊會(huì)越做越好。

2、**前端開發(fā)的復(fù)雜度控制。**SPA 應(yīng)用大多以功能交互型為主,JavaScript 代碼過十萬(wàn)行很正常。大量 JS 代碼的組織,與 View 層的綁定等,都不是容易的事情。典型的解決方案是業(yè)界的 Backbone,但 Backbone 做的事還很有限,依舊存在大量空白區(qū)域需要挑戰(zhàn)。

SPA 讓前端看到了一絲綠色,但依舊是在荒漠中行走。

四、前端為主的 MV* 時(shí)代

為了降低前端開發(fā)復(fù)雜度,除了 Backbone,還有大量框架涌現(xiàn),比如 EmberJS、KnockoutJS、AngularJS 等等。這些框架總的原則是先按類型分層,比如 Templates、Controllers、Models,然后再在層內(nèi)做切分,如下圖:

6

好處很明顯:

1、前后端職責(zé)很清晰。前端工作在瀏覽器端,后端工作在服務(wù)端。清晰的分工,可以讓開發(fā)并行,測(cè)試數(shù)據(jù)的模擬不難,前端可以本地開發(fā)。后端則可以專注于業(yè)務(wù)邏輯的處理,輸出 RESTful 等接口。

2、前端開發(fā)的復(fù)雜度可控。前端代碼很重,但合理的分層,讓前端代碼能各司其職。這一塊蠻有意思的,簡(jiǎn)單如模板特性的選擇,就有很多很多講究。并非越強(qiáng)大越好,限制什么,留下哪些自由,代碼應(yīng)該如何組織,所有這一切設(shè)計(jì),得花一本的厚度去說(shuō)明。

3、部署相對(duì)獨(dú)立,產(chǎn)品體驗(yàn)可以快速改進(jìn)。

但依舊有不足之處:

1、代碼不能復(fù)用。比如后端依舊需要對(duì)數(shù)據(jù)做各種校驗(yàn),校驗(yàn)邏輯無(wú)法復(fù)用瀏覽器端的代碼。如果可以復(fù)用,那么后端的數(shù)據(jù)校驗(yàn)可以相對(duì)簡(jiǎn)單化。
2、全異步,對(duì) SEO 不利。往往還需要服務(wù)端做同步渲染的降級(jí)方案。
3、性能并非最佳,特別是移動(dòng)互聯(lián)網(wǎng)環(huán)境下。
4、SPA 不能滿足所有需求,依舊存在大量多頁(yè)面應(yīng)用。URL Design 需要后端配合,前端無(wú)法完全掌控。

五、Node 帶來(lái)的全棧時(shí)代

前端為主的 MV* 模式解決了很多很多問題,但如上所述,依舊存在不少不足之處。隨著 Node.js 的興起,JavaScript 開始有能力運(yùn)行在服務(wù)端。這意味著可以有一種新的研發(fā)模式:

7

在這種研發(fā)模式下,前后端的職責(zé)很清晰。對(duì)前端來(lái)說(shuō),兩個(gè) UI 層各司其職:

1、Front-end UI layer 處理瀏覽器層的展現(xiàn)邏輯。通過 CSS 渲染樣式,通過 JavaScript 添加交互功能,HTML 的生成也可以放在這層,具體看應(yīng)用場(chǎng)景。

2、Back-end UI layer 處理路由、模板、數(shù)據(jù)獲取、cookie 等。通過路由,前端終于可以自主把控 URL Design,這樣無(wú)論是單頁(yè)面應(yīng)用還是多頁(yè)面應(yīng)用,前端都可以自由調(diào)控。后端也終于可以擺脫對(duì)展現(xiàn)的強(qiáng)關(guān)注,轉(zhuǎn)而可以專心于業(yè)務(wù)邏輯層的開發(fā)。

通過 Node,Web Server 層也是 JavaScript 代碼,這意味著部分代碼可前后復(fù)用,需要 SEO 的場(chǎng)景可以在服務(wù)端同步渲染,由于異步請(qǐng)求太多導(dǎo)致的性能問題也可以通過服務(wù)端來(lái)緩解。前一種模式的不足,通過這種模式幾乎都能完美解決掉。

與 JSP 模式相比,全棧模式看起來(lái)是一種回歸,也的確是一種向原始開發(fā)模式的回歸,不過是一種螺旋上升式的回歸。

基于 Node 的全棧模式,依舊面臨很多挑戰(zhàn):

1、需要前端對(duì)服務(wù)端編程有更進(jìn)一步的認(rèn)識(shí)。比如 network/tcp、PE 等知識(shí)的掌握。
2、Node 層與 Java 層的高效通信。Node 模式下,都在服務(wù)器端,RESTful HTTP 通信未必高效,通過 SOAP 等方式通信更高效。一切需要在驗(yàn)證中前行。
3、對(duì)部署、運(yùn)維層面的熟練了解,需要更多知識(shí)點(diǎn)和實(shí)操經(jīng)驗(yàn)。
4、大量歷史遺留問題如何過渡。這可能是最大最大的阻力。

六、小結(jié)

回顧歷史總是讓人感慨,展望未來(lái)則讓人興奮。上面講到的研發(fā)模式,除了最后一種還在探索期,其他各種在各大公司都已有大量實(shí)踐。幾點(diǎn)小結(jié):

1、模式?jīng)]有好壞高下之分,只有合不合適。
2、Ajax 給前端開發(fā)帶來(lái)了一次質(zhì)的飛躍,Node 很可能是第二次。
3、SoC(關(guān)注度分離) 是一條偉大的原則。上面種種模式,都是讓前后端的職責(zé)更清晰,分工更合理高效。
4、還有個(gè)原則,讓合適的人做合適的事。比如 Web Server 層的 UI Layer 開發(fā),前端是更合適的人選。

歷史有時(shí)候會(huì)打轉(zhuǎn),咋一看以為是回去了,實(shí)際上是螺旋轉(zhuǎn)了一圈,站在了一個(gè)新的起點(diǎn)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    午夜激情视频一区二区| 欧美激情区一区二区三区| 欧美大黄片在线免费观看| 午夜福利黄片免费观看| 亚洲中文字幕人妻av| 婷婷基地五月激情五月| 亚洲黄片在线免费小视频| 狠狠干狠狠操在线播放| 国产综合香蕉五月婷在线| 亚洲精品黄色片中文字幕| 蜜桃传媒在线正在播放| 九九九热视频免费观看| 国产精品视频一区二区秋霞| 日韩女优视频国产一区| 不卡中文字幕在线视频| 五月婷日韩中文字幕四虎| 精品人妻精品一区二区三区| 91人妻人人澡人人人人精品| 亚洲中文字幕亲近伦片| 九九热在线视频观看最新| 日韩欧美高清国内精品| 高清国产日韩欧美熟女| 欧美加勒比一区二区三区| 日韩精品一区二区三区四区| 中文字幕乱子论一区二区三区| 国产又爽又猛又粗又色对黄| 国产无摭挡又爽又色又刺激| 国产成人精品一区二区在线看| 午夜午夜精品一区二区| 久久婷婷综合色拍亚洲| 国产一级内片内射免费看 | 欧美日韩综合在线第一页| 亚洲欧美日韩在线中文字幕| 男人把女人操得嗷嗷叫| 东京热男人的天堂久久综合| 91欧美日韩精品在线| 国产女优视频一区二区| 人妻巨大乳一二三区麻豆| 日韩中文无线码在线视频| 色婷婷在线精品国自产拍| 欧美一级日韩中文字幕|