產(chǎn)品經(jīng)理懂點(diǎn)技術(shù):前后端是如何“分家”的?

15 評(píng)論 19596 瀏覽 189 收藏 10 分鐘

你知道早期的開發(fā)中,前后端是不分離的嗎?那么后來它們又為什么要“分家”呢?分離后又有什么好處呢?

在前面一篇文章中,產(chǎn)品汪搞懂了前后端的工作分工。但是了解過程中,一個(gè)程序猿哥哥不經(jīng)意間的一句話:“現(xiàn)在都是前后端分離的”,讓小汪感到納悶了,以前難道前后端不分離的么?于是小汪就繼續(xù)深究起來。

不溫馨的一家人

在十幾年前,前端的地位其實(shí)相對(duì)于后端并不那么強(qiáng)勢(shì),以下是一種經(jīng)典的編程框架。

MVC:Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設(shè)計(jì)典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼。

有意思的事情出現(xiàn)了,內(nèi)容是傳給用戶的,前端并不是直接接觸用戶的!前端只是提供了個(gè)樣式模板,由后端把內(nèi)容嵌入進(jìn)入,再由后端直接傳給用戶。

這個(gè)時(shí)候,前端的編程要各種順著后端哥哥的心意,而且前端要是出bug了,還得拉上后端一起研究,誰讓你往我的模板里插了內(nèi)容,出了幺蛾子你就得負(fù)責(zé)到底。

這個(gè)時(shí)期前后端高度耦合,從編程環(huán)境、到開發(fā)調(diào)試,都必須“在一起”,對(duì)于前端來說,其實(shí)自主權(quán)就不高,對(duì)后端來說,也要懂一些前端的知識(shí)。

于是前端程序猿對(duì)后端程序猿說,要不……你只管你的業(yè)務(wù)和數(shù)據(jù),把結(jié)果給我,我來負(fù)責(zé)組裝與呈現(xiàn),這樣大家都輕松些。于是前后端就分離了。

當(dāng)初是你要分開,分開就分開

前后端分離帶來的好處:

(1)編程更輕松

前后端分離之后,后端更專注于實(shí)現(xiàn)業(yè)務(wù)邏輯,形成一套標(biāo)準(zhǔn)化的“API接口”,例如需要?jiǎng)?chuàng)建商品,前端將商品信息傳給后端創(chuàng)建商品的接口,后端就會(huì)完成商品的創(chuàng)建,并返回創(chuàng)建結(jié)果。如果前端給的創(chuàng)建商品信息缺了標(biāo)題或者價(jià)格,后端還能返回創(chuàng)建失敗的結(jié)果,并且提示缺失了哪些信息等。

前端除了負(fù)責(zé)界面樣式和交互,還接管了獲取和展示數(shù)據(jù)的權(quán)利,從此前端開發(fā)就自由多了,如果遇上bug,也能很輕松定位到是前端還是后臺(tái)的事情。

(2)更高的可復(fù)用性

前后端分離,更是順應(yīng)了互聯(lián)網(wǎng)發(fā)展多樣化的潮流。后端通過提供一系列可以實(shí)現(xiàn)不同業(yè)務(wù)功能的接口,就可以讓不同的前端、甚至外部系統(tǒng)過來對(duì)接。

這樣方便了公司不斷推廣自己的產(chǎn)品,今天推出手機(jī)網(wǎng)頁版、明天推出APP版、后天推出小程序版本等。而后端只需要提供一次接口,無需每增加一類客戶端,后端就要新寫過。

用戶訪問網(wǎng)站的過程小知識(shí):

  1. 瀏覽器先下載HTML的內(nèi)容
  2. 根據(jù)HTML里的內(nèi)容,下載并加載對(duì)應(yīng)的CSS,讓網(wǎng)頁漂亮起來
  3. 根據(jù)HTML里的內(nèi)容,下載并加載對(duì)應(yīng)的JavaScript,讓網(wǎng)站具備交互動(dòng)效,其中部分JavaScript代碼負(fù)責(zé)向服務(wù)器上的后端請(qǐng)求數(shù)據(jù),并展示在頁面上。

但是久而久之,前后端分離在web網(wǎng)頁上也遇到了一些問題,最明顯的是以下兩點(diǎn):

  1. JavaScript的請(qǐng)求在用戶瀏覽器中進(jìn)行,當(dāng)一個(gè)網(wǎng)站需要展示非常多的內(nèi)容時(shí),JavaScript就要向后臺(tái)多個(gè)接口請(qǐng)求數(shù)據(jù),然后再在用戶瀏覽器上完成頁面組裝,這過程中就會(huì)給用戶設(shè)備的網(wǎng)速、設(shè)備的運(yùn)行速度(CPU、內(nèi)存等)帶來一定的壓力。
  2. 搜索引擎,如百度、搜狗、谷歌等,想爬取網(wǎng)頁的內(nèi)容時(shí),就會(huì)用到爬蟲。爬蟲會(huì)抓取網(wǎng)頁HTML里面的內(nèi)容,然后讓其他網(wǎng)友可以搜索到你的網(wǎng)頁。但是此時(shí),HTML文件就是個(gè)框架,要依靠JavaScript才能獲取到數(shù)據(jù)。這就會(huì)導(dǎo)致你的網(wǎng)頁難以被搜索引擎收錄,用戶很可能搜不到你的網(wǎng)頁。

前后端分離為用戶設(shè)備帶來的影響,可以通過“換臺(tái)新手機(jī)”、“換臺(tái)新電腦”解決,但是搜索引擎爬不到網(wǎng)頁的數(shù)據(jù),對(duì)很多重度依賴搜索引擎流量的產(chǎn)品來講,打擊可就大了。

例如你需要找一個(gè)菜譜的時(shí)候,可能會(huì)在百度搜索“芥藍(lán)怎么炒好吃?”,然后再從搜索結(jié)果里面訪問各種美食網(wǎng)站。又或者你想去哪里玩,就會(huì)在百度搜索“土耳其旅游攻略”等等。對(duì)于這類重搜索引擎流量的網(wǎng)站而言,如果爬蟲爬不到自己的數(shù)據(jù),客流損失就比較嚴(yán)重。

運(yùn)行在后面的前端

考慮到上訴問題,聰明的網(wǎng)頁前端程序猿就想到了一個(gè)新的辦法,那我們先把后臺(tái)的數(shù)據(jù)跟HTML內(nèi)容整合好,再呈現(xiàn)給用戶吧,得力于一種叫做Node.JS的、可以使用網(wǎng)頁前端熟悉的JavaScript編程的工具,于是有了2.0版本的前后端分離。

前端程序猿跟服務(wù)器上的后端說,讓一讓,給我騰個(gè)地兒,然后把Node.JS放在了服務(wù)器上。等用戶或者爬蟲需要訪問網(wǎng)頁時(shí),這個(gè)運(yùn)行在服務(wù)器上的程序,先請(qǐng)求后端獲得數(shù)據(jù),并整合到HTML中,然后再返回給用戶。

這樣一來,用戶的設(shè)備就少了JavaScript多次請(qǐng)求后端的煩惱,加快了運(yùn)行速度,而爬蟲也可以爬取到填充好內(nèi)容的HTML網(wǎng)頁了。

看到這里,小汪就想,這么一來,用戶體驗(yàn)、爬蟲的問題確實(shí)解決了,但是讓本來本該發(fā)生在用戶瀏覽器上的事情,都在服務(wù)器上做了嘛,如果訪問量大的話,咱服務(wù)器的壓力不就很大了?

前端程序猿哥哥呵呵一笑,其實(shí)不然,你想想,很多用戶都是在訪問同一個(gè)網(wǎng)頁,看同一個(gè)商品、讀同一篇文章,這些請(qǐng)求,要是服務(wù)器的前端就請(qǐng)求后臺(tái)一次,然后把整合好的HTML保存起來,下次再有人再來訪問,就把這個(gè)生成好的HTML展示給用戶,這樣不就服務(wù)器輕松了、用戶訪問也快了么!

小汪又問了,那咋們頁面多了,不就要每個(gè)頁面都保存一份HTML文件么,服務(wù)器儲(chǔ)存的空間不就越來越少了么?

前端程序猿哥哥繼續(xù)答道:久而久之,HTML文件在服務(wù)器積累多了,就把好久都沒人訪問的HTML刪了,給其他新保存的HTML文件讓位置,通過“緩存”技術(shù),讓服務(wù)器永葆活力。

小汪恍然大悟,原來這就是緩存??!這下子,小汪終于明白了前后端分離是什么回事,以及為什么要前后端分離。

現(xiàn)在隨著很多大型產(chǎn)品的形成、獨(dú)立運(yùn)行,新的“信息孤島”正在形成。例如微信的公眾號(hào)-小程序-朋友圈-圈子,然后通過搜一搜進(jìn)行統(tǒng)一搜索,內(nèi)部造血,而不再依賴傳統(tǒng)的搜索引擎為他引流。

又例如淘寶,很多年前就拒絕了讓百度爬蟲爬取他的商品信息,只允許在淘寶內(nèi)進(jìn)行搜索。你在百度上搜不到淘寶的商品,在微信上也找不淘寶的任何信息、無法訪問淘寶任何的鏈接,如果你要淘寶購物,就只能去淘寶網(wǎng)站或者下載淘寶APP。新的互聯(lián)網(wǎng)格局的形成,肯定會(huì)進(jìn)一步影響著前后端的關(guān)系。

 

本文由 @iCheer 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)作者許可,禁止轉(zhuǎn)載。

題圖來自Unsplash,基于CC0協(xié)議。

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 操你媽逼的,吃軟飯的

    來自北京 回復(fù)
  2. 文章寫的非常精彩,比大學(xué)老師講得好,非常感謝作者,在評(píng)論區(qū)做個(gè)筆記。
    1.前后端不分離:前端只提供一個(gè)模板,后端直接和用戶交接數(shù)據(jù)。
    2.前后端分離時(shí)代1.0:前端獲取業(yè)務(wù)信息(JavaScript)通過實(shí)現(xiàn)相應(yīng)業(yè)務(wù)功能的【接口】將數(shù)據(jù)傳給后端,后端將完成的結(jié)果通過接口返回結(jié)果給前端,前端將數(shù)據(jù)展示給用戶。缺陷:當(dāng)前端頁面請(qǐng)求的接口過多,會(huì)受限于用戶使用的設(shè)備性能,前端無法獲取數(shù)據(jù),搜索引擎的爬蟲無法識(shí)別內(nèi)容,會(huì)流失用戶瀏覽量。
    3.前后端用戶分離時(shí)代2.0:出現(xiàn)了一項(xiàng)技術(shù)Nodejs,是Javascirpt的升級(jí)版,它部署在服務(wù)器上,由Nodejs負(fù)責(zé)與接口對(duì)接交換請(qǐng)求和結(jié)果的數(shù)據(jù),提前填充好了Html網(wǎng)頁,可以快速的加載到瀏覽器上,不僅減輕了1.0版本對(duì)用戶設(shè)備的壓力,爬蟲也能更快的識(shí)別信息內(nèi)容。同時(shí)增加了緩存技術(shù),對(duì)于使用低頻的頁面(Html 文件)進(jìn)行刪除,減輕了服務(wù)器的壓力。
    4.信息孤島,部分軟件不與傳統(tǒng)的搜索引擎共享數(shù)據(jù),僅內(nèi)部造血,內(nèi)部使用。

    來自四川 回復(fù)
  3. ??寫的非常通俗易懂,希望作者經(jīng)常分享這種技術(shù)知識(shí)

    來自北京 回復(fù)
  4. 寫得通俗易懂~~

    來自浙江 回復(fù)
  5. 前后端分離好處中的二,應(yīng)該是前端重新寫過,不是后端重新寫過叭。

    來自山東 回復(fù)
  6. 學(xué)習(xí)了

    來自福建 回復(fù)
  7. 謝謝樓主,學(xué)習(xí)了!

    來自廣東 回復(fù)
  8. 感謝,困惑我多年的問題得到了解答,祝工作順利!

    來自中國 回復(fù)
  9. 示意圖很生動(dòng),必須一個(gè)贊

    來自廣東 回復(fù)
  10. 贊贊贊

    來自福建 回復(fù)
  11. 通俗易懂

    來自江蘇 回復(fù)
  12. 厲害厲害 ??

    來自北京 回復(fù)
  13. 寫的通俗易懂,關(guān)注

    回復(fù)
  14. 老哥 您這個(gè)寫的真的生動(dòng) , 我一個(gè)不太懂的 都看明白了 感謝

    來自北京 回復(fù)
  15. 寫得很好,讓我這個(gè)小白都看明白啦,感謝感謝~~~多多出新文章呀~~ ?

    來自北京 回復(fù)