摘要:高級開發人員可能會仔細分析他們的捆綁包,以幫助確定減少不必要依賴。在運行過程中,長時間運行的可以阻塞主線程導致頁面沒有響應。然后當最終被取出時,附加事件請注意這有內在的花銷。發送一個最小功能的頁面包含實行當前功能的。保持低這些問題。
原文
當我們構建的網頁大量依賴于Javascript,我們有些時候需要研究那些不太容易看得見的消耗。在這篇文章中,我將介紹為什么一點規則可以幫助如果你想讓你的網站加載&是交互式快速移動設備上。
Network 網絡當大多數的開發者考慮Javascript的代價時,他們主要考慮的是下載和實行的消耗。在線上派遣更多的字節的JavaScript需要更長的時間用戶的連接。https://cdn-images-1.medium.c...*U00XcnhqoczTuJ8NH8UhOw.png
這是一個問題,即使在發達國家,作為有效的網絡連接類型用戶可能不會是3g, 4g或WiFi。你可能是在一個咖啡店連著2G的熱點。
你可以減少網絡傳輸Javascript帶來的代價:
只傳輸用戶需要的 代碼分離可以起效。
使用minify文件( babel-minify or uglify-es for ES2015)
壓縮(Brotli, gzip or Zopfli ) Brotli對gzip在壓縮比例上效果顯著。 它幫助CertSimple節約了17%的JS字節和LinkedIn節約了4%的加載時間。
移除不需要的代碼 DevTools檢測代碼覆蓋率。對于多帶帶的代碼 如 tree-shaking, Closure Compiler的高級優化,庫插件 lodash-babel-plugin,Webpack的ContextReplacementPlugin像Moment.js 使用babel-preset-env & browserlist來避免在現代瀏覽器中已經被轉換的特性。高級開發人員可能會仔細分析他們的Webpack捆綁包,以幫助確定減少不必要依賴。
緩存來減少網絡傳輸 確定腳本的最佳生存期(max - age)&提供驗證令牌(ETag),以避免傳輸未更改的字節。服務人員緩存可以使您的應用程序網絡具有彈性,并使您能夠訪問V8的代碼緩存等特性。了解關于文件名散列的長期緩存。
工具(https://cdn-images-1.medium.c...*8Spf9To8dzTG3Xy9s57oVA.png)
Parse/Compile 解析一旦下載下來,JavaScript最大的開銷之一就是使用JS引擎來解析/編譯此代碼。在Chrome DevTools中,解析和編譯是性能面板中黃色“腳本”時間的一部分。
自底向上/調用樹允許查看準確的解析/編譯時間:
https://cdn-images-1.medium.c...*GdrVt_BTTzzBOIoyZZsQZQ.png
為什么這是一個問題?
https://cdn-images-1.medium.c...*Dirw7RdQj9Dktc-Ny6-xbA.png
https://cdn-images-1.medium.c...*Dirw7RdQj9Dktc-Ny6-xbA.png
花很長時間解析/編譯代碼會極大地延遲用戶與站點交互的速度。您發送的JavaScript越多,在您的站點進行交互之前解析和編譯它的時間就越長。
https://cdn-images-1.medium.c...*6Y665hpxfWNMu2EXu3VGlw.png
Byte-for-byte, JavaScript is more expensive for the browser to process than the equivalently sized image or Web Font — Tom Dale
意思就是 對于瀏覽器來說,JS比同等大小的圖片和web字體更昂貴。
與JavaScript相比,處理相當大小的圖像需要花費大量的成本(它們仍然需要被解碼!),但是在普通的移動硬件上,JS更有可能對頁面的交互性產生負面影響。
JS VS image: https://cdn-images-1.medium.c...*PRVzNizF9jQ_QADF5lQHpA.png
當我們討論解析和編譯速度慢時,執行環境很重要,我們討論的普通手機。用戶可以是擁有慢CPU和GPU的手機沒有L2/L3緩存,甚至可能是內存受限。
Network capabilities and device capabilities don’t always match up. A user with an amazing Fiber connection doesn’t necessarily have the best CPU to parse and evaluate JavaScript sent to their device. This is also true in reverse..a terrible network connection, but a blazing fast CPU.?—?Kristofer Baxter, LinkedIn
JavaScript中啟動性能,我注意到在低,高端的硬件上解析~ 1 mb解壓(簡單的)JavaScript的成本。在市場上最快的手機和普通手機之間解析/編譯代碼存在有2-5x的時間差異。
真實的網站如CNN,在高端手機iPhone8上花費約4s解析和編譯CNN的JS,而普通手機(moto G4) 花費約13s.這速度可以顯著影響用戶與這個網站的交互。
這強調了平均測試硬件的重要性(如Moto G4)而不是你口袋里的手機。然而環境問題:優化設備和網絡環境的用戶。
分析可以提供深入了解實際用戶訪問你的網站使用移動設備。這可以提供機會了解真正約束CPU /GPU他們的操作。
Are we really sending down too much JavaScript?
使用HTTP存檔(~ 500 k網站)來分析JavaScript在移動設備上的狀態,我們可以看到50%的網站花費14秒去響應交互。這些網站僅僅為了解析和編譯JS花了4秒。
https://cdn-images-1.medium.c...*sVgunAoet0i5FWEI9NSyMg.png
從頁面中刪除非關鍵的JavaScript可以減少傳輸時間、cpu密集型解析和編譯以及潛在的內存開銷。這也有助于讓你的頁面更快捷。
執行時間 Execution Time執行時間:https://cdn-images-1.medium.c...*ec0wEKKVl7iQidBks3oDKg.png
不僅僅是解析和編譯花費時間。 JavaScript執行(運行代碼一次解析/編譯)的操作,必須在主線程上。 長的執行時間也可以推出用戶于這個網站的交互時間。
If script executes for more than 50ms, time-to-interactive is delayed by the entire amount of time it takes to download, compile, and execute the JS?—?Alex Russell
為了解決這個問題,Javascript能從小塊中獲益,以避免鎖定主線程。探索你是否能減少在執行過程中完成的工作量。
模式用于減少JS的代價當你試圖保持解析JavaScript /編譯&網絡傳輸時間慢,模式像基于路徑分割或PRPL可以起到幫助。
PRPL是通過積極互動的模式,優化代碼分隔和緩存。
PRPL 模式
https://cdn-images-1.medium.c...*VgdNbnl08gcetpqE1t9P9w.png
讓我們來可視化下它帶來的影響。
我們可以分析普通手機上的網站加載時間和使用V8運行回調的漸進式應用。我們可以看到解析時間(橙色所示)是一個重要的部分,很多的這些網站自由支配自己的時間
wego 網站是使用了PRPL, 設法保持低解析時間的路線,讓互動非常快。面的許多其他網站采用代碼分隔和績效預算試圖降低JS成本。
其他花銷JS在其他方面影響網頁性能:
內存 頁面會出現閃避或由于GC(垃圾收集)帶來的經常性暫停。當瀏覽器回收內存,JS執行停了下來,所以瀏覽器經常收集垃圾可以暫停執行比我們可能更頻繁。避免內存泄漏和頻繁的gc暫停繼續頁面閃避。
在運行過程中,長時間運行的JavaScript可以阻塞主線程導致頁面沒有響應。分割成小塊(使用requestAnimationFrame()或requestIdleCallback(調度))可以最小化響應問題
進步的Bootstrapping許多網站優化內容的可見性是以昂貴的交互為代價。當你有大量的JS塊時,為了獲得快速的渲染,開發者常常采用server-side渲染方式。然后當JS最終被取出時,upgrade附加事件??
請注意: 這有內在的花銷。1)通常發送更大的HTML響應,可以推動我們的交互性 2)可以使用戶在一個恐怖谷理論?? 一半的性能是不能實際交互的要等到JS完全處理結束。
Progressive Bootstrapping可能是一個好方法。發送一個最小功能的頁面(包含實行當前功能的JS/HTML/CSS)。當更多的資源到達時,應用可以lazy-load 和釋放更多的特征。
合理的加載代碼是一個圣杯。PRPL和漸進的引導模式可以實現這種想法。
總結傳輸大小對低端網絡至關重要。解析時間為CPU綁定的設備是很重要的。保持低這些問題。
團隊發現采用嚴格的績效預算成功地減少了他們的JavaScript傳輸和解析/編譯時間。Alex Russell’s Can yo afford it?: Real-world Web Performance Budgets
如果你在構建一個目標設備是移動端的,盡力發展典型的硬件上,降低你的JavaScript解析/編譯時間,采用績效預算,以確保你的團隊能夠關注他們的JavaScript成本。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/90138.html
摘要:例如可以用構造函數實現單例模式。例如當這個構造函數被調用,它會檢查是否存在。工廠模式工廠模式使用工廠方法創建對象,而不指定所創建對象的確切類或構造函數。雖然了解審設計模式很重要,但是不要過度使用它們。 By Sukhjinder Arora | Oct 16, 2018 原文 當你開始了一個新項目,你不會馬上開始編寫代碼。第一步,你必須定義這個項目解決什么問題和適用范圍,然后列出這個項...
摘要:動態規劃復雜度時間空間思路直到房子,其最小的涂色開銷是直到房子的最小涂色開銷,加上房子本身的涂色開銷。我們在原數組上修改,可以做到不用空間。代碼找出最小和次小的,最小的要記錄下標,方便下一輪判斷 Paint House There are a row of n houses, each house can be painted with one of the three colors...
摘要:題目解答這類題還是先找臨時的結果,由臨時的結果最終推出最終解。比如說用存到個的時候最小的但是到第個的時候,有三種情況涂當我涂紅的時候,前面一個只能涂藍或者綠,所以我只能加上這兩種情況的最小值,作為此次計算的最小值,以此類推。 題目:here are a row of n houses, each house can be painted with one of the three co...
摘要:線性循環神經網絡這部分教程我們來設計一個簡單的模型,這個模型的輸入是一個二進制的數據流,任務是去計算這個二進制的數據流中存在幾個。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/160... 這篇教程是翻譯Peter Roelants寫的循環神經網絡教程,作者已經授權翻譯,這是原文。 該...
摘要:題目解答利用的思路,只不過把三種顏色換成了種顏色,所以是如何把它的復雜度降到那么就是如果將顏色的部分只掃一遍。參考的里只需要記錄下每個的最小的兩個顏色。 題目:There are a row of n houses, each house can be painted with one of the k colors. The cost of painting each house w...
閱讀 2882·2021-11-22 09:34
閱讀 1211·2021-11-19 09:40
閱讀 3335·2021-10-14 09:43
閱讀 3566·2021-09-23 11:22
閱讀 1601·2021-08-31 09:39
閱讀 880·2019-08-30 15:55
閱讀 1414·2019-08-30 15:54
閱讀 854·2019-08-30 15:53