在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當(dāng)前位置:雨林木風(fēng)下載站 > 網(wǎng)頁設(shè)計教程 > 詳細頁面

javascript優(yōu)化性能的方法介紹(附示例)

javascript優(yōu)化性能的方法介紹(附示例)

更新時間:2025-12-08 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

導(dǎo)網(wǎng)頁的本質(zhì)就是超級文本標記語言,通過結(jié)合使用其他的Web技術(shù)(如:腳本語言、公共網(wǎng)關(guān)接口、組件等),可以創(chuàng)造出功能強大的網(wǎng)頁。因而,超級文本標記語言是萬維網(wǎng)(Web)編程的基礎(chǔ),也就是說萬維網(wǎng)是建立...
網(wǎng)頁的本質(zhì)就是超級文本標記語言,通過結(jié)合使用其他的Web技術(shù)(如:腳本語言、公共網(wǎng)關(guān)接口、組件等),可以創(chuàng)造出功能強大的網(wǎng)頁。因而,超級文本標記語言是萬維網(wǎng)(Web)編程的基礎(chǔ),也就是說萬維網(wǎng)是建立在超文本基礎(chǔ)之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。
本篇文章給大家?guī)淼膬?nèi)容是關(guān)于javascript性能優(yōu)化的方法介紹(附示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

本文主要是在我讀《高性能Javascript》之后,想要記錄下一些有用的優(yōu)化方案,并且就我本身的一些經(jīng)驗,來大家一起分享下,

Javascript的加載與執(zhí)行

大家都知道,瀏覽器在解析DOM樹的時候,當(dāng)解析到script標簽的時候,會阻塞其他的所有任務(wù),直到該js文件下載、解析執(zhí)行完成后,才會繼續(xù)往下執(zhí)行。因此,這個時候瀏覽器就會被阻塞在這里,如果將script標簽放在head里的話,那么在該js文件加載執(zhí)行前,用戶只能看到空白的頁面,這樣的用戶體驗肯定是特別爛。對此,常用的方法有以下:

  • 將所有的script標簽都放到body最底部,這樣可以保證js文件是最后加載并執(zhí)行的,可以先將頁面展現(xiàn)給用戶。但是,你首先得清楚,頁面的首屏渲染是否依賴于你的部分js文件,如果是的話,則需要將這一部分js文件放到head上。

  • 使用defer,比如下面這種寫法。使用defer這種寫法時,雖然瀏覽器解析到該標簽的時候,也會下載對應(yīng)的js文件,不過它并不會馬上執(zhí)行,而是會等到DOM解析完后(DomContentLoader之前)才會執(zhí)行這些js文件。因此,就不會阻塞到瀏覽器。

<script src="test.js" type="text/javascript" defer></script>
  • 動態(tài)加載js文件,通過這種方式,可以在頁面加載完成后,再去加載所需要的代碼,也可以通過這種方式實現(xiàn)js文件懶加載/按需加載,比如現(xiàn)在比較常見的,就是webpack結(jié)合vue-router/react-router實現(xiàn)按需加載,只有訪問到具體路由的時候,才加載相應(yīng)的代碼。具體的方法如下:

1.動態(tài)的插入script標簽來加載腳本,比如通過以下代碼

  function loadScript(url, callback) {
    const script = document.createElement('script');
    script.type = 'text/javascript';
    // 處理IE
    if (script.readyState) {
      script.onreadystatechange = function () {
        if (script.readyState === 'loaded' || script.readyState === 'complete') {
          script.onreadystatechange = null;
          callback();
        }
      }
    } else {
      // 處理其他瀏覽器的情況
      script.onload = function () {
        callback();
      }
    }
    script.src = url;
    document.body.append(script);
  }

  // 動態(tài)加載js
  loadScript('file.js', function () {
    console.log('加載完成');
  })

2.通過xhr方式加載js文件,不過通過這種方式的話,就可能會面臨著跨域的問題。例子如下:

  const xhr = new XMLHttpRequest();
  xhr.open('get', 'file.js');
  xhr.onreadystatechange = function () {
    if (xhr.readyState === 4) {
      if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {
        const script = document.createElement('script');
        script.type = 'text/javascript';
        script.text = xhr.responseText;
        document.body.append(script);
      }
    }
  }

3.將多個js文件合并為同一個,并且進行壓縮。 原因:目前瀏覽器大多已經(jīng)支持并行下載js文件了,但是并發(fā)下載還是有一定的數(shù)量限制了(基于瀏覽器,一部分瀏覽器只能下載4個),并且,每一個js文件都需要建立一次額外的http連接,加載4個25KB的文件比起加載一個100KB的文件消耗的時間要大。因此,我們最好就是將多個js文件合并為同一個,并且進行代碼壓縮。

javascript作用域

當(dāng)一個函數(shù)執(zhí)行的時候,會生成一個執(zhí)行上下文,這個執(zhí)行上下文定義了函數(shù)執(zhí)行時的環(huán)境。當(dāng)函數(shù)執(zhí)行完畢后,這個執(zhí)行上下文就會被銷毀。因此,多次調(diào)用同一個函數(shù)會導(dǎo)致創(chuàng)建多個執(zhí)行上下文。每隔執(zhí)行上下文都有自己的作用域鏈。相信大家應(yīng)該早就知道了作用域這個東西,對于一個函數(shù)而言,其第一個作用域就是它函數(shù)內(nèi)部的變量。在函數(shù)執(zhí)行過程中,每遇到一個變量,都會搜索函數(shù)的作用域鏈找到第一個匹配的變量,首先查找函數(shù)內(nèi)部的變量,之后再沿著作用域鏈逐層尋找。因此,若我們要訪問最外層的變量(全局變量),則相比直接訪問內(nèi)部的變量而言,會帶來比較大的性能損耗。因此,我們可以將經(jīng)常使用的全局變量引用儲存在一個局部變量里。

const a = 5;
function outter () {
  const a = 2;
  function inner () {
    const b = 2;
    console.log(b); // 2
    console.log(a); // 2
  }
  inner();
}

對象的讀取

javascript中,主要分為字面量、局部變量、數(shù)組元素和對象這四種。訪問字面量和局部變量的速度最快,而訪問數(shù)組元素和對象成員相對較慢。而訪問對象成員的時候,就和作用域鏈一樣,是在原型鏈(prototype)上進行查找。因此,若查找的成員在原型鏈位置太深,則訪問速度越慢。因此,我們應(yīng)該盡可能的減少對象成員的查找次數(shù)和嵌套深度。比如以下代碼

  // 進行兩次對象成員查找
  function hasEitherClass(element, className1, className2) {
    return element.className === className1 || element.className === className2;
  }
  // 優(yōu)化,如果該變量不會改變,則可以使用局部變量保存查找的內(nèi)容
  function hasEitherClass(element, className1, className2) {
    const currentClassName = element.className;
    return currentClassName === className1 || currentClassName === className2;
  }

DOM操作優(yōu)化

  • 最小化DOM的操作次數(shù),盡可能的用javascript來處理,并且盡可能的使用局部變量儲存DOM節(jié)點。比如以下的代碼:

  // 優(yōu)化前,在每次循環(huán)的時候,都要獲取id為t的節(jié)點,并且設(shè)置它的innerHTML
  function innerHTMLLoop () {
    for (let count = 0; count < 15000; count++) {
      document.getElementById('t').innerHTML += 'a';
    }
  }
  // 優(yōu)化后,
  function innerHTMLLoop () {
    const tNode = document.getElemenById('t');
    const insertHtml = '';
    for (let count = 0; count < 15000; count++) {
      insertHtml += 'a';
    }
    tNode.innerHtml += insertHtml;
  }
  • 盡可能的減少重排和重繪,重排和重匯可能會代價非常昂貴,因此,為了減少重排重匯的發(fā)生次數(shù),我們可以做以下的優(yōu)化

1.當(dāng)我們要對Dom的樣式進行修改的時候,我們應(yīng)該盡可能的合并所有的修改并且一次處理,減少重排和重匯的次數(shù)。

  // 優(yōu)化前
  const el = document.getElementById('test');
  el.style.borderLeft = '1px';
  el.style.borderRight = '2px';
  el.style.padding = '5px';

  // 優(yōu)化后,一次性修改樣式,這樣可以將三次重排減少到一次重排
  const el = document.getElementById('test');
  el.style.cssText += '; border-left: 1px ;border-right: 2px; padding: 5px;'

2.當(dāng)我們要批量修改DOM節(jié)點的時候,我們可以將DOM節(jié)點隱藏掉,然后進行一系列的修改操作,之后再將其設(shè)置為可見,這樣就可以最多只進行兩次重排。具體的方法如下:

  // 未優(yōu)化前
  const ele = document.getElementById('test');
  // 一系列dom修改操作

  // 優(yōu)化方案一,將要修改的節(jié)點設(shè)置為不顯示,之后對它進行修改,修改完成后再顯示該節(jié)點,從而只需要兩次重排
  const ele = document.getElementById('test');
  ele.style.display = 'none';
  // 一系列dom修改操作
  ele.style.display = 'block';

  // 優(yōu)化方案二,首先創(chuàng)建一個文檔片段(documentFragment),然后對該片段進行修改,之后將文檔片段插入到文檔中,只有最后將文檔片段插入文檔的時候會引起重排,因此只會觸發(fā)一次重排。。
  const fragment = document.createDocumentFragment();
  const ele = document.getElementById('test');
  // 一系列dom修改操作
  ele.appendChild(fragment);

3.使用事件委托:事件委托就是將目標節(jié)點的事件移到父節(jié)點來處理,由于瀏覽器冒泡的特點,當(dāng)目標節(jié)點觸發(fā)了該事件的時候,父節(jié)點也會觸發(fā)該事件。因此,由父節(jié)點來負責(zé)監(jiān)聽和處理該事件。

那么,它的優(yōu)點在哪里呢?假設(shè)你有一個列表,里面每一個列表項都需要綁定相同的事件,而這個列表可能會頻繁的插入和刪除。如果按照平常的方法,你只能給每一個列表項都綁定一個事件處理器,并且,每當(dāng)插入新的列表項的時候,你也需要為新的列表項注冊新的事件處理器。這樣的話,如果列表項很大的話,就會導(dǎo)致有特別多的事件處理器,造成極大的性能問題。而通過事件委托,我們只需要在列表項的父節(jié)點監(jiān)聽這個事件,由它來統(tǒng)一處理就可以了。這樣,對于新增的列表項也不需要做額外的處理。而且事件委托的用法其實也很簡單:

function handleClick(target) {
  // 點擊列表項的處理事件
}
function delegate (e) {
  // 判斷目標對象是否為列表項
  if (e.target.nodeName === 'LI') {
    handleClick(e.target);
  }
}
const parent = document.getElementById('parent');
parent.addEventListener('click', delegate);

以上就是javascript性能優(yōu)化的方法介紹(附示例)的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!


網(wǎng)站建設(shè)是一個廣義的術(shù)語,涵蓋了許多不同的技能和學(xué)科中所使用的生產(chǎn)和維護的網(wǎng)站。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 一级一片免费播放| 国产又粗又大又爽的视频| www国产精品内射老熟女| 国产日产欧美视频| 国产女同无遮挡互慰高潮91| 手机成人av在线| 妺妺窝人体色www在线小说| 国产三级日本三级在线播放| 黄色成人在线免费观看| 成人羞羞国产免费网站| 国产专区在线视频| 亚洲综合欧美激情| 老太脱裤子让老头玩xxxxx| 日韩亚洲在线视频| 国产xxxx振车| 偷拍盗摄高潮叫床对白清晰| 天天爽人人爽夜夜爽| 免费在线黄网站| mm1313亚洲国产精品无码试看| 日韩激情视频一区二区| 国产a级片免费看| 国产成人美女视频| 亚欧激情乱码久久久久久久久| 亚洲中文字幕无码专区| 中文字幕制服丝袜在线| 红桃视频 国产| 亚洲这里只有精品| 日韩在线第三页| 国产三级日本三级在线播放| 女性隐私黄www网站视频| 国产h视频在线播放| 欧美精品一区免费| 日日摸天天爽天天爽视频| 妺妺窝人体色www在线小说| 国产免费一区二区三区视频| 内射国产内射夫妻免费频道| 熟女性饥渴一区二区三区| 97在线免费公开视频| 日本久久久久久久久久久久| www午夜视频| 男女激烈动态图| 久久人人爽人人爽人人av| 成年人看的毛片| 91视频 -- 69xx| 三级在线视频观看| 一道本在线观看视频| 无码专区aaaaaa免费视频| 九一精品在线观看| 国产欧美精品一二三| 精品成在人线av无码免费看| 99精品视频播放| 午夜激情视频网| 337p粉嫩大胆噜噜噜鲁| 天堂网在线免费观看| 亚洲欧美日本一区二区三区| 日本丰满大乳奶| 无码人妻丰满熟妇区五十路百度| 男生操女生视频在线观看| 50度灰在线观看| 国产成人无码av在线播放dvd| 中文字幕在线观看日| 国产一二三在线视频| 肉色超薄丝袜脚交| 日韩最新中文字幕| 国产亚洲天堂网| 三级在线免费观看| 爱情岛论坛成人| 久在线观看视频| 黄色一级视频播放| 亚洲激情在线观看视频| 日韩视频在线视频| 国产91av视频在线观看| 狠狠热免费视频| 奇米777在线视频| 欧美成人免费高清视频| 欧美久久久久久久久久久久久久| 五月婷婷深爱五月| 精品欧美一区免费观看α√| mm131亚洲精品| 欧美精品第三页| 欧洲精品一区二区三区久久| 在线免费观看av网| 污污的网站免费| 婷婷丁香激情网| 在线视频日韩一区| 日本va中文字幕| 日韩精品无码一区二区三区免费| 久久久久久久久久网| 国产真实老熟女无套内射| 中文字幕超清在线免费观看| 污污视频网站在线| 九九热免费在线观看| 欧美在线一区视频| 日本手机在线视频| 国产69精品久久久久久久| 亚洲中文字幕无码av永久| 日本免费成人网| 国产青青在线视频| 国产成人黄色片| 波多野结衣作品集| 一道本在线免费视频| 日韩av手机版| 天天干天天综合| 久久久国产精华液999999| 亚洲乱码国产一区三区| 污污的网站18| 国产在线视频三区| 台湾无码一区二区| 亚洲天堂伊人网| 国产美女主播在线播放| 亚洲一区二区三区观看| 欧美 日韩 国产在线观看| 一道本在线观看视频| 久久精品网站视频| 国产高清www| 异国色恋浪漫潭| 99免费视频观看| 夜夜添无码一区二区三区| 在线a免费观看| www.com操| 丁香婷婷激情网| 免费观看美女裸体网站| 热久久最新网址| 欧美激情第四页| 欧美在线aaa| 国产精品视频分类| 亚洲 中文字幕 日韩 无码| 黄色一级视频在线播放| 欧美这里只有精品| 久久亚洲国产成人精品无码区| 亚洲免费黄色录像| 911福利视频| 亚洲xxx在线观看| 国模私拍视频在线观看| 黑森林精品导航| 午夜剧场在线免费观看| 欧美一级特黄a| jizz欧美性11| 国产999免费视频| 9色视频在线观看| 欧美亚洲色图视频| 久久视频这里有精品| 日本www在线视频| 国产网站免费在线观看| 99久久国产宗和精品1上映| 午夜精品久久久内射近拍高清 | 日韩精品在线播放视频| 国产精品久久久久久久av福利| 久久黄色片网站| 男人j进女人j| 干日本少妇首页| 性猛交ⅹ×××乱大交| 经典三级在线视频| 老太脱裤让老头玩ⅹxxxx| 男人天堂网视频| xxx国产在线观看| 美女av免费观看| 国产男女在线观看| 日韩成人av免费| 免费看毛片的网址| 爱情岛论坛vip永久入口| 99精品视频国产| 无码粉嫩虎白一线天在线观看 | 日本精品免费在线观看| 深夜黄色小视频| 欧美极品少妇无套实战| 欧美日韩激情视频在线观看| 在线观看免费不卡av| 被灌满精子的波多野结衣| www.99在线| 国产欧美日韩网站| 欧美成人乱码一二三四区免费| 欧美性猛交内射兽交老熟妇| 91网址在线播放| 黄色三级中文字幕| 精品综合久久久久| 波多野结衣家庭教师视频| 400部精品国偷自产在线观看| 国产91在线视频观看| www.69av| 善良的小姨在线| 爱情岛论坛vip永久入口| 亚洲色成人www永久在线观看| 天天插天天操天天射| 成人av一级片| 又大又硬又爽免费视频| 中文字幕av导航| 一路向西2在线观看| 欧美日韩激情视频在线观看| 亚洲色婷婷久久精品av蜜桃| 91看片破解版| 蜜臀一区二区三区精品免费视频| 日韩av黄色网址| 欧美韩国日本在线| 每日在线观看av| 天天夜碰日日摸日日澡性色av| 久久国产精品免费观看| 国产精品探花在线播放| 国产美女18xxxx免费视频| gogogo高清免费观看在线视频|