WebKit如何加載網頁

在能夠渲染一個網頁之前,WebKit需要把該網頁和它的子資源從網絡上下載下來。從網絡上加載資源涉及到很多層次。本文將重點解釋WebKit的主要的渲染組件,WebCore,是如何參與加載過程的。
WebKit包含兩條加載線,主文檔加載(加載文檔到frames中)和子資源(images and scripts)加載。下圖總結了兩條加載線所涉及的主要對象。


Loading Frames

FrameLoader負責加載文檔到frames中。當你點擊一個鏈接時,FrameLoader啓動,首先創建一個新的DocumentLoader對象,並處於“policy”狀態,等待WebKit客戶端確定如何處理這次加載。通常,客戶端將指示FrameLoader把加載當做一次正常的網頁瀏覽(Navigation)(另一個策略可能是阻止加載)。
FrameLoader收到導航指示後,它會把DocumentLoader推進到“provisional"狀態,FrameLoader發出一個網絡請求,並等着確定網絡請求是否導致了內容下載或新文檔。
接着,DocumentLoader創建一個MainResourceLoader,它的工作是通過ResourceHandle接口與平臺網絡庫進行交互。分爲DocumentLoader和MainResourceLoader有兩個目的:(1) MainResourceLoader對DocumentLoader(被綁定到Document)隔離了處理ResourceHandle回調的細節 (2) 使得MainResourceLoader的生命週期與DocumentLoader的生命週期相互獨立。
一旦加載系統已經從網絡收到了足夠多的信息,可以確定該資源是一個文檔,FrameLoader就把DocumentLoader推進到 "committed"狀態,對Frame進行轉化,顯示收到的新文檔。

子資源加載

當然,顯示一個網頁不僅僅需要組成主文檔的HTML。我們還需要加載主文檔引用的圖片、腳本、和其它子資源。DocLoader負責加載這些子資源。(注意,儘管DocumentLoader和DocLoader名字很類似,但它們扮演的角色是很不同的。)
讓我們以一個典型的例子,加載一副圖片爲例。DocLoader首先詢問Cache,內存中是否已有該圖片的副本(以一個CachedImage對象的形式存在)。如果該圖片已經在緩存中,DocLoader就能立即使用緩存中的副本做爲響應。出於效率考慮,the Cache常常在視頻內存中保存解碼後的圖片,這樣WebKit就不必重複解壓同一副圖片。
如果圖片不在緩存中,the Cache就創建一個新的CachedImage對象來代表這幅圖片。CacheImage對象通知"Loader"對象發送一個網絡請求,Loader通過創建一個SubresourceLoader來完成這件事情。SubresourceLoader在子資源加載線中扮演的角色類似於MainResourceLader在主文檔加載線中扮演的角色,它們都最爲直接的同平臺相關的ResourceHandle接口進行交互。

改進的地方

我們可以從很多方面來改進WebKit的加載流水線。FrameLoader沒必要那麼複雜的,而且它包括了很多任務,而不僅僅是簡單的加載一個frame。例如,FrameLoader有許多略微不同的“load”方法,可能引起混淆,而且它還負責創建新的窗口(new windows),這看起來和加載a frame沒什麼關係。此外,加載流水線的各種策略耦合過緊,還有很多地方低層對象直接同高層對象交互,這違反了分層原則。例如,MainResourceLoader把從網絡層收到的字節直接發送給FrameLoader,而不是DocumentLader。
如果你仔細看了上面的圖,你會注意到只有子資源纔用到了Cache。顯然,主文檔加載沒有利用到WebKit的memory cache。如果我們能統一這兩條加載線,我們就可以改善主文檔加載的性能。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章