網頁生成過程,大致可以分成五步

2021-08-22 19:41:28 字數 2543 閱讀 8380

網頁生成過程,大致可以分成五步

1. html**轉化為dom

2. css**轉化成cssom(css object model)

3. 結合dom和cssom,生成一棵渲染樹(包含每個節點的視覺資訊)

4. 生成布局(layout),即將所有渲染樹的所有節點進行平面合成

5. 將布局繪製(paint)在螢幕上

在這五步裡面,第一步到第三部都非常快,第四步和第五步很耗時。

重排和重繪

網頁生成的時候,至少會渲染一次。而我們需要關注的是使用者訪問過程中,那些會導致網頁重新渲染的行為:

· 修改dom

· 修改樣式表

· 使用者事件(例如滑鼠懸停,頁面滾動,輸入框輸入文字等)

重新渲染,就涉及重排和重繪

重排(reflow)

即重新生成布局,重排必然導致重繪,如元素位置的改變,就會觸發重排和重繪。

重繪(repaint)

即重新繪製,需要注意的是,重繪不一定需要重排,比如改變某個元素的顏色,就只會觸發重繪,而不會觸發重排。

對於效能的影響

重排和重繪會不斷觸發,這是不可避免的,但是它們非常消耗資源,是導致網頁效能低下的根本原因。

提高網頁效能,就是要降低重排和重繪的頻率和成本,盡量少觸發重新渲染。

大部分瀏覽器通過佇列化修改和批量顯示優化重排版過程。然而有些操作會強迫重新整理並要求所有計畫改變的部分立刻應用。

本資料作為dom操作最佳實踐的補充

重新整理率網頁動畫的每一幀(frame)都是一次重新渲染,每秒低於24幀的動畫,人眼就能感受到停頓。一般的網頁動畫,需要達到每秒30幀到60幀的頻率,才能比較流暢。

而大多數顯示器的重新整理頻率是60hz,為了與系統一致,以及節省電力,瀏覽器會自動按照這個頻率,重新整理動畫。所以,如果網頁能夠做到每秒60幀,就會跟顯示器同步重新整理,達到最佳的視覺效果。這意味著,一秒之內進行60次重新渲染,每次重新渲染的時間不能超過16.66ms。

重新整理率fps(frame per second),即一秒之間能夠完成多少次重新渲染

開發者工具的timeline面板

通過js**實現 fps 的檢測

這個時候 我們拿 我去年寫的 vuejs 中文社群的**。來試一試

vuejs 中文社群

開啟控制台執行下面的**:

// 返回是否 有 requestanimationframe 方法  1000ms 會執行 60 次

var raf = function ()

);}();

var frame = 0;

var allframecount = 0;

var lasttime = date.now();

var lastfametime = date.now(www.baohuayule.net);

var loop = function () 1s內 fps:`, fps);

frame = 0;

lasttime = now;

};raf(loop);

}loop();

然後我們看到了如下的顯示:

mon aug 13 2018 20:14:44 gmt+0800 (中國標準時間) 1s內 fps: 60

mon aug 13 2018 20:14:45 gmt+0800 (中國標準時間) 1s內 fps: 60

mon aug 13 2018 20:14:46 gmt+0800 (中國標準時間) 1s內 fps: 55

mon aug 13 2018 20:14:47 gmt+0800 (中國標準時間) 1s內 fps: 60

mon aug 13 2018 20:14:48 gmt+0800 (中國標準時間) 1s內 fps: 60

mon aug 13 2018 20:14:49 gmt+0800 (中國標準時間) 1s內 fps: 60

mon aug 13 2018 20:14:50 gmt+0800 (中國標準時間) 1s內 fps: 58

mon aug 13 2018 20:14:51 gmt+0800 (中國標準時間) 1s內 fps: 60

mon aug 13 2018 20:14:52 gmt+0800 (中國標準時間) 1s內 fps: 60

mon aug 13 2018 20:14:53 gmt+0800 (中國標準時間) 1s內 fps: 60

mon aug 13 2018 20:14:54 gmt+0800 (中國標準時間) 1s內 fps: 56

mon aug 13 2018 20:14:55 gmt+0800 (中國標準時間) 1s內 fps: 59

剛剛好 螢幕的重新整理率就在 60 fps 左右, 很流暢。

寫在最後

在現在 vue 、recat 、 angular 三大框架盛行的當今,最原始的 瀏覽器渲染網頁的時候就做哪些事情或許我們已經忘記了一些。

這篇文章也只是做乙個基礎的記憶,網頁是如何進行渲染的,在這三大框架的下,虛擬dom 的出現,對於網頁載入有什麼優勢?

重排、重繪的時候就做哪些事情? 頁面渲染的效能瓶頸往往出現在**? 我們如何能夠減少這些效能消耗的操作?

這些疑問,都是這邊檔案做的乙個解釋。

springMvc原始碼大致過程

web.xml載入dispatcherservlet 子類兼有自己特性還有父類所有的特性,若有覆蓋方法的用子類自己的,父類的某個方法有入口作用 那麼如果用子類的話 子類 覆蓋了這個方法 子類的這個方法也就有了入口特性 源配入口 dispatcherservlet 應用上下文初始化 執行 通過各種 最...

實施過程的大致順序

1 實施文件中應詳細描述停機前所需檢查相關事項,列出允許停機的必要條件。2 實施文件中應詳細描述各伺服器停機順序。3 如果實施涉及更新 刪除原有資料,在操作前應先備份資料表,並統計出可能更改影響的資料行,最後所有操作執行完畢後核對預計影響行與實際影響行數是否相等。如果相等,執行commit指令 否則...

生成可重集的排列 (遞迴過程)

解釋一下劉汝佳的 就是這個遞迴只會考慮相同元素的第乙個,所以與前乙個相同的元素應當被忽略,第乙個元素由於沒有前面的元素,所以應當取走。注意這一行 觀察用例 3 1 1 1 有了這行 只會輸出乙個 1 1 1 但沒有這行 就會輸出27 個 1 1 1 3層迴圈,每層3個 3 3 可重集的全排列2 ru...