WebKit內核加載渲染網頁的過程

WebKit引擎快速的原因
服務器君一共花費了170.318 ms進行了6次數據庫查詢,努力地為您提供了這個頁面。
試試閱讀模式?希望聽取您的建議

在WebKit渲染網頁之前,它需要將頁面和所有引用的資源加載完畢。其中會涉及到不同層面的工作。在本文中,我將重點關注WebCore(WebKit中主要渲染組件)是如何在加載過程中發揮作用的。

WebKit包含兩條加載流水線,其中一條負責將文檔加載到frames當中,另一條負責加載其他資源(比如圖片、腳本一類)。下圖描述了兩條流水線中涉及的主要對象。

加載Frames

FrameLoader負責將文檔加載到frames當中,當點擊鏈接時,FrameLoader會創建一個新的DocumentLoader對象,并置于“policy”狀態,接著就等待WebKit客戶端決定該如何處理這次加載。通常,客戶端會告訴FrameLoader將加載操作視為一次導航(而不是一次加載阻塞)

一旦客戶端告訴FrameLoader將加載視作導航,FrameLoader將DocumentLoader置于“provisional”狀態,此時將開始網絡請求并等待結論:這個網絡請求最終是下載一個文件還是一份可解析的文檔。

DocumentLoader接下來會創建MainResourceLoader對象,它的作用是與瀏覽器所運行的系統所提供的網絡庫打交道,網絡庫通過ResourceHandle接口提供。將MainResourceLoader和DocumentLoader分離開主要有兩個目的:

  1. MainResourceLoader處理ResourceHandle回調過程與DocumentLoader分離。
  2. MainResourceLoader對象的生命周期與DocumentLoader的生命周期解耦(DocumentLoader的生命周期與Document對象綁定在一起)。

一旦加載系統通過網絡獲得足夠多信息,以便把文檔進行呈現,FrameLoader將DocumentLoader置于“committed”狀態,這時Frame對象就要顯示這個新加載的文檔了。

加載子資源

網頁不僅僅由HTML組成。我們還需要加載其中的圖片、腳本等等。DocLoader對象就來負責加載這些資源(注意DocLoader和DocumentLoader名字很像,但是分工是不同的)。

我們以加載圖片為例。為了加載一張圖片,DocLoader首先詢問Cache是否已經有該圖片的副本(以CachedImage對象存在)。如果存在,DocLoader則可快速響應。為了更加高效,Cache經常在內存中保存解碼之后的圖片數據,這樣避免解碼兩次。

如果圖片沒有在Cache中,Cache會創建一個CachedImage對象來表示這個圖片。CachedImage對象讓Loader對象來發起網絡請求,Loader會創建SubresourceLoader來做這個事情。SubresourceLoader所扮演的角色與剛剛介紹的MainResourceLoader的角色類似。

改進點

WebKit加載流水線當中有很多需要改進的地方。FrameLoader過于復雜,除了加載frame以外還承擔了很多其他工作。比如,FrameLoader有好幾個名為“load”的方法,很容混淆。它來負責創建窗口,看上去和加載frame沒有什么關系。另外,加載流水線的若干階段沒有必要像現在耦合的這么緊,層次劃分也不合理,存在不同層次的對象互相訪問,比如:MainResourceLoader將獲取到的字節直接丟給FrameLoader而不是DocumentLoader。

如果研究了上面的圖,你會發現Cache只會被子資源利用。主要資源的加載并沒有得到WebKit內存緩存的支持。如果能夠統一這兩個加載過程,那么主資源的加載性能也會得到提升。一直以來我們都在不斷優化性能來讓頁面加載的越來越快。

本文地址:http://www.snpmgr.live/librarys/veda/detail/2030,歡迎訪問原出處。

不打個分嗎?

轉載隨意,但請帶上本文地址:

http://www.snpmgr.live/librarys/veda/detail/2030

如果你認為這篇文章值得更多人閱讀,歡迎使用下面的分享功能。
小提示:您可以按快捷鍵 Ctrl + D,或點此 加入收藏。

大家都在看

閱讀一百本計算機著作吧,少年

很多人覺得自己技術進步很慢,學習效率低,我覺得一個重要原因是看的書少了。多少是多呢?起碼得看3、4、5、6米吧。給個具體的數量,那就100本書吧。很多人知識結構不好而且不系統,因為在特定領域有一個足夠量的知識量+足夠良好的知識結構,系統化以后就足以應對大量未曾遇到過的問題。

奉勸自學者:構建特定領域的知識結構體系的路徑中再也沒有比學習該專業的專業課程更好的了。如果我的知識結構體系足以囊括面試官的大部分甚至吞并他的知識結構體系的話,讀到他言語中的一個詞我們就已經知道他要表達什么,我們可以讓他坐“上位”畢竟他是面試官,但是在知識結構體系以及心理上我們就居高臨下。

所以,閱讀一百本計算機著作吧,少年!

《Python學習手冊(第4版)》 魯特茲(Mark Lutz) (作者), 李軍 (譯者), 劉紅偉 (譯者), 等 (譯者)

《Python學習手冊(第4版)》學習Python的主要內建對象類型:數字、列表和字典。使用Python語句創建和處理對象,并且學習Python的通用語法模型。使用函數構造和重用代碼,函數是Python的基本過程工具。學習Python模塊:封裝語句、函數以及其他工具,以便構建較大的組件。學習Python的面向對象編程工具,用于組織程序代碼。學習異常處理模型,以及用于編寫較大程序的開發工具。了解高級Python工具,如裝飾器、描述器、元類和Unicode處理等。

更多計算機寶庫...

燃烧吧足球登陆 贵州麻将规则 pc蛋蛋论坛 江苏11选五遗漏前三直 丫丫陕西渭南麻将下载 北京快乐8网易开奖结果 财富之都 陕西11选5复式怎么玩 玩牛牛的技巧经验心得 吉林白城吉祥麻将手机版 广东快乐10分钟开奖结果 官方信誉好的棋牌平台 湖南闲来麻将苹果 新25选7开奖结果查询 意大利vs乌拉圭比分预测 上海快三专家预测号 3d图谜天齐网