JavaScript 總結幾個提高性能知識點(推薦)
前段時間花時間看了大半的《High Performance JavaScript》這本書啊,然后就開始忙項目了,慶幸最忙的一周已經熬過去了。由于空不出時間,這個月寫的學習筆記也不多,忙完最苦X的一周,這兩天晚上也算是挑燈夜讀了...終于是在殘血之際將這本書shut down了...
既然讀完了,總歸是要學到些什么的。說說對這本書的看法先吧,整體的來說,內容還是不錯的,就是感覺有點老了(作為前端小白,也可能是自身水平有限,未能體會到其中真意)??催@本書的過程中也是寫了挺多代碼用以測試的,并且對本書提倡的寫法和原先大眾的寫法的執(zhí)行分別進行了斷點跟蹤,對于能實際測出的問題進行理解,當然,下斷點跟著執(zhí)行也看不出的那也沒辦法咯。對于書中的知識點,這里只是簡單的整理出個人所推崇的一部分,當然~ 不喜勿噴。
針對js文件的加載位置
在HTML文件中,<script>標簽是可以加在<head>區(qū)域和<body>區(qū)域的。這里鑒于JavaScript執(zhí)行和UI渲染的單線程原因,如果js文件載入會阻塞后面對于頁面的解析過程,頁面會等到js文件完全加載并運行后才繼續(xù)執(zhí)行該做的操作。那么問題就來了,這樣可能會出現(xiàn)頁面空白or卡頓現(xiàn)象。作為一名前端開發(fā),重要的不僅僅止于實現(xiàn)了需求,應該還有優(yōu)質的用戶體驗。那么我們就需要消除用戶枯燥的等待,針對這個問題,這里有本獸想到的兩種解決方案:
1. 如果js文件沒有特殊要求指明需要在頁面渲染之前載入及編譯完成的,那么選擇將js文件放到</body>標簽前(既所有的頁面所呈現(xiàn)內容的后面),css文件還是放到<head>區(qū)域(誰也不愿意看一個布局雜亂無章的頁面)。這樣做就能先讓用戶看到有布局的頁面而不是空白頁了,那么也會有人指出:那數(shù)據得通過js請求加載進來啊,怎么辦呢?可以對數(shù)據的加載做排序,急需呈現(xiàn)的接口放前面執(zhí)行,不是那么需要的可以延后執(zhí)行,同時做個簡單的載入動畫or提示。
2. 如果這些js文件有指明需要先執(zhí)行了,才能更好的展示頁面內容,那么就在第一個js或者頁面上先放個載入小動畫,可以一些有趣的或者萌萌的動畫場景。這樣也是能較好的避免用戶等待的無聊,說不定人家還對這個載入動畫更感興趣呢,這樣可提升項目的用戶體驗感。
最終推薦:將<script>標簽盡可能的放到</body>標簽前面加載,以提升用戶體驗。
針對js文件的合并
在很多團隊開發(fā)中,我們可能會將不同功能的代碼塊分別放置在不同的js文件中,以便于開發(fā)過程中眾人合作寫代碼會更加方便,畢竟只需要找對應文件夾或文件而不是在一個很長的文件中找一個方法。這確實是會提高團隊開發(fā)效率及新人加入后的更容易進行二次開發(fā)及維護。那么將這個問題放到頁面性能里呢?這正是問題所在,在這本書中指出:Each HTTP request brings with it additional performance overhead,so downloading one single 100 KB file will be faster than downloading four 25 KB files.
下載1個100KB的文件比下載4個25KB的文件要快,而開發(fā)過程中區(qū)分開各個文件又有很大的好處,那么合并這個問題也就放在開發(fā)完后再處理咯,相信這個操作大家都不會陌生吧,現(xiàn)在的前端工具這么豐富,各位習慣用什么壓縮就用什么壓縮吧~
這里簡單提出下,在載入文件方面還可以用到defer和async屬性,用于延遲加載和異步加載,在現(xiàn)代瀏覽器中,大多數(shù)是已經支持defer屬性了,還沒習慣用這個額,也不知道具體會不會存在什么問題。有興趣的朋友可自行google該知識點,這里件簡單提下吧。
現(xiàn)在的框架也大多配合懶加載和按需加載了。
更快速的數(shù)據訪問
對于瀏覽器來說,一個標識符所處的位置越深,去讀寫他的速度也就越慢(對于這點,原型鏈亦是如此)。這個應該不難理解,簡單比喻就是:雜貨店離你家越遠,你去打醬油所花的時間就越長... 熊孩子,打個醬油那么久,菜早燒焦了 -.-~
如果我們需要在當前函數(shù)內多次用到一個變量值,那么我們可以用一個局部變量先將其存儲起來,案例如下:
//修改前 function showLi(){ var i = 0; for(;i<document.getElementsByTagName("li").length;i++){ //一次訪問document console.log(i,document.getElementsByTagName("li")[i]); //三次訪問document }; }; //修改后 function showLi(){ var li_s = document.getElementsByTagName("li"); //一次訪問document var i = 0; for(;i<li_s.length;i++){ console.log(i,li_s[i]); //三次訪問局部變量li_s }; };
DOM操作的優(yōu)化
眾所周知的,DOM操作遠比javascript的執(zhí)行耗性能,雖然我們避免不了對DOM進行操作,但我們可以盡量去減少該操作對性能的消耗。
讓我們通過代碼解釋這個問題:
function innerLi_s(){ var i = 0; for(;i<20;i++){ document.getElementById("Num").innerHTML="A"; //進行了20次循環(huán),每次又有2次DOM元素訪問:一次讀取innerHTML的值,一次寫入值 }; };
針對以上方法進行一次改寫:
function innerLi_s(){ var content =""; var i = 0; for(;i<20;i++){ content += "A"; //這里只對js的變量循環(huán)了20次 }; document.getElementById("Num").innerHTML += content; //這里值進行了一次DOM操作,又分2次DOM訪問:一次讀取innerHTML的值,一次寫入值 };
減少Dom的重繪重排版
元素布局的改變或內容的增刪改或者瀏覽器窗口尺寸改變都將會導致重排,而字體顏色或者背景色的修改則將導致重繪。
對于類似以下代碼的操作,據說現(xiàn)代瀏覽器大多進行了優(yōu)化(將其優(yōu)化成1次重排版):
//修改前 var el = document.getElementById("div"); el.style.borderLeft = "1px"; //1次重排版 el.style.borderRight = "2px"; //又1次重排版 el.style.padding = "5px"; //還有1次重排版 //修改后 var el = document.getElementById("div"); el.style.cssText = "border-left:1px;border-right:2px;padding:5px"; //1次重排版
針對多重操作,以下三種方法也可以減少重排版和重繪的次數(shù):
1.Dom先隱藏,操作后再顯示 2次重排 (臨時的display:none)
2.document.createDocumentFragment() 創(chuàng)建文檔片段處理,操作后追加到頁面 1次重排
3.var newDOM = oldDOM.cloneNode(true)創(chuàng)建Dom副本,修改副本后oldDOM.parentNode.replaceChild(newDOM,oldDOM)覆蓋原DOM 2次重排
循環(huán)的優(yōu)化
這應該是較多人都知道的寫法了,簡單帶過即可(后面還是用代碼+注釋形式說明)~
//修改前 var i = 0; for(;i<arr.lengthli++){ //每次循環(huán)都需要獲取數(shù)組arr的length console.log(arr[i]); } //修改后 var i = 0; var len = arr.length; //獲取一次數(shù)組arr的length for(;i<len;i++){ console.log(arr[i]); } //or var i = arr.length;; for(;i;i--){ console.log(arr[i]); }
.odd{color:red} .even{color:yellow}
<ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> </ul>
var i = 0; var lis = document.getElementsByTagName("li"); var len = lis.length; for(;i<len;i++){ if(i&1){ lis[i].className = "even"; } else{ lis[i].className = "odd"; } };
以上這篇JavaScript 總結幾個提高性能知識點(推薦)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
js利用appendChild對<li>標簽進行排序的實現(xiàn)方法
下面小編就為大家?guī)硪黄猨s利用appendChild對<li>標簽進行排序的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10JavaScript仿京東實現(xiàn)秒殺倒計時案例詳解
這篇文章主要為大家詳細介紹了如何利用JavaScript實現(xiàn)京東秒殺倒計時效果,文中示例代碼介紹的非常詳細,感興趣的小伙伴們可以參考一下2022-03-03javascript數(shù)組中的reduce方法和pop方法
這篇文章主要介紹了javascript數(shù)組中的reduce方法和pop方法,文章內容介紹詳細,具有一定的參考價值需要的小伙伴可以參考一下,希望對你的學習有所幫助2022-03-03