深入淺出:了解前后端分離優勢、前后端接口聯調以及優化問題
目錄:
2. 前后端接口聯調;
3.前端性能優化 ;
4.前端安全問題;
一、項目有前后端分離和前后端不分離:
在前后端不分離架構中,所有的靜態資源和業務代碼統一部署在同一台服務器上。服務器接收到瀏覽器的請求后,進行處理得到數據,然后將數據填充到靜態頁面中,最終返回給瀏覽器。
實現前后端分離后,有了下面幾點改變:
1.服務器一分為二,前后端分別部署,靜態資源放在前端服務器,業務代碼放在后的服務器
2.前端服務器需要接收Http請求(一般使用node.js)
3.前端服務器需要進行視圖解析(可以使用vue.js、angular.js)
4.前端服務器需要處理路由(也就是頁面之間的跳轉邏輯)
5.后端服務器只需要返回數據
一、前言
前后端分離已成為互聯網項目開發的業界標准使用方式,通過nginx+tomcat的方式(也可以中間加一個nodejs)有效的進行解耦,並且前后端分離會為以后的大型分布式架構、彈性計算架構、微服務架構、多端化服務(多種客戶端,例如:瀏覽器,車載終端,安卓,IOS等等)打下堅實的基礎。這個步驟是系統架構從猿進化成人的必經之路。
核心思想是前端html頁面通過ajax調用后端的restuful api接口並使用json數據進行交互。
在互聯網架構中,名詞解釋:
Web服務器:一般指像nginx,apache這類的服務器,他們一般只能解析靜態資源。
應用服務器:一般指像tomcat,jetty,resin這類的服務器可以解析動態資源也可以解析靜態資源,但解析靜態資源的能力沒有web服務器好。
二、技術分工(開發人員分離)
以前的JavaWeb項目大多數都是java程序員又當爹又當媽,又搞前端,又搞后端。
隨着時代的發展,漸漸的許多大中小公司開始把前后端的界限分的越來越明確,前端工程師只管前端的事情,后端工程師只管后端的事情。正所謂術業有專攻,一個人如果什么都會,那么他畢竟什么都不精。大中型公司需要專業人才,小公司需要全才,但是對於個人職業發展來說,我建議是分開。
1、對於后端java工程師:(負責Model層,業務處理/數據等)
把精力放在java基礎,設計模式,jvm原理,spring+springmvc原理及源碼,linux,mysql事務隔離與鎖機制,mongodb,http/tcp,多線程,分布式架構,彈性計算架構,微服務架構,java性能優化,以及相關的項目管理等等。
后端追求的是:三高(高並發,高可用,高性能),安全,存儲,業務等等。
2、對於前端工程師:(負責View和Controller層。)
把精力放在html5,css3,jquery,angularjs,bootstrap,reactjs,vuejs,webpack,less/sass,gulp,nodejs,Google V8引擎,javascript多線程,模塊化,面向切面編程,設計模式,瀏覽器兼容性,性能優化等等。
前端追求的是:頁面表現,速度流暢,兼容性,用戶體驗等等。
術業有專攻,這樣你的核心競爭力才會越來越高,正所謂你往生活中投入什么,生活就會反饋給你什么。並且兩端的發展都越來越高深,你想什么都會,那你畢竟什么都不精。
通過將team分成前后端team,讓兩邊的工程師更加專注各自的領域,獨立治理,然后構建出一個全棧式的精益求精的team。
三、開發模式
以前老的方式是:
產品經歷/領導/客戶提出需求===》UI做出設計圖 ===》前端工程師做html頁面===》后端工程師將html頁面套成jsp頁面(前后端強依賴,后端必須要等前端的html做好才能套jsp。如果html發生變更,就更痛了,開發效率低)===》集成出現問題 ===》前端返工 ===》后端返工===》二次集成 ===》集成成功 ==》交付
新的方式是:
產品經歷/領導/客戶提出需===》UI做出設計圖 ===》前后端約定接口&數據&參數 ===》前后端並行開發(無強依賴,可前后端並行開發,如果需求變更,只要接口&參數不變,就不用兩邊都修改代碼,開發效率高)===》前后端集成 ===》前端頁面調整 ===》集成成功 ===》交付
四、請求方式
原文:https://blog.csdn.net/bntX2jSQfEHy7/article/details/80589580
二、前后端接口聯調:
前言:
以JC同事為例,他公司為前后端分離架構,前端vue全家桶;前后端人員開會協商數據接口后(主要是定義傳輸的數據和API接口),前后端並行開發;因為后台此時無法提供后端數據,所以前端需要用mock模擬假數據,管理API接口,獲取數據,到時接口聯調時連接后端服務器,訪問后端數據即可。
仔細看看這其實就是前后端分離中的mock數據和聯調的問題,就現在來說能解決的方式有很多種。先說mock數據,gulp,webpack, fekit (去哪兒網的一款前端自動化構建工具,據說歷史比webpack和gulp都要久遠)等等自動化構建工具都有mock數據的功能,這不是問題;再說絕對路徑的問題,其實只需要做一個host的映射就行了。
之前開發寫代碼的時候,所有的ajax數據都不是后端返回的真實數據,而是我們自己通過接口mock模擬的假數據,當前端的代碼編寫完畢,后端的接口也已經寫好之后,我們就需要把mock數據干掉,嘗試使用后端提供的數據,進行前后端的一個調試,這個過程我們就把它稱之為前后端的接口聯調。
為什么要聯調 本地的mock數據是JC同事自己寫的,肯定符合前端需求,但是后端接口首先需要測試通不通,還需要測試數據格式對不對,還有后端有沒有填寫足夠的數據,比如寫列表頁,前端想分頁,如果后端就寫了兩條測試數據,你咋整? 所以,Jack需要根據后端對接口的調整,不斷地來回切換url,這樣豈不是還在受后端的影響,還談什么毛線的前后端分離,名存實亡嘛!
當我的朋友Jack把static文件夾下的mock數據刪除之后,在運行項目,發現報錯了,瀏覽器告訴他,你訪問的mock下面的index.json文件找不到404。
我們平時本地前端開發環境dev地址大多是 localhost:8080,而后台服務器的訪問地址就有很多種情況了,比如 后端程序猿本地IP(127.0.0.1:8889),或者外網域名,當前端與后台進行數據交互時,自然就出現跨域問題(后台服務沒做處理情況下)。axios不支持jsonp, 所以我們就要使用http-proxy-middleware中間件做代理。
https://www.douban.com/note/686499733/?type=rec#sep
三、前端性能優化
1.內容優化
(1)減少HTTP請求數
(3)避免重定向
(4)使用Ajax緩存
(5)延遲加載組件,預加載組件
(6)減少DOM元素數量
(7)避免404
2.服務器優化
(1)使用內容分發網絡(CDN):把網站內容分散到多個、處於不同地域位置的服務器上可以加快下載速度。
(2)GZIP壓縮
(3)設置ETag:ETags(Entity tags,實體標簽)是web服務器和瀏覽器用於判斷瀏覽器緩存中的內容和服務器中的原始內容是否匹配的一種機制。
(4)提前刷新緩沖區
(5)對Ajax請求使用GET方法
(6)避免空的圖像src
3.Cookie優化
(1)減小Cookie大小
(2)針對Web組件使用域名無關的Cookie
4.CSS優化
1)將CSS代碼放在HTML頁面的頂部
2)避免使用CSS表達式
(3)使用<link>來代替@import
(4)避免使用Filters
5.javascript優化
(1)將JavaScript腳本放在頁面的底部。
(2)將JavaScript和CSS作為外部文件來引用:在實際應用中使用外部文件可以提高頁面速度,因為JavaScript和CSS文件都能在瀏覽器中產生緩存。
(3)縮小JavaScript和CSS
(4)刪除重復的腳本
(5)最小化DOM的訪問:使用JavaScript訪問DOM元素比較慢。
(6)開發智能的事件處理程序
(7)javascript代碼注意:謹慎使用with,避免使用eval Function函數,減少作用域鏈查找。
6.圖像優化
(1)優化圖片大小
(2)通過CSS Sprites優化圖片
(3)不要在HTML中使用縮放圖片
(4)favicon.ico要小而且可緩存
四、前端安全問題
1.算法加密:
(1) RSA加密
(2) MD5加密
(3) SHA256加密