一、前端和后端的概念(怎么區分是前端還是后端)
什么是前端? 這又可以分解成幾個小問題。
1.JS是前端么? 2.只要用JS寫的,都是前端么? 3.只要是前端工程師寫的,都是前端么?4.大前端就是指的用JS語言寫的前端,哪怕它是運行在服務器那一端么? 5.App算前端么? 6.Html+CSS算前端么? 7.小程序算前端么? 8.ReactNative算前端么?
通常情況下,我們說的前端,都是指瀏覽器這一端,瀏覽器這一端,又在通常情況下,都是用JS來實現的,所以又會引申為,用JS寫的大部分程序都是前端,包括App,小程序,H5等。而NodeJS出現之后,用NodeJS寫的后端部分,也會被人歸類為前端,為了區分之前的前端,就給他們起了一個名字,叫做“大前端”。
但,這種以語言為分界點去區分前后端,真的合理么?
在過去,我們是不分前后端的,無論是Java還是JS,全都是一個人來寫。
到底是什么原因讓我們開始區分前后端了?
第一個,是可以並行開發。前后端的進度互不影響,在過去,前后端不分離的情況下,前端的工作量相對較少,一個前端可以對四個后端。可以理解為,前端花了一周時間寫好了靜態頁面,只需要調幾個Ajax接口,不需要路由,也不需要渲染,所以他可以把時間繼續在下一個項目里。
第二個,是成本問題。在過去,后端的成本還是比前端要高一些。同樣的工作,如果能拆給兩個人做,一個成本高一點,一個成本低一點,能接受。
第三個,CSS太難了。JS還好,和后端語言在對技能的訓練上相差不大,可是CSS是什么鬼?記住那么多的屬性,和Hash算法有關系嗎?
所以才分成了前后端,而Html+CSS+JS,都是在瀏覽器端執行,統一稱之為前端。而Java,C,Python,PHP這些可以運行在服務器端的,統一稱之為后端。
所以前后端的定義,不應該是以語言來定義,而是應該以它的運行環境,如果是在服務器端,就應該被稱之為后端,代表着你看不見,摸不着。
而如果運行在用戶端,就應該被稱之為前端,代表你是可以看得到的。
二、動靜分離
靜態頁面:是指互聯網架構中,幾乎不變的頁面(或者變化頻率很低)。
動態頁面:是指互聯網架構中,不同用戶不同場景訪問,都不一樣的頁面。
動態資源 jps servlet spring mvc 與靜態資源 js html img css 不會部署到同一個服務器。接口與視圖分開部署,前端項目與后端項目都是獨立部署的。也就是說前台通過后端提供的接口來拿到數據,后台只為前端提供接口。動靜分離就是將動態請求和靜態請求區分訪問。將靜態資源部署到一個服務器,動態資源部署到一個服務器,它們是分開部署的。
三、為什么要動靜分離
靜態頁面訪問路徑短,訪問速度快,幾毫秒。動態頁面訪問路徑長,訪問速度相對較慢(數據庫的訪問,網絡傳輸,業務邏輯計算),幾十毫秒甚至幾百毫秒,對架構擴展性的要求更高。靜態頁面與動態頁面以不同域名區分。
這樣可以提升系統的訪問速度,提升資源利用率。
四、前后分離
核心思想是前端html頁面通過ajax調用后端的restuful api接口並使用json數據進行交互。
前后端分離並非僅僅只是一種開發模式,而是一種架構模式(前后端分離架構)。千萬不要以為只有在擼代碼的時候把前端和后端分開就是前后端分離了,需要區分前后端項目。前端項目與后端項目是兩個項目,放在兩個不同的服務器,需要獨立部署,兩個不同的工程,兩個不同的代碼庫,不同的開發人員。前后端工程師需要約定交互接口,實現並行開發,開發結束后需要進行獨立部署,前端通過ajax來調用http請求調用后端的restful api。前端只需要關注頁面的樣式與動態數據的解析&渲染,而后端專注於具體業務邏輯。
參考博文:(有助於理解什么是前后端)https://www.cnblogs.com/xixinhua/p/10265426.html
有助於理解前后端分離博文:https://blog.csdn.net/sod5211314/article/details/80601724