產(chǎn)品經(jīng)理懂點(diǎn)技術(shù):前后端是如何“分家”的?
你知道早期的開發(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í):
- 瀏覽器先下載HTML的內(nèi)容
- 根據(jù)HTML里的內(nèi)容,下載并加載對(duì)應(yīng)的CSS,讓網(wǎng)頁漂亮起來
- 根據(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):
- 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)存等)帶來一定的壓力。
- 搜索引擎,如百度、搜狗、谷歌等,想爬取網(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é)議。
操你媽逼的,吃軟飯的
文章寫的非常精彩,比大學(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)部使用。
??寫的非常通俗易懂,希望作者經(jīng)常分享這種技術(shù)知識(shí)
寫得通俗易懂~~
前后端分離好處中的二,應(yīng)該是前端重新寫過,不是后端重新寫過叭。
學(xué)習(xí)了
謝謝樓主,學(xué)習(xí)了!
感謝,困惑我多年的問題得到了解答,祝工作順利!
示意圖很生動(dòng),必須一個(gè)贊
贊贊贊
通俗易懂
厲害厲害 ??
寫的通俗易懂,關(guān)注
老哥 您這個(gè)寫的真的生動(dòng) , 我一個(gè)不太懂的 都看明白了 感謝
寫得很好,讓我這個(gè)小白都看明白啦,感謝感謝~~~多多出新文章呀~~ ?