AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

首屏時間,你說你優化了,那你倒是計算出來給我看啊!

來源: 責編: 時間:2024-04-15 18:17:11 173觀看
導讀前言大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心背景當我們在做項目的性能優化的時候,優化首屏時間是一個避不過去的優化方向,但是又有多少人想過這兩個東西的區別呢:白屏時

前言

大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心uRF28資訊網——每日最新資訊28at.com

背景

當我們在做項目的性能優化的時候,優化首屏時間是一個避不過去的優化方向,但是又有多少人想過這兩個東西的區別呢:uRF28資訊網——每日最新資訊28at.com

  • 白屏時間
  • 首屏時間

并且這兩個時間的計算方式又有什么區別呢?接下來我就給大家講一下吧!uRF28資訊網——每日最新資訊28at.com

白屏時間

是什么?

白屏時間指的是:頁面開始顯示內容的時間。也就是:瀏覽器顯示第一個字符或者元素的時間uRF28資訊網——每日最新資訊28at.com

圖片圖片uRF28資訊網——每日最新資訊28at.com

怎么算?

我們只需要知道瀏覽器開始顯示內容的時間點,即頁面白屏結束時間點即可獲取到頁面的白屏時間。uRF28資訊網——每日最新資訊28at.com

因此,我們通常認為瀏覽器開始渲染<body>標簽或者解析完<head>標簽的時刻就是頁面白屏結束的時間點。uRF28資訊網——每日最新資訊28at.com

  • 瀏覽器支持performance.timing
<head>  <title>Document</title></head><script type="text/javascript">  // 白屏時間結束點  var firstPaint = Date.now()  var start = performance.timing.navigationStart  console.log(firstPaint - start)</script>
  • 瀏覽器不支持performance.timing
<head>  <title>Document</title>  <script type="text/javascript">    window.start = Date.now();  </script></head><script type="text/javascript">  // 白屏時間結束點  var firstPaint = Date.now()  console.log(firstPaint - window.start)</script>

首屏時間

是什么?

首屏時間是指用戶打開網站開始,到瀏覽器首屏內容渲染完成的時間。對于用戶體驗來說,首屏時間是用戶對一個網站的重要體驗因素。uRF28資訊網——每日最新資訊28at.com

圖片圖片uRF28資訊網——每日最新資訊28at.com

為什么不直接用生命周期?

有些小伙伴會說:為啥不直接在App.vue的mounted生命周期里計算時間呢?大家可以看看,官網說了mounted執行并不代表首屏所有元素加載完畢,所以mounted計算出來的時間會偏短。uRF28資訊網——每日最新資訊28at.com

圖片圖片uRF28資訊網——每日最新資訊28at.com

為什么不直接用nextTick?

nextTick回調的時候,首屏的DOM都渲染出來了,但是計算首屏時間并不需要渲染所有DOM,所以計算出來的時間會偏長uRF28資訊網——每日最新資訊28at.com

怎么算?

我們需要利用MutationObserver監控DOM的變化,監控每一次DOM變化的分數,計算的規則為: (1 + 層數 * 0.5),我舉個例子:uRF28資訊網——每日最新資訊28at.com

<body>    <div>      <div>1</div>      <div>2</div>    </div></body>

以上DOM結構的分數為:uRF28資訊網——每日最新資訊28at.com

1.5 + 2 + 2.5 + 2.5 = 8.5(分)uRF28資訊網——每日最新資訊28at.com

圖片圖片uRF28資訊網——每日最新資訊28at.com

其實在首屏的加載中,會涉及到DOM的增加、修改、刪除,所以會觸發多次MutationObserver,所以會統計出不同階段的score,我們把這些score存放在一個數組observerData中,后面大有用處uRF28資訊網——每日最新資訊28at.com

首屏時間實踐

現在我們開始計算首屏時間吧!uRF28資訊網——每日最新資訊28at.com

前置準備

  • index.html:html頁面
<!DOCTYPE html><html lang="en">  <head> </head>  <body>    <div>      <div>        <div>1</div>        <div>2</div>      </div>      <div>3</div>      <div>4</div>    </div>    <ul id="ulbox"></ul>  </body>  <script src="./computed.js"></script>  <script src="./request.js"></script></html>
  • computed.js:計算首屏時間的文件
const observerData = []let observer = new MutationObserver(() => {  // 計算每次DOM修改時,距離頁面剛開始加載的時間  const start = window.performance.timing.navigationStart  const time = new Date().getTime() - start    const body = document.querySelector('body')  const score = computedScore(body, 1)  // 加到數組 observerData 中  observerData.push({    score,    time  })})observer.observe(  document, {    childList: true,    subtree: true  })function computedScore(element, layer) {  let score = 0  const tagName = element.tagName  // 排除這些標簽的情況  if (    tagName !== 'SCRIPT' &&    tagName !== 'STYLE' &&    tagName !== 'META' &&    tagName !== 'HEAD'  ) {    const children = element.children    if (children && children.length) {      // 遞歸計算分數      for (let i = 0; i < children.length; i++) {        score += computedScore(children[i], layer + 1)      }    }    score += 1 + 0.5 * layer  }  return score}
  • request.js:模擬請求修改DOM
// 模擬請求列表const requestList = () => {  return new Promise((resolve) => {    setTimeout(() => {      resolve(        [1, 2, 3,          4, 5, 6,          7, 8, 9        ]      )    }, 1000)  })}const ulbox = document.getElementById('ulbox')// 模擬請求數據渲染列表const renderList = async () => {  const list = await requestList()  const fragment = document.createDocumentFragment()  for (let i = 0; i < list.length; i++) {    const li = document.createElement('li')    li.innerText = list[i]    fragment.appendChild(li)  }  ulbox.appendChild(fragment)}// 模擬對列表進行輕微修改const addList = async () => {  const li = document.createElement('li')  li.innerText = '加上去'  ulbox.appendChild(li)}(async () => {  // 模擬請求數據渲染列表  await renderList()  // 模擬對列表進行輕微修改  addList()})()

observerData

當我們一切準備就緒后運行代碼,我們獲得了observerData,我們看看它長什么樣?uRF28資訊網——每日最新資訊28at.com

計算首屏時間

我們怎么根據observerData來計算首屏時間呢?我們可以這么算:下次分數比上次分數增加幅度最大的時間作為首屏時間uRF28資訊網——每日最新資訊28at.com

很多人會問了,為什么不是取最后一項的時間來當做首屏時間呢?大家要注意了:首屏并不是所有DOM都渲染,我就拿剛剛的代碼來舉例吧,我們渲染完了列表,然后再去增加一個li,那你是覺得哪個時間段算是首屏呢?應該是渲染完列表后算首屏完成,因為后面只增加了一個li,分數的漲幅較小,可以忽略不計uRF28資訊網——每日最新資訊28at.com

所以我們開始計算吧:uRF28資訊網——每日最新資訊28at.com

const observerData = []let observer = new MutationObserver(() => {  // 計算每次DOM修改時,距離頁面剛開始加載的時間  const start = window.performance.timing.navigationStart  const time = new Date().getTime() - start  const body = document.querySelector('body')  const score = computedScore(body, 1)  observerData.push({    score,    time  })  // complete時去調用 unmountObserver  if (document.readyState === 'complete') {    // 只計算10秒內渲染時間    unmountObserver(10000)  }})observer.observe(  document, {    childList: true,    subtree: true  })function computedScore(element, layer) {  let score = 0  const tagName = element.tagName  // 排除這些標簽的情況  if (    tagName !== 'SCRIPT' &&    tagName !== 'STYLE' &&    tagName !== 'META' &&    tagName !== 'HEAD'  ) {    const children = element.children    if (children && children.length) {      // 遞歸計算分數      for (let i = 0; i < children.length; i++) {        score += computedScore(children[i], layer + 1)      }    }    score += 1 + 0.5 * layer  }  return score}// 計算首屏時間function getFirstScreenTime() {  let data = null  for (let i = 1; i < observerData.length; i++) {    // 計算幅度    const differ = observerData[i].score - observerData[i - 1].score    // 取最大幅度,記錄對應時間    if (!data || data.rate <= differ) {      data = {        time: observerData[i].time,        rate: differ      }    }  }  return data}let timer = nullfunction unmountObserver(delay) {  if (timer) return  timer = setTimeout(() => {    // 輸出首屏時間    console.log(getFirstScreenTime())    // 終止MutationObserver的監控    observer.disconnect()    observer = null    clearTimeout(timer)  }, delay)}

計算出首屏時間1020msuRF28資訊網——每日最新資訊28at.com

總結

我這個計算方法其實很多漏洞,沒把刪除元素也考慮進去,但是想讓大家知道計算首屏時間的計算思想,這才是最重要的,希望大家能理解這個計算思想。uRF28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-83640-0.html首屏時間,你說你優化了,那你倒是計算出來給我看啊!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 改造 console.log!也能提高團隊開發效率?

下一篇: 阿里一面:如何將重復性比較高的 String 類型的地址信息從 20GB 降到幾百兆?

標簽:
  • 熱門焦點
  • 摸魚心法第一章——和配置文件說拜拜

    為了能摸魚我們團隊做了容器化,但是帶來的問題是服務配置文件很麻煩,然后大家在群里進行了“親切友好”的溝通圖片圖片圖片圖片對比就對比,簡單對比下獨立配置中心和k8s作為配
  • Automa-通過連接塊來自動化你的瀏覽器

    1、前言通過瀏覽器插件可實現自動化腳本的錄制與編寫,具有代表性的工具就是:Selenium IDE、Katalon Recorder,對于簡單的業務來說可快速實現自動化的上手工作。Selenium IDEKat
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對Reader和Writer接口的組合,
  • 從 Pulsar Client 的原理到它的監控面板

    背景前段時間業務團隊偶爾會碰到一些 Pulsar 使用的問題,比如消息阻塞不消費了、生產者消息發送緩慢等各種問題。雖然我們有個監控頁面可以根據 topic 維度查看他的發送狀態,
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當時用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反
  • 2023年,我眼中的字節跳動

    此時此刻(2023年7月),字節跳動從未上市,也從未公布過任何官方的上市計劃;但是這并不妨礙它成為中國最受關注的互聯網公司之一。從2016-17年的抖音強勢崛起,到2018年的&ldquo;頭騰
  • 半導體需求下滑 三星電子DS業務部門今年營業虧損預計超10萬億韓元

    7月17日消息,據外媒報道,去年下半年開始的半導體需求下滑,影響到了三星電子、SK海力士、英特爾等諸多廠商,營收明顯下滑,部分廠商甚至出現了虧損。作為
  • 榮耀Magicbook V 14 2021曙光藍版本正式開售,擁有觸摸屏

    榮耀 Magicbook V 14 2021 曙光藍版本正式開售,搭載 i7-11390H 處理器與 MX450 顯卡,配備 16GB 內存與 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 鍵盤鍵程、
  • 微軟發布Windows 11新版 引入全新任務欄狀態

    近日,微軟發布了Windows 11新版,而Build 22563更新主要引入了幾周前曝光的平板模式任務欄等,系統更流暢了。更新中,Windows 11加入了專門針對平板優化的任務欄
Top