• <sub id="h4knl"><ol id="h4knl"></ol></sub>
    <sup id="h4knl"></sup>
      <sub id="h4knl"></sub>

      <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
      1. <strong id="h4knl"></strong>

      2. JavaScript提高性能的知識點總結(jié)

        時間:2024-08-05 12:10:31 JavaScript 我要投稿
        • 相關(guān)推薦

        JavaScript提高性能的知識點總結(jié)

          JavaScript有什么方式可以提高性能呢?下面YJBYS小編為大家介紹!

        JavaScript提高性能的知識點總結(jié)

          針對js文件的加載位置

          在HTML文件中,標(biāo)簽是可以加在區(qū)域和區(qū)域的。這里鑒于JavaScript執(zhí)行和UI渲染的單線程原因,如果js文件載入會阻塞后面對于頁面的解析過程,頁面會等到j(luò)s文件完全加載并運行后才繼續(xù)執(zhí)行該做的操作。那么問題就來了,這樣可能會出現(xiàn)頁面空白or卡頓現(xiàn)象。作為一名前端開發(fā),重要的不僅僅止于實現(xiàn)了需求,應(yīng)該還有優(yōu)質(zhì)的用戶體驗。那么我們就需要消除用戶枯燥的等待,針對這個問題,這里有本獸想到的兩種解決方案:

          1. 如果js文件沒有特殊要求指明需要在頁面渲染之前載入及編譯完成的,那么選擇將js文件放到

          標(biāo)簽前(既所有的頁面所呈現(xiàn)內(nèi)容的后面),css文件還是放到

          區(qū)域(誰也不愿意看一個布局雜亂無章的頁面)。這樣做就能先讓用戶看到有布局的頁面而不是空白頁了,那么也會有人指出:那數(shù)據(jù)得通過js請求加載進來啊,怎么辦呢?可以對數(shù)據(jù)的加載做排序,急需呈現(xiàn)的接口放前面執(zhí)行,不是那么需要的可以延后執(zhí)行,同時做個簡單的載入動畫or提示。

          2. 如果這些js文件有指明需要先執(zhí)行了,才能更好的展示頁面內(nèi)容,那么就在第一個js或者頁面上先放個載入小動畫,可以一些有趣的或者萌萌的動畫場景。這樣也是能較好的避免用戶等待的無聊,說不定人家還對這個載入動畫更感興趣呢,這樣可提升項目的用戶體驗感。

          最終推薦:將標(biāo)簽盡可能的放到標(biāo)簽前面加載,以提升用戶體驗。

          針對js文件的合并

          在很多團隊開發(fā)中,我們可能會將不同功能的代碼塊分別放置在不同的js文件中,以便于開發(fā)過程中眾人合作寫代碼會更加方便,畢竟只需要找對應(yīng)文件夾或文件而不是在一個很長的文件中找一個方法。這確實是會提高團隊開發(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)在的前端工具這么豐富,各位習(xí)慣用什么壓縮就用什么壓縮吧~

          這里簡單提出下,在載入文件方面還可以用到defer和async屬性,用于延遲加載和異步加載,在現(xiàn)代瀏覽器中,大多數(shù)是已經(jīng)支持defer屬性了,還沒習(xí)慣用這個額,也不知道具體會不會存在什么問題。有興趣的朋友可自行g(shù)oogle該知識點,這里件簡單提下吧。

          現(xiàn)在的框架也大多配合懶加載和按需加載了。

          更快速的數(shù)據(jù)訪問

          對于瀏覽器來說,一個標(biāo)識符所處的位置越深,去讀寫他的速度也就越慢(對于這點,原型鏈亦是如此)。這個應(yīng)該不難理解,簡單比喻就是:雜貨店離你家越遠,你去打醬油所花的時間就越長… 熊孩子,打個醬油那么久,菜早燒焦了 -.-~

          如果我們需要在當(dāng)前函數(shù)內(nèi)多次用到一個變量值,那么我們可以用一個局部變量先將其存儲起來,案例如下:

          //修改前

          function showLi(){

          var i = 0;

          for(;i

          console.log(i,document.getElementsByTagName("li")[i]); //三次訪問document

          };

          };

          //修改后

          function showLi(){

          var li_s = document.getElementsByTagName("li"); //一次訪問document

          var i = 0;

          for(;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的重繪重排版

          元素布局的改變或內(nèi)容的增刪改或者瀏覽器窗口尺寸改變都將會導(dǎo)致重排,而字體顏色或者背景色的修改則將導(dǎo)致重繪。

          對于類似以下代碼的操作,據(jù)說現(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)化

          這應(yīng)該是較多人都知道的寫法了,簡單帶過即可(后面還是用代碼+注釋形式說明)~

          //修改前

          var i = 0;

          for(;i

          console.log(arr[i]);

          }

          //修改后

          var i = 0;

          var len = arr.length; //獲取一次數(shù)組arr的length

          for(;i

          console.log(arr[i]);

          }

          //or

          var i = arr.length;;

          for(;i;i--){

          console.log(arr[i]);

          }

          合理利用二進制

          如:對2取模,則偶數(shù)最低位是0,奇數(shù)最低位是0,與1進行位與操作的結(jié)果是0,奇數(shù)的最低位是1,與1進行位與操作的結(jié)果是1。

          .odd{color:red}

          .even{color:yellow}

          var i = 0;

          var lis = document.getElementsByTagName("li");

          var len = lis.length;

          for(;i

          if(i&1){

          lis[i].className = "even";

          } else{

          lis[i].className = "odd";

          }

          };

          雖說現(xiàn)代瀏覽器都已經(jīng)做的很好了,但是本獸覺得這是自己對代碼質(zhì)量的一個追求。并且可能一個點或者兩個點不注意是不會產(chǎn)生多大性能影響,但是從多個點進行優(yōu)化后,可能產(chǎn)生的就會是質(zhì)的飛躍了~

        《&.doc》
        将本文的Word文档下载到电脑,方便收藏和打印
        推荐度:
        点击下载文档

        【JavaScript提高性能的知識點總結(jié)】相關(guān)文章:

        對javascript的理解08-08

        常用的JavaScript模式09-22

        Javascript的this用法簡述08-15

        JavaScript學(xué)習(xí)筆記08-24

        JavaScript 基礎(chǔ)教學(xué)09-29

        JavaScript的課堂講解09-03

        讀javascript的發(fā)展史讀后總結(jié)02-13

        JavaScript常用方法匯總10-25

        混凝土的性能有哪些-混凝土的性能06-04

        JavaScript數(shù)組常用方法介紹09-04

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码
      3. <sub id="h4knl"><ol id="h4knl"></ol></sub>
        <sup id="h4knl"></sup>
          <sub id="h4knl"></sub>

          <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
          1. <strong id="h4knl"></strong>

          2. 亚洲日本电影久久 | 婷婷久久高清国外AV免费 | 日本久久久久午夜免费 | 亚洲日本va中文字幕无 | 亚洲国产欧美在线人成最新 | 中文字幕在线亚洲三区 |

            JavaScript提高性能的知識點總結(jié)

              JavaScript有什么方式可以提高性能呢?下面YJBYS小編為大家介紹!

            JavaScript提高性能的知識點總結(jié)

              針對js文件的加載位置

              在HTML文件中,標(biāo)簽是可以加在區(qū)域和區(qū)域的。這里鑒于JavaScript執(zhí)行和UI渲染的單線程原因,如果js文件載入會阻塞后面對于頁面的解析過程,頁面會等到j(luò)s文件完全加載并運行后才繼續(xù)執(zhí)行該做的操作。那么問題就來了,這樣可能會出現(xiàn)頁面空白or卡頓現(xiàn)象。作為一名前端開發(fā),重要的不僅僅止于實現(xiàn)了需求,應(yīng)該還有優(yōu)質(zhì)的用戶體驗。那么我們就需要消除用戶枯燥的等待,針對這個問題,這里有本獸想到的兩種解決方案:

              1. 如果js文件沒有特殊要求指明需要在頁面渲染之前載入及編譯完成的,那么選擇將js文件放到

              標(biāo)簽前(既所有的頁面所呈現(xiàn)內(nèi)容的后面),css文件還是放到

              區(qū)域(誰也不愿意看一個布局雜亂無章的頁面)。這樣做就能先讓用戶看到有布局的頁面而不是空白頁了,那么也會有人指出:那數(shù)據(jù)得通過js請求加載進來啊,怎么辦呢?可以對數(shù)據(jù)的加載做排序,急需呈現(xiàn)的接口放前面執(zhí)行,不是那么需要的可以延后執(zhí)行,同時做個簡單的載入動畫or提示。

              2. 如果這些js文件有指明需要先執(zhí)行了,才能更好的展示頁面內(nèi)容,那么就在第一個js或者頁面上先放個載入小動畫,可以一些有趣的或者萌萌的動畫場景。這樣也是能較好的避免用戶等待的無聊,說不定人家還對這個載入動畫更感興趣呢,這樣可提升項目的用戶體驗感。

              最終推薦:將標(biāo)簽盡可能的放到標(biāo)簽前面加載,以提升用戶體驗。

              針對js文件的合并

              在很多團隊開發(fā)中,我們可能會將不同功能的代碼塊分別放置在不同的js文件中,以便于開發(fā)過程中眾人合作寫代碼會更加方便,畢竟只需要找對應(yīng)文件夾或文件而不是在一個很長的文件中找一個方法。這確實是會提高團隊開發(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)在的前端工具這么豐富,各位習(xí)慣用什么壓縮就用什么壓縮吧~

              這里簡單提出下,在載入文件方面還可以用到defer和async屬性,用于延遲加載和異步加載,在現(xiàn)代瀏覽器中,大多數(shù)是已經(jīng)支持defer屬性了,還沒習(xí)慣用這個額,也不知道具體會不會存在什么問題。有興趣的朋友可自行g(shù)oogle該知識點,這里件簡單提下吧。

              現(xiàn)在的框架也大多配合懶加載和按需加載了。

              更快速的數(shù)據(jù)訪問

              對于瀏覽器來說,一個標(biāo)識符所處的位置越深,去讀寫他的速度也就越慢(對于這點,原型鏈亦是如此)。這個應(yīng)該不難理解,簡單比喻就是:雜貨店離你家越遠,你去打醬油所花的時間就越長… 熊孩子,打個醬油那么久,菜早燒焦了 -.-~

              如果我們需要在當(dāng)前函數(shù)內(nèi)多次用到一個變量值,那么我們可以用一個局部變量先將其存儲起來,案例如下:

              //修改前

              function showLi(){

              var i = 0;

              for(;i

              console.log(i,document.getElementsByTagName("li")[i]); //三次訪問document

              };

              };

              //修改后

              function showLi(){

              var li_s = document.getElementsByTagName("li"); //一次訪問document

              var i = 0;

              for(;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的重繪重排版

              元素布局的改變或內(nèi)容的增刪改或者瀏覽器窗口尺寸改變都將會導(dǎo)致重排,而字體顏色或者背景色的修改則將導(dǎo)致重繪。

              對于類似以下代碼的操作,據(jù)說現(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)化

              這應(yīng)該是較多人都知道的寫法了,簡單帶過即可(后面還是用代碼+注釋形式說明)~

              //修改前

              var i = 0;

              for(;i

              console.log(arr[i]);

              }

              //修改后

              var i = 0;

              var len = arr.length; //獲取一次數(shù)組arr的length

              for(;i

              console.log(arr[i]);

              }

              //or

              var i = arr.length;;

              for(;i;i--){

              console.log(arr[i]);

              }

              合理利用二進制

              如:對2取模,則偶數(shù)最低位是0,奇數(shù)最低位是0,與1進行位與操作的結(jié)果是0,奇數(shù)的最低位是1,與1進行位與操作的結(jié)果是1。

              .odd{color:red}

              .even{color:yellow}

              var i = 0;

              var lis = document.getElementsByTagName("li");

              var len = lis.length;

              for(;i

              if(i&1){

              lis[i].className = "even";

              } else{

              lis[i].className = "odd";

              }

              };

              雖說現(xiàn)代瀏覽器都已經(jīng)做的很好了,但是本獸覺得這是自己對代碼質(zhì)量的一個追求。并且可能一個點或者兩個點不注意是不會產(chǎn)生多大性能影響,但是從多個點進行優(yōu)化后,可能產(chǎn)生的就會是質(zhì)的飛躍了~