日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

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

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

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

前言

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

背景

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

  • 白屏時間
  • 首屏時間

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

白屏時間

是什么?

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

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

怎么算?

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

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

首屏時間

是什么?

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

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

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

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

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

為什么不直接用nextTick?

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

怎么算?

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

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

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

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

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

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

首屏時間實踐

現在我們開始計算首屏時間吧!NQr28資訊網——每日最新資訊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,我們看看它長什么樣?NQr28資訊網——每日最新資訊28at.com

計算首屏時間

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

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

所以我們開始計算吧:NQr28資訊網——每日最新資訊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)}

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

總結

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

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

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

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

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

標簽:
  • 熱門焦點
  • 三言兩語說透設計模式的藝術-簡單工廠模式

    一、寫在前面工廠模式是最常見的一種創建型設計模式,通常說的工廠模式指的是工廠方法模式,是使用頻率最高的工廠模式。簡單工廠模式又稱為靜態工廠方法模式,不屬于GoF 23種設計
  • 三言兩語說透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術,可以幫助我們寫出更加優雅、泛用的函數。本文將首先介紹柯里化和反柯里化的概念、實現原理和應用
  • 多線程開發帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程
  • 這款新興工具平臺,讓你的電腦效率翻倍

    隨著信息技術的發展,我們獲取信息的渠道越來越多,但是處理信息的效率卻成為一個瓶頸。于是各種工具應運而生,都在爭相解決我們的工作效率問題。今天我要給大家介紹一款效率
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務,包括但不限于:開發某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 本地生活這塊肥肉,拼多多也想吃一口

    出品/壹覽商業 作者/李彥編輯/木魚拼多多也看上本地生活這塊蛋糕了。近期,拼多多在App首頁&ldquo;充值中心&rdquo;入口上線了本機生活界面。壹覽商業發現,該界面目前主要
  • 小米公益基金會捐贈2500萬元馳援北京、河北暴雨救災

    8月2日消息,今日小米科技創始人雷軍在其微博上發布消息稱,小米公益基金會宣布捐贈2500萬元馳援北京、河北暴雨救災。攜手抗災,京冀安康!以下為公告原文
  • iQOO Neo8 Pro評測:旗艦雙芯加持 最強性能游戲旗艦

    【Techweb評測】去年10月,iQOO推出了一款Neo7手機,該機搭載了聯發科天璣9000+,配備獨顯芯片Pro+,帶來了同價位段最佳的游戲體驗,一經上市便受到了諸多用
  • 微軟發布Windows 11新版 引入全新任務欄狀態

    近日,微軟發布了Windows 11新版,而Build 22563更新主要引入了幾周前曝光的平板模式任務欄等,系統更流暢了。更新中,Windows 11加入了專門針對平板優化的任務欄
Top 主站蜘蛛池模板: 利川市| 象州县| 绥德县| 龙州县| 柳江县| 静安区| 周宁县| 扎赉特旗| 微博| 中牟县| 迭部县| 高密市| 汉源县| 迁安市| 祁门县| 永昌县| 岳普湖县| 微山县| 思南县| 麻江县| 车致| 吉木乃县| 房产| 望都县| 银川市| 宁蒗| 靖远县| 新源县| 梧州市| 鄱阳县| 柏乡县| 陕西省| 拜城县| 博野县| 建始县| 禄劝| 抚松县| 府谷县| 屏东县| 罗山县| 隆子县|