WebKit資源加載機(jī)制
1. 資源
HTML支持的類型主要包括:HTML担忧、JavaScript、CSS樣式表坯癣、圖片瓶盛、SVG、CSS Shader示罗、視頻音頻和字幕惩猫、字體類型和XSL樣式表。
資源類型前面加“Cached”字樣鹉勒,其實(shí)這是因?yàn)樾蕟?wèn)題而引入的緩存機(jī)制帆锋,所有對(duì)資源的額請(qǐng)求都會(huì)先獲取緩存中的信息,以決定是否向服務(wù)器提出資源請(qǐng)求禽额。
2. 資源緩存
資源的緩存機(jī)制是提高資源使用效率的有效方法锯厢。它的基本思想是建立一個(gè)資源的緩沖池,當(dāng)WebKit需要請(qǐng)求資源的時(shí)候脯倒,先從資源池中查找是否存在相應(yīng)的資源实辑。如果有,WebKit則取出使用藻丢,如果沒(méi)有剪撬,WebKit創(chuàng)建一個(gè)新的CachedResource子類的對(duì)象,并發(fā)送真正的請(qǐng)求給服務(wù)器悠反,WebKit收到資源之后將其設(shè)置到該資源類的對(duì)象中去残黑,以便于緩存后下次使用。這里緩存指的是內(nèi)存緩存斋否。
WebKit從資源池中查找資源的關(guān)鍵字是URL
3. 資源加載器
資源加載器分為三種:
- 針對(duì)每種資源類型的特定加載器梨水,特點(diǎn)是僅加載某一特定類型資源。
- 資源緩存機(jī)制的資源加載器茵臭,特點(diǎn)是所有特定加載器都共享它來(lái)查找并插入緩存資源疫诽。
- 通用的資源加載器,是在WebKit需要從網(wǎng)絡(luò)或者文件系統(tǒng)獲取資源的時(shí)候使用旦委,該類只負(fù)責(zé)數(shù)據(jù)的獲取奇徒,被特定加載器共享。
4. 過(guò)程
因?yàn)閺木W(wǎng)絡(luò)獲取資源是一個(gè)非常耗時(shí)的過(guò)程缨硝,通常一些資源的加載是異步執(zhí)行的摩钙,也就是說(shuō)資源的獲取和加載不會(huì)阻礙當(dāng)前WebKit的渲染過(guò)程,例如:圖片查辩、CSS文件腺律。但是也存在阻礙主線程的渲染過(guò)程的資源奕短,例如:JavaScript代碼文件宜肉。
因?yàn)橹骶€程被阻礙了匀钧,后面的解析工作沒(méi)辦法繼續(xù)往下進(jìn)行,所以對(duì)于HTML網(wǎng)頁(yè)中后面使用的資源也沒(méi)辦法知道并發(fā)送下載請(qǐng)求谬返。這時(shí)之斯,WebKit會(huì)啟動(dòng)另外一個(gè)線程去遍歷后面的HTML網(wǎng)頁(yè),收集需要的資源URL遣铝,然后發(fā)送請(qǐng)求佑刷,這樣可以避免被阻礙。
5. 資源的生命周期
資源池中的資源聲明周期是什么呢酿炸?資源池不能無(wú)限大瘫絮,必須要使用相應(yīng)的機(jī)制來(lái)替換其中的資源,從而加入新的資源填硕。它采用的是LRU(Least Recent Used最近最少使用)算法麦萤。
WebKit的做法是,首先判斷資源是否在資源池中扁眯,如果是壮莹,那么發(fā)送一個(gè)HTTP請(qǐng)求給服務(wù)器,說(shuō)明該資源在本地的一些信息姻檀,例如該資源什么時(shí)間修改的命满,服務(wù)器則根據(jù)該信息作判斷,如果沒(méi)有更新绣版,服務(wù)器則發(fā)送回狀態(tài)碼304胶台,表明無(wú)需更新,那么直接利用資源池中原來(lái)的資源杂抽;否則诈唬,WebKit申請(qǐng)下載最新的資源內(nèi)容。
網(wǎng)絡(luò)棧
1. 代理
2. 域名解析(DNS)
一般在建立TCP連接之前要解析域名默怨,為了考慮效率讯榕,使用HostCache類來(lái)保存解析后的域名,最多時(shí)會(huì)有多達(dá)1000個(gè)的域名和地址映射關(guān)系會(huì)被存儲(chǔ)起來(lái)匙睹。
如果想要了解當(dāng)前域名解析詳情和HostCache中的信息愚屁,可以通過(guò)在Chrome瀏覽器的地址欄中輸入chrome://net-internals/#dns來(lái)查看。
3. 磁盤(pán)本地緩存
可以通過(guò)在地址欄輸入chrome://view-http-cache/來(lái)查看這些項(xiàng)痕檬。
4. Cookie機(jī)制
根據(jù)Cookie的時(shí)效性可以將Cookie分成兩種類型:
- 第一種是會(huì)話型Cookie(Session Cookie)霎槐,這些Cookie只是保存在內(nèi)存中,當(dāng)瀏覽器退出的時(shí)候即清除這些Cookie梦谜。
- 第二種是持續(xù)型Cookie(Persistent Cookie)丘跌,也就是當(dāng)瀏覽器退出的時(shí)候袭景,仍然保留Cookie的內(nèi)容。該類型的Cookie有一個(gè)有效期闭树,在有效期內(nèi)耸棒,每次訪問(wèn)該Cookie所屬域的時(shí)候,都需要將該Cookie發(fā)送給服務(wù)器报辱,這樣服務(wù)器能夠有效追蹤用戶的行為与殃。
5. 安全機(jī)制
HTTP是一種使用明文來(lái)傳輸數(shù)據(jù)的應(yīng)用層協(xié)議。構(gòu)建在SSL之上的HTTPS提供了安全的網(wǎng)絡(luò)傳輸機(jī)制碍现,現(xiàn)已被廣泛應(yīng)用在網(wǎng)絡(luò)上幅疼。
6. 高性能網(wǎng)絡(luò)棧
Chromium 的網(wǎng)絡(luò)模塊有兩個(gè)重要的目標(biāo),其一就是安全昼接,其二就是速度爽篷。
- DNS預(yù)取和TCP預(yù)取連接(Preconnect)
- 一次DNS查詢的平均時(shí)間大概是60~120ms之間或者更長(zhǎng),而TCP的三次握手時(shí)間大概也是幾十毫秒或者更長(zhǎng)慢睡。Chromium采用DNS預(yù)取和TCP預(yù)連接逐工。
- 可以顯示指定預(yù)取哪些域名來(lái)讓Chromium解析,具體做法如下:<link rel="dns-prefetch" href="http://this-is-a-dns-preftch-example.com">
- 還有在用戶地址中輸入地址后一睁,候選項(xiàng)同輸入的地址很匹配的時(shí)候钻弄,在用戶橋下回車鍵獲取該網(wǎng)頁(yè)之前,Chromium已經(jīng)開(kāi)始使用DNS預(yù)取技術(shù)解釋該域名了者吁。
- 可以在地址欄輸入chrome://dns/查看Chromium的DNS預(yù)取的域名窘俺。
- HTTP管線化(Pipelining)
- HTTP管線化技術(shù)是一項(xiàng)同時(shí)將多個(gè)HTTP請(qǐng)求一次性提交給服務(wù)器的技術(shù),因此無(wú)需等待服務(wù)器的回復(fù)复凳,因?yàn)樗赡軐⒍鄠€(gè)HTTP請(qǐng)求填充在一個(gè)TCP數(shù)據(jù)包內(nèi)瘤泪。
- 管線化需要通過(guò)永久連接(Persistent Connection)完成,并且只有GET和HEAD等請(qǐng)求可以進(jìn)行管線化育八,使用場(chǎng)景有很大的限制对途。
- SPDY
SPDY就是為了解決網(wǎng)絡(luò)延遲和安全性問(wèn)題。根據(jù)Google的官方數(shù)據(jù)髓棋,使用SPDY協(xié)議的服務(wù)器和客戶端可以將網(wǎng)絡(luò)加載的時(shí)間減少64%实檀,在HTTP2.0的草案中將引入SPDY協(xié)議,將其作為基礎(chǔ)來(lái)編寫(xiě)按声。
SPDY所處的層次.png
7. 高效的資源使用策略
- DNS和TCP連接
- 減少鏈接的重定向
- 利用DNS預(yù)取機(jī)制
- 搭建支持SPDY協(xié)議的服務(wù)器
- 避免錯(cuò)誤的鏈接請(qǐng)求
- 資源的數(shù)量
- 在HTML網(wǎng)頁(yè)中內(nèi)嵌小型的資源膳犹,也就是當(dāng)資源比較小的時(shí)候,開(kāi)發(fā)者可以將它們直接放在網(wǎng)頁(yè)中签则,可能的資源如CSS须床、JavaScript和圖片等。
- 合并一些資源渐裂,例如CSS豺旬、JavaScript和圖片钠惩。
- 資源的數(shù)據(jù)量
- 使用瀏覽器本地磁盤(pán)緩存機(jī)制限嫌。
- 啟用資源的壓縮技術(shù)霎肯,比如圖片資源拧晕,可以使用zip壓縮技術(shù)泽疆,然后在HTTP消息頭中說(shuō)明該資源經(jīng)過(guò)壓縮。