国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript 性能優(yōu)化技巧分享

shixinzhang / 1337人閱讀

摘要:即使這些動畫庫使用轉換,合成屬性和,但是它們仍然運行在的主線程上。另一方面,動畫和轉換會在主線程中運行,如果能夠高效執(zhí)行,則能避免重新布局重排的情況出現(xiàn)。是一個即將到來的功能集,它能夠脫離主線程執(zhí)行高性能的動畫。

JavaScript 作為當前最為常見的直譯式腳本語言,已經廣泛應用于 Web 應用開發(fā)中。為了提高Web應用的性能,從 JavaScript 的性能優(yōu)化方向入手,會是一個很好的選擇。

本文從加載、上下文、解析、編譯、執(zhí)行和捆綁等多個方面來講解 JavaScript 的性能優(yōu)化技巧,以便讓更多的前端開發(fā)人員掌握這方面知識。

什么是高性能的 JavaScript 代碼?

盡管目前沒有高性能代碼的絕對定義,但卻存在一個以用戶為中心的性能模型,可以用作參考:RAIL模型。

響應

如果你的應用程序能在100毫秒內響應用戶的操作,那么用戶會認為該響應為即時的。這適用于可點擊的元素,不適用于滾動或拖動操作。

動畫

在60Hz的顯示器上,我們希望動畫和滾動時每秒有60幀,這種情況下每幀大約為16ms。在這16ms的時間內,實際上只有8-10ms來完成所有工作,其余時間則由瀏覽器的內部和其它差異占據(jù)。

空閑工作

如果你有一個耗時很久,需要持續(xù)運行的任務時,請確保把它分成很小的塊,以便允許主線程對用戶的輸入操作做出反應。不應該出現(xiàn)一個任務延遲超過50ms的用戶輸入。

加載

頁面加載應該在1000毫秒內完成。在移動設備上,這是一個很難達到的目標,因為它涉及到頁面的互動,而不僅僅是在屏幕上渲染和滾動。

讓我們來看看一些統(tǒng)計數(shù)據(jù):

如果移動網站的加載時間超過三秒,則會有53%的用戶放棄訪問

50%的用戶希望在不到2秒的時間內完成頁面加載

77%的移動網站需要10秒以上的時間來加載3G網絡

19秒是3G網絡上移動站點的平均加載時間

代碼內容

你可能已經注意到了,最大的瓶頸是加載網站所需的時間。具體來說就是 JavaScript 的下載、解析、編譯和執(zhí)行時間。除了加載更少的 JavaScript 文件或者加載的更加靈活以外,看起來沒有其它辦法。

除去啟動網站之外,JavaScript 代碼又是如何實際工作的呢?

在進行代碼優(yōu)化之前,請考慮你當前正在構建的內容。你正在建立的是一個框架還是一個 VDOM 庫?你的代碼是否需要每秒執(zhí)行數(shù)千次操作?你是否正在做一個對時間要求較為嚴格的庫來處理用戶輸入和/或動畫?如果沒有,你需要把時間和精力轉移到更有影響力的地方。

編寫高性能代碼并不是那么重要,因為對于宏觀計劃通常沒有什么影響。50k ops/s 聽起來好于 1k ops/s,但在大多數(shù)情況下整體時間并不會有所改變。

解析、編譯和執(zhí)行

從根本上說,大多數(shù) JavaScript 的性能問題,并不在于運行代碼本身,而是在代碼開始執(zhí)行之前必須采取的一系列步驟。

我們在這里討論抽象層次的問題。計算機上運行的大多數(shù)代碼都是編譯后的二進制格式。意思是說,除了所有的操作系??統(tǒng)級別的抽象外,代碼都可以在硬件上本地運行,不需要準備工作。

JavaScript 代碼不是預編譯的,它在瀏覽器上是可讀的。

JavaScript 代碼首先會被解析,也就是讀取并轉換成可用于編譯的計算機索引的結構,然后再被編譯成字節(jié)碼,最后被編譯成機器碼,用于設備/瀏覽器執(zhí)行。

另一個非常重要的方面是:JavaScript 是單線程的,并且在瀏覽器的主線程上運行。這意味著一次只能運行一個進程。如果你的 DevTools 性能時間線充滿黃色峰值,同時 CPU 占用率達到100%,則將出現(xiàn)丟幀的情況。這是滾動操作常出現(xiàn)的,也是很討厭的一種情況。

在 JavaScript 代碼運行之前,需要完成所有的這些解析、編譯和執(zhí)行工作。在 ChromeV8 引擎中,解析和編譯占 JavaScript 執(zhí)行總時間的50%左右。

所以在這部分中,應該了解兩件事情:

雖然 JavaScript 解析的時間長度和包的大小不是完全線性的,但是需要處理的 JavaScript 越少,則所花時間越少。

你使用的每一個 JavaScript 框架(React,Vue,Angular,Preact ...)都是另一個抽象層次(除非它是一個預編譯的)。這不僅會增加你的包的大小,而且會讓你的代碼變慢,因為你不是直接與瀏覽器通信的。

有些方法可以緩解這種情況,比如使用 service workers 在后臺的另一個線程中執(zhí)行部分工作,或者使用 asm.js 編寫更容易編譯機器指令的代碼。

我們所能做的,就是避免使用 JavaScript 動畫庫。只有在使用常規(guī)的 CSS 轉換和動畫完全無法實現(xiàn)時,才去使用這些庫。

即使這些 JavaScript 動畫庫使用 CSS 轉換,合成屬性和 requestAnimationFrame( ),但是它們仍然運行在 JavaScript 的主線程上。基本上這些庫會使用內聯(lián)樣式每16ms訪問一次 DOM。你需要確保所有的 JavaScript 都在每幀8ms以內完成,才能保持動畫的平滑性。

另一方面,CSS 動畫和轉換會在主線程中運行,如果能夠高效執(zhí)行,則能避免重新布局/重排的情況出現(xiàn)。

考慮到大多數(shù)動畫都在加載或用戶交互的過程中運行,這可以為你的 web 應用程序提供非常重要的調整空間。

web Animations API 是一個即將到來的功能集,它能夠脫離主線程執(zhí)行高性能的 JavaScript 動畫。但就目前而言,還需要繼續(xù)使用 CSS 轉換等技術。

捆綁尺寸非常重要

現(xiàn)在已經不再是在 結束標簽之前包含有多個

閱讀需要支付1元查看
<