摘要:直入正題假設(shè)有十萬(wàn)條數(shù)據(jù)的列表要展示,該如何優(yōu)化如果直接上,不管你是一條一條插入,還是先存入再一次性插入,白屏?xí)r間都在,瀏覽器應(yīng)該是合并了更新操作,如果不做優(yōu)化,并不會(huì)分批渲染。
直入正題:假設(shè)有十萬(wàn)條數(shù)據(jù)的列表要展示,該如何優(yōu)化?
如果直接上,不管你是一條一條插入,還是先存入fragment再一次性插入,白屏?xí)r間都在6s+,瀏覽器應(yīng)該是合并了dom更新操作,如果不做優(yōu)化,并不會(huì)分批渲染。
注意:測(cè)試所用的item結(jié)構(gòu)是極其簡(jiǎn)單的,一旦渲染的item是復(fù)雜結(jié)構(gòu)那么渲染的時(shí)間倍增
item.innerHTML =
${text}
測(cè)試;優(yōu)化一,分批渲染requestAnimationFrame
requestAnimationFrame和setTimeout的區(qū)別就不多復(fù)述了,網(wǎng)上一大把。先渲染一部分,然后執(zhí)行循環(huán)邏輯。但是這個(gè)部分到底是多少,需要自己調(diào)試了,我寫(xiě)的是300,但不一定適用。
const totalFn = () => { window.requestAnimationFrame(() => { if (i <= data.length) { computedHeight(data.slice(i, i + 300)); // 執(zhí)行插入dom操作 i += 300; totalFn(); } else { root.style.height = max + "px" } }) } totalFn();
這樣能做到秒開(kāi),無(wú)長(zhǎng)時(shí)間白屏。
but,如果只是這樣就回答的太簡(jiǎn)單了點(diǎn),可能面試官還希望更深入的解答,比如我十萬(wàn)條數(shù)據(jù)就算能秒加載,但是渲染復(fù)雜邏輯,說(shuō)不定會(huì)卡卡的,因?yàn)轫?yè)面元素太多了。在不考慮分頁(yè)的情況下,如何進(jìn)一步優(yōu)化。
優(yōu)化二,只渲染可視區(qū)范圍內(nèi)的dom(只提供思路了)
這塊涉及的交互就略復(fù)雜了,首先為了保證和一次性加載出來(lái)的效果一致,比如有滾動(dòng)慣性,需要計(jì)算總高度。
簡(jiǎn)單的玩法,每一個(gè)item是同樣的高度,那么計(jì)算高度就很簡(jiǎn)單了,但是如果每個(gè)item的高度不同,那么要就需要隱藏計(jì)算(把dom插入隱藏域,而且需要采用優(yōu)化一的手段,不然會(huì)卡),但是那樣又會(huì)導(dǎo)致整個(gè)計(jì)算過(guò)程過(guò)于漫長(zhǎng),需要尋找到最適合的點(diǎn)。
得到高度后,綁定scroll事件,根據(jù)scrollTop的值,動(dòng)態(tài)計(jì)算展示哪一塊內(nèi)容,為了保證位置,還需要在首部填充空白塊占位。
仍然可能存在的問(wèn)題,比如scroll觸發(fā)的時(shí)機(jī),scroll在ios下是不能做到實(shí)時(shí)觸發(fā)的,比如在慣性滾動(dòng)過(guò)程中,觸發(fā)不了scroll事件,可能會(huì)導(dǎo)致部分白屏(暫時(shí)沒(méi)有想到如何解決),如果用iscroll.js,不知道能不能
模擬到原生的效果。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/105234.html
摘要:懶加載方式常見(jiàn)的有淘寶一屏用元素占據(jù)一定的高度,然后再去拉圖片數(shù)據(jù)。但這種方式還是需要元素占位,淘寶一頁(yè)的數(shù)據(jù)量其實(shí)不算大,因?yàn)樗Y(jié)合了分頁(yè)。 背景 showImg(https://segmentfault.com/img/bVbhSVh?w=1606&h=440);大數(shù)據(jù)項(xiàng)目根據(jù)用戶(hù)輸入代碼查詢(xún)數(shù)據(jù),用戶(hù)的代碼不可控(比如select from db limit 5000),有可能...
摘要:本篇內(nèi)容將記錄并介紹使用進(jìn)行自動(dòng)化網(wǎng)頁(yè)測(cè)試,并依靠約定來(lái)避免反復(fù)修改測(cè)試用例的方案。總結(jié)根據(jù)以上的功能劃分,我們很好的將一整個(gè)應(yīng)用拆分成各個(gè)測(cè)試單元進(jìn)行單元測(cè)試。 本篇內(nèi)容將記錄并介紹使用Puppeteer進(jìn)行自動(dòng)化網(wǎng)頁(yè)測(cè)試,并依靠約定來(lái)避免反復(fù)修改測(cè)試用例的方案。主要解決頁(yè)面眾多時(shí),修改代碼導(dǎo)致的牽連錯(cuò)誤無(wú)法被發(fā)現(xiàn)的運(yùn)行時(shí)問(wèn)題。文章首發(fā)于個(gè)人博客。對(duì)前端感興趣希望一起討論的可以加我v...
摘要:策略減少檢測(cè)次數(shù)當(dāng)輸入屬性不變時(shí),可以跳過(guò)整個(gè)變更檢測(cè)子樹(shù)。現(xiàn)在當(dāng)執(zhí)行更改檢測(cè)時(shí),它將從上到下進(jìn)行。并且一旦更改檢測(cè)運(yùn)行結(jié)束,它將恢復(fù)整個(gè)樹(shù)的狀態(tài)。 Angular 2.x+ 臟檢查機(jī)制理解 目前幾種主流的前端框架都已經(jīng)實(shí)現(xiàn)雙向綁定特性,但實(shí)現(xiàn)的方法各有不同: 發(fā)布者-訂閱者模式(backbone.js) 臟值檢查(angular.js) 數(shù)據(jù)劫持 + 發(fā)布者-訂閱者模式(vue.j...
摘要:迭代次,重復(fù)執(zhí)行三次重復(fù)計(jì)算了三次,使用相同的圖片,相同的卷積神經(jīng)網(wǎng)絡(luò)模型,相同的迭代次數(shù)次,卻得到了區(qū)別明顯的三張結(jié)果圖。推測(cè)原因由于卷積神經(jīng)網(wǎng)絡(luò)中的若干層,實(shí)際是對(duì)圖像進(jìn)行了均值處理,導(dǎo)致了邊緣細(xì)節(jié)的丟失。 作為一個(gè)脫離了低級(jí)趣味的碼農(nóng),春節(jié)假期閑來(lái)無(wú)事,決定做一些有意思的事情打發(fā)時(shí)間,碰巧看到這篇論文: A neural style of convolutional neural ne...
摘要:一誕生的性能瓶頸,主要有以下原因。注意組件類(lèi)的第一個(gè)字母必須大寫(xiě),否則會(huì)報(bào)錯(cuò)。組件并不是真實(shí)的節(jié)點(diǎn),而是存在于內(nèi)存之中的一種數(shù)據(jù)結(jié)構(gòu),叫做虛擬。此外,還提供兩種特殊狀態(tài)的處理函數(shù)。不會(huì)隨著時(shí)間改變可能不是。 本文為學(xué)習(xí)筆記,適合入門(mén)的童鞋,如有錯(cuò)誤,請(qǐng)多多指教。 一、react誕生 Web app的性能瓶頸,主要有以下原因。 (1)Web基于DOM,而DOM很慢。瀏覽器打開(kāi)網(wǎng)頁(yè)時(shí),需要...
閱讀 3570·2023-04-25 14:20
閱讀 1191·2021-09-10 10:51
閱讀 1152·2019-08-30 15:53
閱讀 458·2019-08-30 15:43
閱讀 2313·2019-08-30 14:13
閱讀 2794·2019-08-30 12:45
閱讀 1204·2019-08-29 16:18
閱讀 1161·2019-08-29 16:12