
朋友,你有沒(méi)有這樣的經(jīng)歷:點(diǎn)開(kāi)一個(gè)網(wǎng)站,等啊等,看著(zhù)進(jìn)度條慢慢爬,心里開(kāi)始不耐煩?3秒鐘的等待,在互聯(lián)網(wǎng)世界里已經(jīng)長(cháng)得像三個(gè)世紀。今天我要跟你聊聊,我們是怎么把一個(gè)網(wǎng)站的加載時(shí)間從3秒硬生生壓到1秒以?xún)鹊?。這個(gè)過(guò)程就像給一輛老爺車(chē)做全面改裝,讓它變成跑車(chē)。
你可能覺(jué)得,3秒也挺快的啊,為什么非要1秒?這里有幾個(gè)殘酷的事實(shí):
用戶(hù)沒(méi)耐心:研究顯示,如果加載超過(guò)3秒,超過(guò)一半的用戶(hù)會(huì )離開(kāi);從3秒降到1秒,用戶(hù)留存率能提升一大截。
影響賺錢(qián):加載每慢1秒,轉化率就掉一點(diǎn)。對于電商網(wǎng)站,這可能意味著(zhù)實(shí)實(shí)在在的錢(qián)。
搜索引擎不喜歡慢的:加載慢的網(wǎng)站在搜索結果里排不到前面。
所以,這1秒不是隨便定的,是生死線(xiàn)。
我們先看看原來(lái)3秒加載時(shí)都發(fā)生了什么。你可以想象成去餐館吃飯:
第1秒:找餐館(DNS查詢(xún))
你在網(wǎng)上搜到這家店
找到地址
這個(gè)過(guò)程原來(lái)花了200-300毫秒
第2秒:走到餐館(建立連接)
從你家出發(fā)去餐館
跟服務(wù)員打招呼,安排座位
這個(gè)過(guò)程原來(lái)花了400-500毫秒
第3秒:點(diǎn)菜上菜(傳輸內容)
看菜單
點(diǎn)菜
等廚房做
服務(wù)員端上來(lái)
這個(gè)過(guò)程原來(lái)花了2000多毫秒
一頓飯等3秒好像還行,但在網(wǎng)上,用戶(hù)已經(jīng)跑了。
原來(lái)網(wǎng)站加載慢,第一個(gè)問(wèn)題就是“菜單太厚”——文件太大。
1. 圖片減肥大行動(dòng)
原來(lái):一張首頁(yè)大圖,5MB,專(zhuān)業(yè)單反拍的,畫(huà)質(zhì)無(wú)敵
問(wèn)題:用戶(hù)手機上看,根本不需要5MB的質(zhì)量
解決方案:
壓縮到200KB以?xún)?/p>
用新的圖片格式,同樣質(zhì)量,文件小一半
根據用戶(hù)設備尺寸提供不同大小的圖片(手機給小的,電腦給大的)
效果:?jiǎn)芜@一項就省了1秒多
2. CSS和JavaScript文件瘦身
原來(lái):用了很多現成的框架和庫,什么功能都有
問(wèn)題:80%的代碼用戶(hù)根本用不到
解決方案:
只保留用到的代碼
把多個(gè)文件合并成一個(gè)
去掉所有空白、注釋?zhuān)C器能看懂就行)
效果:又省了300-400毫秒
3. 字體優(yōu)化
原來(lái):用了三種特殊字體,好看是真好看
問(wèn)題:每個(gè)字體文件2-3MB,就為了幾個(gè)標題字
解決方案:
只用一種字體,另一種用系統默認字體代替
只包含用到的字符(中文字符集很大,但一篇文章用不到所有字)
效果:又省了1MB的傳輸
聰明的餐館會(huì )上菜快:先上涼菜,讓你吃著(zhù),熱菜慢慢做。網(wǎng)站也一樣。
1. 關(guān)鍵內容優(yōu)先
原來(lái):所有東西一起加載,用戶(hù)盯著(zhù)白屏等
優(yōu)化:先加載屏幕上能看到的內容
先加載首屏的圖片和文字
下面的內容慢慢加載
用戶(hù)感覺(jué)“秒開(kāi)”,其實(shí)只開(kāi)了一部分
2. 懶加載圖片
原來(lái):一打開(kāi)頁(yè)面,所有圖片都開(kāi)始下載
優(yōu)化:只有滾動(dòng)到能看到圖片時(shí),才下載
用戶(hù)往下滑,滑到哪加載到哪
省流量,速度快
3. 異步加載JavaScript
原來(lái):JavaScript文件阻塞頁(yè)面渲染
優(yōu)化:讓JavaScript在后臺慢慢加載,不擋路
頁(yè)面先出來(lái),交互功能稍后跟上
1. CDN:開(kāi)分店
原來(lái):所有用戶(hù)都去總店(一臺服務(wù)器)
問(wèn)題:離得遠的用戶(hù)等得久
優(yōu)化:在全國各地開(kāi)“分店”(CDN節點(diǎn))
用戶(hù)訪(fǎng)問(wèn)最近的“分店”
效果:網(wǎng)絡(luò )傳輸時(shí)間減半
2. 啟用HTTP/2
原來(lái):HTTP/1.1,一次只能上一個(gè)菜
優(yōu)化:HTTP/2,可以多個(gè)菜一起上
原來(lái)要排隊10次,現在一次搞定
效果:又省了幾百毫秒
3. 開(kāi)啟Gzip壓縮
原來(lái):傳輸文件像寄原包裝,體積大
優(yōu)化:像寄壓縮包裹,到了再拆開(kāi)
文本文件壓縮后體積小60-70%
效果:傳輸更快
??蛠?lái)吃飯,不用每次看菜單。
1. 瀏覽器緩存
原來(lái):每次訪(fǎng)問(wèn)都重新下載所有文件
優(yōu)化:讓瀏覽器記住不常變的東西
圖片、CSS、JavaScript文件緩存起來(lái)
第二次訪(fǎng)問(wèn)快如閃電
2. 服務(wù)端緩存
原來(lái):每個(gè)用戶(hù)訪(fǎng)問(wèn)都重新生成頁(yè)面
優(yōu)化:把做好的頁(yè)面存起來(lái)
第一個(gè)用戶(hù)訪(fǎng)問(wèn),做好頁(yè)面存起來(lái)
第二個(gè)用戶(hù)直接用存好的
效果:服務(wù)器壓力小,響應快
1. 預連接
在用戶(hù)點(diǎn)擊前,就提前建立連接
比如:鼠標懸停在鏈接上時(shí),就開(kāi)始準備
2. 預加載
猜到用戶(hù)下一步要什么,提前加載
比如:看了商品詳情,可能要看購買(mǎi)頁(yè)面,提前加載購買(mǎi)頁(yè)面的部分資源
3. 代碼分割
把整個(gè)網(wǎng)站拆成小塊
需要哪塊加載哪塊
不用一次全部加載完
讓我們算筆賬,看看時(shí)間都省在哪了:
優(yōu)化前(3秒):
DNS查詢(xún):200毫秒
建立連接:400毫秒
等待服務(wù)器響應:800毫秒
下載HTML:100毫秒
下載CSS/JS:800毫秒
下載圖片:600毫秒
渲染頁(yè)面:100毫秒
總計:3000毫秒(3秒)
優(yōu)化后(1秒以?xún)龋?/span>
DNS查詢(xún)(預解析):50毫秒
建立連接(HTTP/2+預連接):150毫秒
等待服務(wù)器響應(緩存+優(yōu)化):200毫秒
下載HTML(壓縮):30毫秒
下載CSS/JS(壓縮+合并):150毫秒
下載圖片(壓縮+懶加載):150毫秒
渲染頁(yè)面(關(guān)鍵渲染路徑優(yōu)化):100毫秒
總計:830毫秒(0.83秒)
坑1:過(guò)度優(yōu)化,適得其反
為了壓縮圖片,質(zhì)量損失太多,用戶(hù)投訴
解決方案:找到平衡點(diǎn),既要小又要看得過(guò)去
坑2:緩存導致更新問(wèn)題
用戶(hù)緩存了舊版本,看不到新功能
解決方案:給文件加版本號,有更新時(shí)換名字
坑3:不同設備表現差異大
電腦上1秒,舊手機上還是3秒
解決方案:分級優(yōu)化,給好設備更好的體驗,但保證差設備也能用
坑4:測量不準
本地測試很快,用戶(hù)那里很慢
解決方案:用真實(shí)用戶(hù)的數據監控,全球各地都有測試點(diǎn)
壓到1秒后,我們還能做什么?
微優(yōu)化階段:
每個(gè)文件再壓小幾KB
每個(gè)請求再省幾毫秒
累計起來(lái)也有幾百毫秒
架構優(yōu)化:
用更現代的框架
服務(wù)端渲染
邊緣計算
用戶(hù)體驗優(yōu)化:
加載動(dòng)畫(huà)讓等待不枯燥
骨架屏(先顯示頁(yè)面框架,內容慢慢填充)
離線(xiàn)功能
你可能覺(jué)得這些技術(shù)太專(zhuān)業(yè),但有些簡(jiǎn)單的優(yōu)化誰(shuí)都能做:
壓縮圖片:用在線(xiàn)工具壓縮一下,效果立竿見(jiàn)影
減少插件/組件:用的越少,越快
選擇好的主機/CDN:多花點(diǎn)錢(qián),速度快很多
定期清理:刪掉不用的文件、圖片
用現成的優(yōu)化工具:很多平臺提供一鍵優(yōu)化
做了這么久優(yōu)化,我有幾點(diǎn)體會(huì ):
1. 性能是功能
不是“有最好”,是“必須有”
慢的網(wǎng)站等于功能殘缺
2. 優(yōu)化是持續的
沒(méi)有“優(yōu)化完了”這回事
新功能加進(jìn)來(lái),可能又變慢了
要持續監控,持續優(yōu)化
3. 以用戶(hù)為中心
不看實(shí)驗室數據,看真實(shí)用戶(hù)數據
不同用戶(hù),不同設備,體驗可能完全不同
4. 平衡的藝術(shù)
要快,也要好看
要功能豐富,也要加載快
找到那個(gè)最佳平衡點(diǎn)
把網(wǎng)站從3秒優(yōu)化到1秒,就像給一輛車(chē)做全面改裝。不是換個(gè)輪胎那么簡(jiǎn)單,而是從發(fā)動(dòng)機到車(chē)身,從燃料到駕駛習慣,全方面的改造。
這個(gè)過(guò)程告訴我們幾個(gè)道理:
第一,沒(méi)有天生的快。那些你覺(jué)得“秒開(kāi)”的網(wǎng)站,背后都有一堆人拼命優(yōu)化。
第二,魔鬼在細節里。1秒鐘由1000毫秒組成,每省1毫秒都不容易,但積累起來(lái)就不得了。
第三,優(yōu)化永無(wú)止境。從3秒到1秒很厲害,但從1秒到0.5秒可能更難。
最重要的是,性能優(yōu)化最終是為了人。不是為了數字好看,而是為了讓用戶(hù)不等待、不煩躁,順暢地得到他們想要的東西。
現在你明白了嗎?為什么大公司那么在乎這區區幾秒鐘?因為在互聯(lián)網(wǎng)世界,幾秒鐘就是用戶(hù)走還是留的分界線(xiàn),就是賺錢(qián)還是賠錢(qián)的分水嶺。
如果你的網(wǎng)站也有點(diǎn)慢,別著(zhù)急,一步一步來(lái)。從壓縮圖片開(kāi)始,從減少不必要的代碼開(kāi)始。每快一點(diǎn),用戶(hù)體驗就好一點(diǎn),你的網(wǎng)站就更有競爭力一點(diǎn)。在這個(gè)快節奏的時(shí)代,快,本身就是一種優(yōu)勢。