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

當(dāng)前位置:首頁 > 科技  > 軟件

首屏?xí)r間,你說你優(yōu)化了,那你倒是計(jì)算出來給我看啊!

來源: 責(zé)編: 時(shí)間:2024-04-15 18:17:11 194觀看
導(dǎo)讀前言大家好,我是林三心,用最通俗易懂的話講最難的知識(shí)點(diǎn)是我的座右銘,基礎(chǔ)是進(jìn)階的前提是我的初心背景當(dāng)我們?cè)谧鲰?xiàng)目的性能優(yōu)化的時(shí)候,優(yōu)化首屏?xí)r間是一個(gè)避不過去的優(yōu)化方向,但是又有多少人想過這兩個(gè)東西的區(qū)別呢:白屏?xí)r

前言

大家好,我是林三心,用最通俗易懂的話講最難的知識(shí)點(diǎn)是我的座右銘,基礎(chǔ)是進(jìn)階的前提是我的初心Ju028資訊網(wǎng)——每日最新資訊28at.com

背景

當(dāng)我們?cè)谧鲰?xiàng)目的性能優(yōu)化的時(shí)候,優(yōu)化首屏?xí)r間是一個(gè)避不過去的優(yōu)化方向,但是又有多少人想過這兩個(gè)東西的區(qū)別呢:Ju028資訊網(wǎng)——每日最新資訊28at.com

  • 白屏?xí)r間
  • 首屏?xí)r間

并且這兩個(gè)時(shí)間的計(jì)算方式又有什么區(qū)別呢?接下來我就給大家講一下吧!Ju028資訊網(wǎng)——每日最新資訊28at.com

白屏?xí)r間

是什么?

白屏?xí)r間指的是:頁面開始顯示內(nèi)容的時(shí)間。也就是:瀏覽器顯示第一個(gè)字符或者元素的時(shí)間Ju028資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Ju028資訊網(wǎng)——每日最新資訊28at.com

怎么算?

我們只需要知道瀏覽器開始顯示內(nèi)容的時(shí)間點(diǎn),即頁面白屏結(jié)束時(shí)間點(diǎn)即可獲取到頁面的白屏?xí)r間。Ju028資訊網(wǎng)——每日最新資訊28at.com

因此,我們通常認(rèn)為瀏覽器開始渲染<body>標(biāo)簽或者解析完<head>標(biāo)簽的時(shí)刻就是頁面白屏結(jié)束的時(shí)間點(diǎn)。Ju028資訊網(wǎng)——每日最新資訊28at.com

  • 瀏覽器支持performance.timing
<head>  <title>Document</title></head><script type="text/javascript">  // 白屏?xí)r間結(jié)束點(diǎn)  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">  // 白屏?xí)r間結(jié)束點(diǎn)  var firstPaint = Date.now()  console.log(firstPaint - window.start)</script>

首屏?xí)r間

是什么?

首屏?xí)r間是指用戶打開網(wǎng)站開始,到瀏覽器首屏內(nèi)容渲染完成的時(shí)間。對(duì)于用戶體驗(yàn)來說,首屏?xí)r間是用戶對(duì)一個(gè)網(wǎng)站的重要體驗(yàn)因素。Ju028資訊網(wǎng)——每日最新資訊28at.com

圖片圖片Ju028資訊網(wǎng)——每日最新資訊28at.com

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

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

圖片圖片Ju028資訊網(wǎng)——每日最新資訊28at.com

為什么不直接用nextTick?

nextTick回調(diào)的時(shí)候,首屏的DOM都渲染出來了,但是計(jì)算首屏?xí)r間并不需要渲染所有DOM,所以計(jì)算出來的時(shí)間會(huì)偏長(zhǎng)Ju028資訊網(wǎng)——每日最新資訊28at.com

怎么算?

我們需要利用MutationObserver監(jiān)控DOM的變化,監(jiān)控每一次DOM變化的分?jǐn)?shù),計(jì)算的規(guī)則為: (1 + 層數(shù) * 0.5),我舉個(gè)例子:Ju028資訊網(wǎng)——每日最新資訊28at.com

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

以上DOM結(jié)構(gòu)的分?jǐn)?shù)為:Ju028資訊網(wǎng)——每日最新資訊28at.com

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

圖片圖片Ju028資訊網(wǎng)——每日最新資訊28at.com

其實(shí)在首屏的加載中,會(huì)涉及到DOM的增加、修改、刪除,所以會(huì)觸發(fā)多次MutationObserver,所以會(huì)統(tǒng)計(jì)出不同階段的score,我們把這些score存放在一個(gè)數(shù)組observerData中,后面大有用處Ju028資訊網(wǎng)——每日最新資訊28at.com

首屏?xí)r間實(shí)踐

現(xiàn)在我們開始計(jì)算首屏?xí)r間吧!Ju028資訊網(wǎng)——每日最新資訊28at.com

前置準(zhǔn)備

  • 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:計(jì)算首屏?xí)r間的文件
const observerData = []let observer = new MutationObserver(() => {  // 計(jì)算每次DOM修改時(shí),距離頁面剛開始加載的時(shí)間  const start = window.performance.timing.navigationStart  const time = new Date().getTime() - start    const body = document.querySelector('body')  const score = computedScore(body, 1)  // 加到數(shù)組 observerData 中  observerData.push({    score,    time  })})observer.observe(  document, {    childList: true,    subtree: true  })function computedScore(element, layer) {  let score = 0  const tagName = element.tagName  // 排除這些標(biāo)簽的情況  if (    tagName !== 'SCRIPT' &&    tagName !== 'STYLE' &&    tagName !== 'META' &&    tagName !== 'HEAD'  ) {    const children = element.children    if (children && children.length) {      // 遞歸計(jì)算分?jǐn)?shù)      for (let i = 0; i < children.length; i++) {        score += computedScore(children[i], layer + 1)      }    }    score += 1 + 0.5 * layer  }  return score}
  • request.js:模擬請(qǐng)求修改DOM
// 模擬請(qǐng)求列表const requestList = () => {  return new Promise((resolve) => {    setTimeout(() => {      resolve(        [1, 2, 3,          4, 5, 6,          7, 8, 9        ]      )    }, 1000)  })}const ulbox = document.getElementById('ulbox')// 模擬請(qǐng)求數(shù)據(jù)渲染列表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)}// 模擬對(duì)列表進(jìn)行輕微修改const addList = async () => {  const li = document.createElement('li')  li.innerText = '加上去'  ulbox.appendChild(li)}(async () => {  // 模擬請(qǐng)求數(shù)據(jù)渲染列表  await renderList()  // 模擬對(duì)列表進(jìn)行輕微修改  addList()})()

observerData

當(dāng)我們一切準(zhǔn)備就緒后運(yùn)行代碼,我們獲得了observerData,我們看看它長(zhǎng)什么樣?Ju028資訊網(wǎng)——每日最新資訊28at.com

計(jì)算首屏?xí)r間

我們?cè)趺锤鶕?jù)observerData來計(jì)算首屏?xí)r間呢?我們可以這么算:下次分?jǐn)?shù)比上次分?jǐn)?shù)增加幅度最大的時(shí)間作為首屏?xí)r間Ju028資訊網(wǎng)——每日最新資訊28at.com

很多人會(huì)問了,為什么不是取最后一項(xiàng)的時(shí)間來當(dāng)做首屏?xí)r間呢?大家要注意了:首屏并不是所有DOM都渲染,我就拿剛剛的代碼來舉例吧,我們渲染完了列表,然后再去增加一個(gè)li,那你是覺得哪個(gè)時(shí)間段算是首屏呢?應(yīng)該是渲染完列表后算首屏完成,因?yàn)楹竺嬷辉黾恿艘粋€(gè)li,分?jǐn)?shù)的漲幅較小,可以忽略不計(jì)Ju028資訊網(wǎng)——每日最新資訊28at.com

所以我們開始計(jì)算吧:Ju028資訊網(wǎng)——每日最新資訊28at.com

const observerData = []let observer = new MutationObserver(() => {  // 計(jì)算每次DOM修改時(shí),距離頁面剛開始加載的時(shí)間  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時(shí)去調(diào)用 unmountObserver  if (document.readyState === 'complete') {    // 只計(jì)算10秒內(nèi)渲染時(shí)間    unmountObserver(10000)  }})observer.observe(  document, {    childList: true,    subtree: true  })function computedScore(element, layer) {  let score = 0  const tagName = element.tagName  // 排除這些標(biāo)簽的情況  if (    tagName !== 'SCRIPT' &&    tagName !== 'STYLE' &&    tagName !== 'META' &&    tagName !== 'HEAD'  ) {    const children = element.children    if (children && children.length) {      // 遞歸計(jì)算分?jǐn)?shù)      for (let i = 0; i < children.length; i++) {        score += computedScore(children[i], layer + 1)      }    }    score += 1 + 0.5 * layer  }  return score}// 計(jì)算首屏?xí)r間function getFirstScreenTime() {  let data = null  for (let i = 1; i < observerData.length; i++) {    // 計(jì)算幅度    const differ = observerData[i].score - observerData[i - 1].score    // 取最大幅度,記錄對(duì)應(yīng)時(shí)間    if (!data || data.rate <= differ) {      data = {        time: observerData[i].time,        rate: differ      }    }  }  return data}let timer = nullfunction unmountObserver(delay) {  if (timer) return  timer = setTimeout(() => {    // 輸出首屏?xí)r間    console.log(getFirstScreenTime())    // 終止MutationObserver的監(jiān)控    observer.disconnect()    observer = null    clearTimeout(timer)  }, delay)}

計(jì)算出首屏?xí)r間1020msJu028資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

我這個(gè)計(jì)算方法其實(shí)很多漏洞,沒把刪除元素也考慮進(jìn)去,但是想讓大家知道計(jì)算首屏?xí)r間的計(jì)算思想,這才是最重要的,希望大家能理解這個(gè)計(jì)算思想。Ju028資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-83640-0.html首屏?xí)r間,你說你優(yōu)化了,那你倒是計(jì)算出來給我看啊!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 改造 console.log!也能提高團(tuán)隊(duì)開發(fā)效率?

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

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 對(duì)標(biāo)蘋果的靈動(dòng)島 華為帶來實(shí)況窗功能

    繼蘋果的靈動(dòng)島之后,華為也在今天正式推出了“實(shí)況窗”功能。據(jù)今天鴻蒙OS 4.0的現(xiàn)場(chǎng)演示顯示,華為的實(shí)況窗可以更高效的展現(xiàn)出實(shí)時(shí)通知,比如鎖屏上就能看到外賣、打車、銀行
  • 2023年Q2用戶偏好榜:12+256G版本成新主流

    3月份的性能榜、性價(jià)比榜和好評(píng)榜之后,就要輪到2023年的第二季度偏好榜了,上半年的新機(jī)潮已經(jīng)過去,最明顯的肯定就是大內(nèi)存和存儲(chǔ)的機(jī)型了,另外部分中端機(jī)也取消了屏幕塑料支架
  • 把LangChain跑起來的三個(gè)方法

    使用LangChain開發(fā)LLM應(yīng)用時(shí),需要機(jī)器進(jìn)行GLM部署,好多同學(xué)第一步就被勸退了,那么如何繞過這個(gè)步驟先學(xué)習(xí)LLM模型的應(yīng)用,對(duì)Langchain進(jìn)行快速上手?本片講解3個(gè)把LangChain跑起來
  • 讓我們一起聊聊文件的操作

    文件【1】文件是什么?文件是保存數(shù)據(jù)的地方,是數(shù)據(jù)源的一種,比如大家經(jīng)常使用的word文檔、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存數(shù)據(jù),它既可以保
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時(shí)候了!學(xué)弟,最近學(xué)習(xí)的怎么樣啊 了不起學(xué)弟:最近學(xué)習(xí)的還不錯(cuò),每天都在學(xué)習(xí),每天都在進(jìn)步! 了不起:那你最近學(xué)習(xí)的什么呢? 了不起學(xué)弟:最近在學(xué)習(xí)C
  • 認(rèn)真聊聊東方甄選:如何告別低垂的果實(shí)

    來源:山核桃作者:財(cái)經(jīng)無忌爆火一年后,俞敏洪和他的東方甄選依舊是頗受外界關(guān)心的&ldquo;網(wǎng)紅&rdquo;。7月5日至9日,為期5天的東方甄選&ldquo;甘肅行&rdquo;首次在自有App內(nèi)直播,
  • 小米汽車電池信息疑似曝光:容量101kWh,支持800V高壓快充

    7月14日消息,今日一名博主在社交媒體發(fā)布了一張疑似小米汽車電池信息的照片,顯示該電池包正是寧德時(shí)代麒麟電池,容量為101kWh,電壓為726.7V,可以預(yù)測(cè)小
  • AI芯片初創(chuàng)公司Tenstorrent獲三星和現(xiàn)代1億美元投資

    Tenstorrent是一家由芯片行業(yè)資深人士Jim Keller領(lǐng)導(dǎo)的加拿大初創(chuàng)公司,專注于開發(fā)人工智能芯片,該公司周三表示,已經(jīng)從現(xiàn)代汽車集團(tuán)和三星投資基金等
  • 與兆芯合作 聯(lián)想推出全新旗艦版筆記本電腦開天N7系列

    聯(lián)想與兆芯合作推出全新聯(lián)想旗艦版筆記本電腦開天 N7系列。這個(gè)系列采用兆芯KX-6640MA處理器平臺(tái),KX-6640MA 處理器是采用了陸家嘴架構(gòu),16nm 工藝,4 核 4 線
Top 主站蜘蛛池模板: 成武县| 余庆县| 长垣县| 大兴区| 绥宁县| 东兰县| 手机| 秀山| 咸阳市| 东兴市| 浮梁县| 新绛县| 自治县| 衡南县| 临猗县| 舞钢市| 家居| 海阳市| 屏边| 阿拉善左旗| 怀柔区| 香港 | 金溪县| 浪卡子县| 津市市| 正镶白旗| 临泉县| 乐业县| 炎陵县| 海口市| 项城市| 潮安县| 九寨沟县| 织金县| 榕江县| 即墨市| 图片| 舒城县| 文化| 鄂州市| 日照市|