一、Web網(wǎng)站調(diào)優(yōu)
1、最小化http請求
一個正常HTTP請求的流程簡述:如在瀏覽器中輸入"www.xxxxxx.com"并按下回車,瀏覽器再與這個URL指向的服務(wù)器建立連接,然后瀏覽器才能向服務(wù)器發(fā)送請求信息,服務(wù)器在接受到請求的信息后再返回相應(yīng)的信息,瀏覽器接收到來自服務(wù)器的應(yīng)答信息后,對這些數(shù)據(jù)解釋執(zhí)行。而當我們請求的網(wǎng)頁文件中有很多圖片、CSS、JS甚至音樂等信息時,將會頻繁的與服務(wù)器建立連接,與釋放連接,這必定會造成資源的浪費,且每個HTTP請求都會對服務(wù)器和瀏覽器產(chǎn)生性能負擔。網(wǎng)速相同的條件下,下載一個100KB的圖片比下載兩個50KB的圖片要快。所以,請減少HTTP請求。
針對于減少HTTP請求數(shù)量,可以從以下幾個方面進行優(yōu)化:①內(nèi)聯(lián)圖片;②CSS Sprites;③合并css和js文件(使用壓縮工具,如YUI compressor,Gulp,Webpack);④圖片映射;⑤圖片惰性加載(lazyload)。
2、壓縮
①壓縮圖片:
1)縮小圖片分辨率;
2)改變圖片格式;
3)降低圖片保存質(zhì)量。
推薦使用TinyPNG
②壓縮CSS和JS:
去除不必要的空白符、格式符、注釋(即對代碼進行格式化)。
推薦使用YUI compressor,Gulp,Webpack
③Gzip壓縮響應(yīng)包:
在現(xiàn)在的HTTP協(xié)議中,通常會使用gzip來壓力HTTP響應(yīng)包,從HTTP / 1.1開始,Web客戶端通過HTTP請求中的Accept-Encoding標頭指示對壓縮的支持。
Accept-Encoding:gzip,deflate
如果服務(wù)器接受到的語法中包括這個頭,就會使用客戶端列出來的方法中的一種來壓縮響應(yīng),Web服務(wù)器通過響應(yīng)中的Content-Encoding頭來通知Web客戶端。
Content-Encoding:gzip
3、外置JavaScript和CSS,將css放在頂部,將js放在底部
內(nèi)聯(lián)JavaScript和CSS的優(yōu)點如下:
1)有效減少 HTTP 請求次數(shù),提升前端頁面性能,緩解服務(wù)器壓力;
2)瀏覽器加載完CSS才能渲染頁面,因此可以防止CSS文件無法讀取而造成頁面裸奔的現(xiàn)象。
內(nèi)聯(lián)JavaScript和CSS的缺點如下:
1)可維護性差,每天如果有需要修改內(nèi)容,必須對很多頁面進行修改;
2)內(nèi)聯(lián)JavaScript和CSS在每次頁面加載的都必須重新加載;
3)協(xié)同開發(fā)的能力差,不方便多名開者同步工作。
外聯(lián)JavaScript和CSS的優(yōu)點如下:
1)如果JavaScript和CSS被多個頁面調(diào)用時,這樣只要修改一個文件就可以,提高可維護性;
2)分離HTML、CSS和Javascript,提高js和css的復用性;
3)外置Javascript文件可以被瀏覽器緩存。
外聯(lián)JavaScript和CSS的缺點如下:
1)外置的方式增加了HTTP的請求數(shù);(通過緩存來解決)
2)瀏覽器要加載完CSS才能渲染頁面,因此影響頁面的性能。
5、移除重復腳本
如果一個頁面中有兩次使用到同一個JavaScript文件,那這將對頁面性能產(chǎn)生很大的影響。導致一個腳本的重復又兩個主要因素:團隊大小和腳本數(shù)量。開發(fā)一個網(wǎng)站需要極大數(shù)量的資源,不同的團隊需要構(gòu)建一個大型web的不同部分,當團隊整合和溝通工作沒有做足,則容易出現(xiàn)重復腳本的情況。當然腳本數(shù)量也是重要的一環(huán),腳本數(shù)量越多越容易出現(xiàn)重復腳本的情況。
重復的腳本通常有兩個方面影響頁面性能:一是增加了不必要的HTTP請求;二是JavaScript執(zhí)行所花費的時間。
6、避免重定向
重定向:用戶請求的頁面被轉(zhuǎn)移到了別的地方,瀏覽器向服務(wù)請請求一個頁面,服務(wù)器告訴瀏覽器請求的頁面已經(jīng)被轉(zhuǎn)移到另外一個頁面,并告知另一個頁面地址,瀏覽器就再發(fā)送請求到重定向的地址。這樣會增加服務(wù)器和瀏覽器之間的往返次數(shù),影響網(wǎng)站性能。

重定向狀態(tài)碼有:301:永久重定向;302:臨時重定向。304:not modified 并不是真的重定向,它是用來告訴瀏覽器get請求的文件在緩存中,避免重新下載。
如果一個頁面中有兩次使用到同一個JavaScript文件,那這將對頁面性能產(chǎn)生很大的影響。導致一個腳本的重復又兩個主要因素:團隊大小和腳本數(shù)量。開發(fā)一個網(wǎng)站需要極大數(shù)量的資源,不同的團隊需要構(gòu)建一個大型web的不同部分,當團隊整合和溝通工作沒有做足,則容易出現(xiàn)重復腳本的情況。當然腳本數(shù)量也是重要的一環(huán),腳本數(shù)量越多越容易出現(xiàn)重復腳本的情況。
重復的腳本通常有兩個方面影響頁面性能:一是增加了不必要的HTTP請求;二是JavaScript執(zhí)行所花費的時間。
7、CDN內(nèi)容分發(fā)網(wǎng)絡(luò)
雖然用戶平均的帶寬每年都在增長,但是隨著系統(tǒng)用戶特性不同,用戶與Web服務(wù)器的距離也在不斷的拉長,而用戶與Web服務(wù)器間距離長短會影響到頁面響應(yīng)時間。網(wǎng)站最初通常將所有的服務(wù)器放在同一個地方,當用戶群增加時,公司就必須面服務(wù)器放置地點不再合適的問題,有必要在多個地理位置不同的服務(wù)器上部署內(nèi)容。
如果Web服務(wù)器離用戶更近,則HTTP請求的響應(yīng)時間將會縮短,與其重新設(shè)計應(yīng)用程序,不如將應(yīng)用程序Web服務(wù)器分散開,這樣不僅能達到響應(yīng)時間大幅減少的目的,還更容易實現(xiàn),所以我們研究了一種新的技術(shù)即內(nèi)容分布網(wǎng)絡(luò)CDN(Content Delivery Network)。
盡可能避開互聯(lián)網(wǎng)上有可能影響數(shù)據(jù)傳輸速度和穩(wěn)定性的瓶頸和環(huán)節(jié),使內(nèi)容傳輸?shù)母?、更穩(wěn)定。通過在網(wǎng)絡(luò)各處放置節(jié)點服務(wù)器所構(gòu)成的在現(xiàn)有的互聯(lián)網(wǎng)基礎(chǔ)之上的一層智能虛擬網(wǎng)絡(luò),CDN系統(tǒng)能夠?qū)崟r地根據(jù)網(wǎng)絡(luò)流量和各節(jié)點的連接、負載狀況以及到用戶的距離和響應(yīng)時間等綜合信息將用戶的請求重新導向離用戶最近的服務(wù)節(jié)點上。--《百度百科》
注意點:
實時性問題,在網(wǎng)絡(luò)內(nèi)容發(fā)生變化時將新的網(wǎng)絡(luò)內(nèi)容從服務(wù)器端直接傳送到緩存器,或者當對網(wǎng)絡(luò)內(nèi)容的訪問增加時將數(shù)據(jù)源服務(wù)器的網(wǎng)絡(luò)內(nèi)容盡可能實時地復制到緩存服務(wù)器,使來自于遠程服務(wù)器的網(wǎng)絡(luò)內(nèi)容網(wǎng)頁與復本服務(wù)器或緩存器中的網(wǎng)頁保持同步。
8、減少DNS查詢
DNS解析是存在開銷的,通常瀏覽器查找一個指定主機名的IP地址,需要花費20到120ms,在DNS解析完成之前,瀏覽器不能從主機名那里下載任何東西。
在DNS解析過程中,減少唯一主機名的數(shù)量也呆以縮短DNS解析時間,如果客戶端的DNS緩存為空時,DNS查找的數(shù)量與Web頁面中唯一主機名的數(shù)量相等。但是減少唯一主機名的數(shù)量有可能減少頁面中發(fā)生的并行下載量。減少并行下載可能會增加響應(yīng)時間。我的準則是將這些組件分成至少兩個但不超過四個主機名。這在減少DNS查找和允許高度并行下載之間取得了很好的折衷。
參考:
1. https://kuaibao.qq.com/s/20180815A0B1HW00?refer=spider
2. http://www.cnblogs.com/Darren_code/archive/2011/12/31/property.htm