摘要:用局部變量存儲(chǔ)本地范圍之外的變量值,如果它們?cè)诤瘮?shù)中的使用多于一次。將它的值存入一個(gè)局部變量,消除一次搜索過(guò)程。地將此值存入一個(gè)局部變量中。
總結(jié)了一下《高性能javascript》書(shū)中比較核心的點(diǎn),并補(bǔ)充了一些點(diǎn)。
第一章 DOM標(biāo)簽將所有 標(biāo)簽放置在頁(yè)面的底部,緊靠 body 關(guān)閉標(biāo)簽的上方。此法可以保證頁(yè)面在腳本 運(yùn)行之前完成解析。
將腳本成組打包。頁(yè)面的 標(biāo)簽越少,頁(yè)面的加載速度就越快,響應(yīng)也更加迅速。不論外部腳本 文件還是內(nèi)聯(lián)代碼都是如此。
LazyLoad 還可以下載多個(gè) JavaScript 文件,并保證它們?cè)谒袨g覽器上都能夠按照正確的順序執(zhí)行。
了解性能監(jiān)控的API
包括window.performance以及W3C Resourcing Timing
作用域也關(guān)系到性能,但是要理 解速度與作用域的關(guān)系。
全局變量總是 處于運(yùn)行期上下文作用域鏈的最后一個(gè)位置,所以總是最遠(yuǎn)才能觸及的,最慢。
用局部變量存儲(chǔ)本地范圍之外的變量值,如果它們?cè)诤瘮?shù)中的使用多于一次。
(function(d,$) { d.getElementById("test"); ... $(".test").hide(); .... }(document, jQuery))
作用域:
深入原形鏈越深,搜索的速度就會(huì)越慢。
屬性嵌套越深,訪問(wèn)速度越慢。
將它的值存入一個(gè)局部變量,消除一次搜索過(guò)程。
函數(shù)的節(jié)流與防反跳
參閱underscore庫(kù)的throttle函數(shù)(節(jié)流)與debounce函數(shù)(防反跳)。其中,throttle的含義是:每XX秒內(nèi)只執(zhí)行一次;debounce的含義是:當(dāng)連續(xù)觸發(fā)函數(shù)調(diào)用時(shí),在最后一次觸發(fā)的XX秒以后才開(kāi)始一次調(diào)用。
如何實(shí)現(xiàn)這一機(jī)制請(qǐng)看淺談 Underscore.js 中 _.throttle 和 _.debounce 的差異
減少DOM 操作問(wèn)題的量化
將數(shù)組的 length 屬性緩存到一個(gè)變量中
瀏覽器需要重新計(jì)算元素的幾何屬性,而且其他元素的幾何屬性和位置也會(huì)因此改變 受到影響。 元素位置改變,尺寸, 內(nèi)容, 瀏覽器窗口改變尺寸
在反復(fù)訪問(wèn)的地方使用局部變量存放 DOM 引用.
將所有改變合并在一起執(zhí)行,只修改 DOM 一次??赏ㄟ^(guò)使用 cssText 屬性實(shí)現(xiàn)。
從文檔流中摘除該元素; 隱藏元素,進(jìn)行修改,然后再顯示它。 對(duì)其應(yīng)用多重改變; 將元素帶回文檔中;
Example:
1.頁(yè)面頂部可以“折疊/展開(kāi)”的元素稱作“動(dòng)畫(huà)元素”,用絕對(duì)坐標(biāo)對(duì)它進(jìn)行定位,當(dāng)它的尺寸改變時(shí),就 不會(huì)推移頁(yè)面中其他元素的位置,而只是覆蓋其他元素。
2、展開(kāi)動(dòng)作只在“動(dòng)畫(huà)元素”上進(jìn)行。這時(shí)其他元素的坐標(biāo)并沒(méi)有改變,換句話說(shuō),其他元素并沒(méi)有因?yàn)椤皠?dòng) 畫(huà)元素”的擴(kuò)大而隨之下移,而是任由動(dòng)畫(huà)元素覆蓋。
3、“動(dòng)畫(huà)元素”的動(dòng)畫(huà)結(jié)束時(shí),將其他元素的位置下移到動(dòng)畫(huà)元素下方,界面“跳”了一下。
一個(gè)簡(jiǎn)單而優(yōu)雅的處理 DOM 事件的技術(shù)是事件托管。它基于這樣一個(gè)事實(shí):事件逐層冒泡總能被父元
素捕獲。采用事件托管技術(shù)之后,你只需要在一個(gè)包裝元素上掛接一個(gè)句柄,用于處理子元素發(fā)生的所有 事件。
只有一種循環(huán)比其他 循環(huán)明顯要慢:for-in 循環(huán) 最慢。 要搜索實(shí)例或原形。
減少每次迭代中操作的總數(shù)可以大幅度提高循環(huán)整體性能。 地將此值存入一 個(gè)局部變量中。 倒序循環(huán)。
使用遞減循環(huán)
for (var i=items.length; i--; ){ process(items[i]); } var values = [0,1,2,3,4]; var len = values.length; for (var i = 0; i--) { 循環(huán)... }
超過(guò)1000次的循環(huán),使用Duff"s Device
var i = items.length % 8; while(i) { process(items[i--]); } i = Math.floor(items.length / 8); while(i) { process(items[i--]); process(items[i--]); process(items[i--]); process(items[i--]); process(items[i--]); process(items[i--]); process(items[i--]); process(items[i--]); }
Conditionals 條件表達(dá)式
如果條件較少時(shí),if-else 容易閱讀,而條件較多時(shí) switch 更容易閱讀。
當(dāng)你使用了太多的遞歸,超過(guò)最大調(diào)用棧尺寸時(shí),瀏覽器會(huì)出錯(cuò)并彈出error信息。
任何可以用遞歸實(shí)現(xiàn)的算法都可以用迭代實(shí)現(xiàn)。for循環(huán)代替遞歸( 運(yùn)行的代碼總量越大,使用這些策略所帶來(lái)的性能提升就越明顯。)
第五章 Strings and Regular Expressions 字符串 和正則表達(dá)式str += "two"; str = str + "one" + "two"; newStr = strs.join("");
盡量避免一個(gè)正則表達(dá)式做太多的工作
第六章 Responsive Interfaces 響應(yīng)接口如果一個(gè)函數(shù)運(yùn)行時(shí)間太長(zhǎng),那么查看它是否可以分解成一 系列能夠短時(shí)間完成的較小的函數(shù)。
可通過(guò)原生的 Date 對(duì)象跟蹤代碼的運(yùn)行時(shí)間。
當(dāng)多個(gè)重復(fù)的定時(shí)器被同時(shí)創(chuàng)建會(huì)產(chǎn)生性能問(wèn)題。
網(wǎng)頁(yè)工人線程
第七章 Ajax 異步 JavaScript 和 XML總的來(lái)說(shuō)越輕量級(jí)的格式越好,最好是 JSON jsonp相對(duì)慢一點(diǎn)
設(shè)置http頭設(shè)置緩存 expires etag if-none-match if-modified-since
第八章 Programming Practices 編程實(shí)踐Lazy Loading 延遲加載 按需加載(事件監(jiān)聽(tīng) 函數(shù) js文件 css文件 )
JavaScript 引擎提供的原生方法
原生的 querySelector()和 querySelectorAll()方法查詢dom
合并 JavaScript 文件
預(yù)處理 JavaScript 文件
JavaScript 壓縮
JavaScript 緊湊
開(kāi)發(fā)過(guò)程中的編譯(預(yù)處理)
緩存 的應(yīng)用 JavaScript 文件
cdn
性能分析工具
只直出首屏頁(yè)面可視內(nèi)容,其他在客戶端上延遲處理
13.DNS prefeching
目前三種渲染頁(yè)面的方式:
1.ajax拉取數(shù)據(jù)
2.后臺(tái)直出數(shù)據(jù)和模版,js模版引擎去渲染(降低白屏)
3.后臺(tái)直出拼好的頁(yè)面 (降低白屏)
HTTP2.0 首部壓縮
HTTP 2.0 在客戶端和服務(wù)器端使用“首部表”來(lái)跟蹤和存儲(chǔ)之前發(fā)送的鍵-值對(duì),所有的HTTP2.0的請(qǐng)求都在一個(gè)TCP鏈接上.HTTP2.0所有通信都是在一個(gè)TCP連接上完成。HTTP 2.0 把 HTTP 協(xié)議通信的基本單位縮小為一個(gè)一個(gè)的幀,這些幀對(duì)應(yīng) 著邏輯流中的消息。并行地在同一個(gè) TCP 連接上雙向交換消息。就好比,我請(qǐng)求一個(gè)頁(yè)面http://www.qq.com。頁(yè)面上所有的資源請(qǐng)求都是客戶端與服務(wù)器上的一條TCP上請(qǐng)求和響應(yīng)的!
HTTP2.0的請(qǐng)求優(yōu)先級(jí)
HTTP2.0的服務(wù)器推送
除了對(duì)最初請(qǐng)求的響應(yīng)外,服務(wù)器還可以額外向客戶端推送資源,而無(wú)需客戶端明確地請(qǐng)求。
有了HTTP2.0的服務(wù)器推送,HTTP1.x時(shí)代的內(nèi)嵌資源的優(yōu)化手段也變得沒(méi)有意義了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87911.html
摘要:譯文地址譯唯快不破應(yīng)用的個(gè)優(yōu)化步驟前端的逆襲知乎專欄原文地址時(shí)過(guò)境遷,應(yīng)用比以往任何時(shí)候都更具交互性。使用負(fù)載均衡方案我們?cè)谥坝懻摼彺娴臅r(shí)候簡(jiǎn)要提到了內(nèi)容分發(fā)網(wǎng)絡(luò)。換句話說(shuō),元素的串形訪問(wèn)會(huì)削弱負(fù)載均衡器以最佳形式 歡迎關(guān)注知乎專欄 —— 前端的逆襲歡迎關(guān)注我的博客,知乎,GitHub。 譯文地址:【譯】唯快不破:Web 應(yīng)用的 13 個(gè)優(yōu)化步驟 - 前端的逆襲 - 知乎專欄原文地...
摘要:想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳博客一年百來(lái)篇優(yōu)質(zhì)文章等著你這是性能優(yōu)化的第篇,上一篇在下面看點(diǎn)擊查看性能優(yōu)化使用分離數(shù)據(jù)的正確方法性能優(yōu)化圖片優(yōu)化讓網(wǎng)站大小減少性能優(yōu)化緩存事件來(lái)提高性能性能優(yōu)化種優(yōu)化和加快網(wǎng)站速度的方法隨著我們的應(yīng)用程序的不斷增 showImg(https://segmentfault.com/img/bVbp4cY?w=947&h=424); 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳Gi...
摘要:雖然有著各種各樣的不同,但是相同的是,他們前端優(yōu)化不完全指南前端掘金篇幅可能有點(diǎn)長(zhǎng),我想先聊一聊閱讀的方式,我希望你閱讀的時(shí)候,能夠把我當(dāng)作你的競(jìng)爭(zhēng)對(duì)手,你的夢(mèng)想是超越我。 如何提升頁(yè)面渲染效率 - 前端 - 掘金Web頁(yè)面的性能 我們每天都會(huì)瀏覽很多的Web頁(yè)面,使用很多基于Web的應(yīng)用。這些站點(diǎn)看起來(lái)既不一樣,用途也都各有不同,有在線視頻,Social Media,新聞,郵件客戶端...
摘要:特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點(diǎn)多,可以很快搞定,沒(méi)想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補(bǔ)充。有錯(cuò)誤的地方,還請(qǐng)斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會(huì)及時(shí)更新,平時(shí)業(yè)務(wù)工作時(shí)也會(huì)不定期更...
摘要:是如何工作的深入網(wǎng)絡(luò)層如何優(yōu)化性能和安全這是專門(mén)探索及其所構(gòu)建的組件的系列文章的第篇。為了使網(wǎng)絡(luò)層高效,它需要扮演的角色不僅僅是一個(gè)簡(jiǎn)單的套接字管理器。套接字組織在按源分組的池中,每個(gè)池執(zhí)行自己的連接限制和安全約束。 JavaScript 是如何工作的:深入網(wǎng)絡(luò)層 + 如何優(yōu)化性能和安全 這是專門(mén)探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 12 篇。 如果你錯(cuò)過(guò)了前面的...
摘要:是如何工作的深入網(wǎng)絡(luò)層如何優(yōu)化性能和安全這是專門(mén)探索及其所構(gòu)建的組件的系列文章的第篇。為了使網(wǎng)絡(luò)層高效,它需要扮演的角色不僅僅是一個(gè)簡(jiǎn)單的套接字管理器。套接字組織在按源分組的池中,每個(gè)池執(zhí)行自己的連接限制和安全約束。 JavaScript 是如何工作的:深入網(wǎng)絡(luò)層 + 如何優(yōu)化性能和安全 這是專門(mén)探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 12 篇。 如果你錯(cuò)過(guò)了前面的...
閱讀 3974·2021-09-27 13:35
閱讀 1121·2021-09-24 09:48
閱讀 2940·2021-09-22 15:42
閱讀 2377·2021-09-22 15:28
閱讀 3180·2019-08-30 15:43
閱讀 2645·2019-08-30 13:52
閱讀 3000·2019-08-29 12:48
閱讀 1483·2019-08-26 13:55