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

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

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

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

前言

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

背景

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

  • 白屏時間
  • 首屏時間

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

白屏時間

是什么?

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

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

怎么算?

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

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

首屏時間

是什么?

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

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

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

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

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

為什么不直接用nextTick?

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

怎么算?

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

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

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

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

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

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

首屏時間實踐

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

計算首屏時間

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

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

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

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

總結

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

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

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

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

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

標簽:
  • 熱門焦點
  • 一加Ace2 Pro官宣:普及16G內存 引領24G

    一加官方今天繼續為本月發布的新機一加Ace2 Pro帶來預熱,公布了內存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引領,還有呢?#一加Ace2Pro#,2023 年 8 月,敬請期待。”同時
  • 盧偉冰長文解析K60至尊版 對Redmi有著里程碑式的意義

    在今天的Redmi后性能時代戰略發布會結束之后,Redmi總經理盧偉冰又帶來了一篇長文,詳解了為什么 Redmi 要開啟后性能時代?為什么選擇和 MediaTek、Pixelworks 深度合作?以及后性
  • 7月安卓手機好評榜:三星S23Ultra好評率第一

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年7月1日至7月31日,僅限國內市場。第一名:三星Galaxy S23 Ultra好評率:95.71%在即將迎來新
  • 6月安卓手機好評榜:魅族20 Pro蟬聯冠軍

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年6月1日至6月30日,僅限國內市場。第一名:魅族20 Pro好評率:95%5月份的時候魅族20 Pro就是
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對Reader和Writer接口的組合,
  • Java NIO內存映射文件:提高文件讀寫效率的優秀實踐!

    Java的NIO庫提供了內存映射文件的支持,它可以將文件映射到內存中,從而可以更快地讀取和寫入文件數據。本文將對Java內存映射文件進行詳細的介紹和演示。內存映射文件概述內存
  • 企業采用CRM系統的11個好處

    客戶關系管理(CRM)軟件可以為企業提供很多的好處,從客戶保留到提高生產力。  CRM軟件用于企業收集客戶互動,以改善客戶體驗和滿意度。  CRM軟件市場規模如今超過580
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個人開發仿造稿定設計的圖片編輯器到現在,不知不覺已過去一年時間了,期間我經歷了裁員失業、面試找工作碰壁,寒冬下一直沒有很好地履行計劃.....這些就放在日
  • “買真退假” 這種“羊毛”不能薅

    □ 法治日報 記者 王春   □ 本報通訊員 胡佳麗  2020年初,還在上大學的小東加入了一個大學生兼職QQ群。群主&ldquo;七王&rdquo;在群里介紹一些刷單賺
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
黄色一区二区在线| 久久精品国产一区二区三| 1769国产精品| 影音先锋中文字幕一区| 极品尤物av久久免费看| 伊人成人在线视频| 亚洲激情在线激情| 国产人成精品一区二区三| 国产专区精品视频| 亚洲国产精品www| 日韩一级在线| 亚洲免费婷婷| 久久精品午夜| 欧美国产日韩精品免费观看| 欧美日韩视频在线一区二区| 国产精品一二三| 黄色日韩网站| 亚洲国语精品自产拍在线观看| 亚洲经典在线看| 9久草视频在线视频精品| 亚洲欧美第一页| 久久久青草青青国产亚洲免观| 欧美电影免费观看高清完整版| 欧美午夜精品一区二区三区| 国产午夜精品久久久久久免费视| 1024成人| 亚洲一区二区三区在线播放| 久久精品人人做人人爽| 欧美黄色aa电影| 国产精品揄拍500视频| 精品电影在线观看| 一本久久青青| 午夜久久tv| 欧美插天视频在线播放| 国产精品乱码妇女bbbb| 精品电影一区| 一区二区三区av| 中文日韩电影网站| 久久精品亚洲一区二区| 欧美美女福利视频| 国产日本欧美一区二区三区| 91久久一区二区| 欧美一乱一性一交一视频| 欧美成人在线网站| 国产欧美日韩不卡免费| 亚洲精品久久久久久久久久久久久 | 在线日韩一区二区| 亚洲一二三级电影| 米奇777超碰欧美日韩亚洲| 国产精品美女久久久久aⅴ国产馆| 在线精品国产欧美| 午夜在线视频观看日韩17c| 欧美激情一区二区三区全黄| 国产一区二区三区直播精品电影| 亚洲精品美女久久7777777| 亚洲一区二区三区四区在线观看| 久热精品在线视频| 国产欧美日韩精品在线| 一区二区三区高清不卡| 另类图片综合电影| 国产精品av一区二区| 影音先锋亚洲视频| 亚洲一区尤物| 欧美精品午夜视频| 伊人成年综合电影网| 欧美在线日韩精品| 国产精品大片wwwwww| 影音先锋欧美精品| 欧美在线你懂的| 欧美日韩激情网| 亚洲国产成人精品久久久国产成人一区 | 亚洲国产欧美日韩精品| 欧美一区二区三区在线看| 欧美日韩亚洲激情| 91久久视频| 老司机一区二区三区| 国产欧美日韩一级| 亚洲欧美激情在线视频| 欧美天堂亚洲电影院在线播放| 91久久综合亚洲鲁鲁五月天| 久久亚洲免费| 黄色亚洲在线| 久久精品综合网| 国产色爱av资源综合区| 午夜国产一区| 国产精品青草综合久久久久99 | 精品88久久久久88久久久| 欧美一区二区久久久| 国产精品久久一区主播| 中文一区二区| 欧美三区美女| 中文精品视频一区二区在线观看| 欧美日本一道本在线视频| 揄拍成人国产精品视频| 久久蜜桃香蕉精品一区二区三区| 国产视频在线观看一区二区三区| 亚洲男人第一网站| 国产精品资源在线观看| 先锋影音久久久| 国产日韩欧美精品一区| 欧美一激情一区二区三区| 国产手机视频精品| 久久国产99| 激情欧美丁香| 蜜桃久久av一区| 亚洲国产视频a| 欧美国产第二页| 日韩一二三区视频| 欧美福利一区二区| 日韩午夜电影av| 欧美日韩美女在线| 亚洲视屏在线播放| 国产精品美女久久久| 午夜激情一区| 国产在线精品二区| 久久亚洲春色中文字幕| 在线观看三级视频欧美| 蜜臀va亚洲va欧美va天堂| 亚洲精品123区| 欧美日本在线看| 这里只有精品视频在线| 国产精品视频成人| 久久精品国产亚洲a| 亚洲第一精品夜夜躁人人躁 | 久热这里只精品99re8久| 精品成人乱色一区二区| 欧美成人午夜| 亚洲私人影院| 国产亚洲欧洲| 女女同性精品视频| a91a精品视频在线观看| 国产精品一区二区女厕厕| 久久riav二区三区| 最新日韩欧美| 国产精品九九| 久久成人精品| 合欧美一区二区三区| 蜜桃av噜噜一区二区三区| 亚洲国产欧美另类丝袜| 欧美电影打屁股sp| 亚洲一区二区三区精品在线| 国产在线精品一区二区中文| 欧美成在线观看| 亚洲伊人网站| 永久91嫩草亚洲精品人人| 午夜精品久久久久久久久久久久久| 欧美成人激情视频| 99re66热这里只有精品4| 国产精品入口日韩视频大尺度| 久久久久国产精品一区二区| 亚洲高清毛片| 欧美午夜影院| 久久久久久久一区二区三区| 99精品国产福利在线观看免费| 久久久久久久高潮| 日韩视频免费在线观看| 国产美女精品视频| 欧美chengren| 午夜一区二区三区在线观看| 在线观看视频欧美| 欧美国产亚洲精品久久久8v| 亚洲一区二区成人| 亚洲第一精品影视| 欧美午夜久久| 久久蜜桃资源一区二区老牛 | 亚洲激情在线激情| 欧美视频在线看| 久久精品中文| 亚洲视频高清| 亚洲人成毛片在线播放| 国产精品欧美日韩一区| 欧美大片在线看| 久久都是精品| 亚洲无吗在线| 亚洲国产精品一区二区第四页av| 国产精品日韩在线播放| 欧美激情一二三区| 久久国产精品第一页 | 欧美一级黄色网| 亚洲卡通欧美制服中文| 黄网动漫久久久| 国产亚洲福利一区| 国产农村妇女精品| 国产精品久久久一区二区| 欧美日韩一区二区欧美激情| 欧美日韩国产综合新一区| 欧美电影资源| 免费在线国产精品| 麻豆精品91| 老司机精品视频一区二区三区| 久久久久久久91| 久久精品国产清高在天天线| 欧美一区激情| 久久国产精品亚洲va麻豆| 欧美一区二区三区四区在线观看地址 | 激情视频一区二区| 国产综合视频在线观看| 国内揄拍国内精品久久| 国产一区日韩二区欧美三区| 国产日韩欧美在线播放不卡| 国产日韩专区| 狠狠色狠狠色综合| 在线播放视频一区| 亚洲国产精品女人久久久|