WebKit加載網頁的流程


 WebKit加載網頁的流程

摘要:WebKit源碼分析,WebKit文檔,WebCore,loader,ResourceLoader,MainResourceLoader,SubresourceLoader,DocumentLoader,WebKit加載流程,瀏覽器,Chrome,dlmu2001,FrameLoader,框架

在WebKit渲染一個頁面之前,它需要從網絡上(其實也可以從本地文件或者內存加載)加載頁面以及和它相關的所有派生資源。同加載資源相關的層有很多,在本文中,我將聚焦於解釋WebCore,這一WebKit的主要渲染模塊,如何參與到加載過程中的。

WebKit有兩條加載路線,一條是加載documents到frames里面,另一條是加載派生資源(比如圖片和腳本)。下圖總結出了這兩條路線涉及到的主要對象。

loader

 

加載Frames

FrameLoader類負責將documents加載到Frames。當你點擊一個鏈接的時候,FrameLoader創建一個新的處於”policy”狀態的DocumentLoader對象,等待WebKit客戶端決定是否處理這個加載。通常WebKit客戶端會指示FrameLoader將這個加載視為一個導航(navigation),而不是阻止加載等。

一旦客戶端指示FrameLoader將本次加載視為一個導航,FrameLoader就推動DocumentLoader進入”provisional”狀態,在該狀態,DocumentLoader會發起一個網絡請求,並等待以確定網絡請求將發起一個下載還是一個新的document。

接下去,DocumentLoader會創建一個MainResourceLoader對象,這個對象主要用來通過ResourceHandle接口同平台網絡庫進行交互。將MainResourceLoader和DocumentLoader分開來主要有兩個目的:(1)MainResourceLoader讓DocumentLoader從處理ResourceHandle回調的細節中抽身出來(2)降低MainResourceLoader的生命周期和DocumentLoader的生命周期(同Document綁定)的耦合度。

一旦加載系統接收到足夠的信息可以確定資源確實代表了document,FrameLoader就將DocumentLoader推向”committed”狀態,在該狀態中,frame將顯示document。

加載派生資源

顯示一個Web頁面,不只是需要組成document的HTML,還需要加載document引用到的圖片,腳本及其它派生資源。DocLoader類負責加載這些派生資源。(注意DocumentLoader和DocLoader有非常相似的名字,但是他們的作用是完全不同的)。

以加載一個圖片為例,加載圖片時,DocLoader首先詢問Cache,在內存中是否有該圖片的拷貝(即CachedImage對象)。如果圖片已經在Cache中,DocLoader可以以該Cache中的圖片立即響應。更有效率更高者,Cache在video內存保留了解碼過的圖片,這樣webkit連解碼圖片的過程都不需要了。

如果圖片不再Cache中,Cache就會創建一個新的CachedImage對象來代表image。然后CachedImage對象要求Loader對象發起一個網絡請求,Loader對象創建SubresourceLoader。SubresourceLoader在派生資源加載路線上的作用同MainResourceLoader在主資源加載路線上的作用一樣,它也是用來同ResourceHandle直接打交道。

可以優化的地方

加載路線上有很多地方可以優化。FrameLoader過於復雜,承擔了不止是加載一個frame的任務。比如,FrameLoader有好幾個非常相近的名為“load”的方法,非常容易混淆,並負責創建新窗口,這個同加載frame是沒有關系的。另外,有很多越級行為,比如,MainResourceLoader將收到的字節直接傳給了FrameLoader,而不是DocumentLoader。

從上圖可以看出,Cache只要於派生資源(subresource)。主資源的加載並沒有從WebKit的內存cache中獲益。如果我們結合這兩條路線,我們可以提高主資源加載的性能。

版權聲明:本文為翻譯文檔,原文地址http://webkit.org/blog/1188/how-webkit-loads-a-web-page/,譯者dlmu2001,如轉載,請注明出處,謝謝。


 

http://blog.csdn.net/dlmu2001/article/details/5941432


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM