【參考位址】
在派生資源的載入中, subresourceloader 更多起到的是乙個**的作用,通過它的 client ( subresourceloaderclient 類)來完成操作。
各個載入階段的處理在 subresourceloaderclient 的派生類cachedresourcerequest,loader,iconloader 中完成。 client 會建立 subresourceloader。
請求發起階段, resourceloadscheduler 負責對 subresourceloader 進行排程。
document 類會建立 cachedresourceloader 類的物件 m_cachedresourceloader,這個類 ( 物件 ) 提供了對 document 的派生資源的訪問介面 requestimage ,requestcssstylesheet , requestusercssstylesheet , requestscript , requestfont ,requestxslstylesheet , requestlinkprefetch 。為了實現這些介面,cachedresourceloader 需要建立 cachedresourcerequest 物件來發起請求。
一般情況下,乙個 document 擁有乙個 cachedresourceloader 類例項。
memorycache 類則對提供快取條目的管理,可以方便地進行 add , remove ,快取淘汰等。具體的快取條目則是通過 cachedresource 類儲存, memorycache 類維護了乙個 hashmap 儲存所有快取條目。
hashmap m_resources;
cachedresourcerequest 依賴於 cachedresource, 在 cacheresourcerequest 的建構函式中,會傳入 cachedresource 物件作為引數。 cachedresource 既儲存響應體部,也儲存同 cache 相關的頭部。在發起請求前,會檢查是否有 cache 的 validator ,在收到響應的時候,則需要更新對應的頭部。 cachedresource 類實現了 rfc2616 中的快取一節。實際上 cachedresource 類真正完成了同網路的通訊。 cachedresource 類根據申請的資源型別派生出不同的子類
對於資源的載入客戶端cacheresourceclient及其子類的關係如圖
cachedresource 類的使用者必須是 cachedresourceclient, 在這個類中維護了cachedresourceclient 類的集合 m_clients 。每乙個 client 通過 addclient 和removeclient 將自己加入到該類的 client 集合中。 cachedresourceclientwalker 則提供了 cachedresouceclient 的乙個遍歷介面。當資料來齊的時候, cachedresource 類會通過 cachedresouceclient::notifyfinished 介面通知使用者。
下圖是 image 元素對應的幾個類關係
下面以 image 為例分析其載入過程
1. 解析 html 頁面的時候,解析到 img 標籤,呼叫 htmlimageelement::create建立 htmlimageelement 物件,該物件包含 htmlimageloader 物件m_imageloader
2. 解析到 img 的 href 屬性,呼叫imageloader::updatefromelementignoringpreviouserror
3. 呼叫 imageloader::updatefromelement
4. 呼叫 cachedresourceloader::requestimage
5. 呼叫 cachedresourceloader::requestresource( 根據快取的情況確定是否可以從快取獲取,或者需要 revalidate ,或者需要直接從網路獲取 )
6. 呼叫 cachedresourceloader::loadresource
7. 根據 resource 的型別呼叫 createresource 建立對應的 cachedresource
8. 呼叫 memorycache::add 在 cache 中查詢是否有對應的 cache 條目,如果沒有建立之
9. 呼叫 cachedimage::load
10. 呼叫 cachedresource::load
11. 呼叫 cachedresourceloader::load
12. 呼叫 cachedresourcerequest::load
13. 建立 cachedresourcerequest 物件,它將作為 subresourceloader 的 client
14. 呼叫 resourceloaderscheduler::schedulesubresourceload
15. 呼叫 subresourceloader::create
16. resourceloadscheduler::requesttimerfired
17. 呼叫 resourceloader::start
18. 呼叫 resourcehandle::create 發起請求
19. 收到 http 響應頭部,呼叫 resourceloader::didreceiveresponse
20. 呼叫 subresourceloader::didireceiveresponse
21. 呼叫 cachedresourcerequest::didreceiveresponse 處理響應頭部,特別是同快取相關的頭部,比如 304 的 status code
22. 呼叫 resourceloader::didreceiveresponse
23. 收到體部資料,呼叫 resourceloader::didreceivedata
24. 呼叫 subresourceloader::didreceivedata
25. 呼叫 resourceloader::didreceivedata
26. 呼叫 resourceloader::adddata 將資料儲存到 sharedbuffer 裡面
27. 呼叫 cachedresourcerequest::didreceivedata
28. 資料來齊 , 呼叫 resourceloader::didfinishloading
29. 呼叫 subresourceloader::didfinishloading
30. 呼叫 cachedresourcerequest::didfinishloading
31. 呼叫 cachedresource::finish
32. 呼叫 cachedresourceloader::loaddone
33. 呼叫 cachedimage::data ,建立對應的 image 物件,解碼
WebKit之頁面載入
website webkit在渲染一張頁面之前,首先,需要從網路上載入頁面資料,以及頁面中所使用到的 指令碼 css等資源。然後,通過布局引擎將獲取的資源資訊布局。最後,渲染引擎將資料渲染到瀏覽器的檢視中。那麼,網頁資料資源在webkit中是如何被載入的,以及載入過程中涉及了那些元件模組呢?在web...
AssetBundle資源載入
一 第一種載入方式本地相對路徑資源載入 assetbundle ab assetbundle.loadfromfile assetbundle sphere.unity3d 本地載入相對路徑載入 載入ab包 gameobject cube ab.loadasset sphere 獲取ab包 inst...
資源預載入
提到前端效能優化時,我們首先會聯想到檔案的合併 壓縮,檔案快取和開啟伺服器端的gzip壓縮等,這使得頁面載入更快,使用者可以盡快使用我們的 web 應用來達到他們的目標。資源預載入是另乙個效能優化技術,我們可以使用該技術來預先告知瀏覽器某些資源可能在將來會被使用到。引用 patrick hamann...