JS加載慢?谷歌大神帶你飛!(文末送電子書)

2021-01-11 前端達人

作者介紹:Addy osmani

就職谷歌Chrome團隊,致力於讓網站運行速度更快,他參與的項目包括——lighthouse

隨著移動網際網路快速發展,移動端網站的頁面效果也越來越絢,但是交互體驗或多或少有些「遲鈍」?這是為啥呢?

首先JavaScript運行在手機瀏覽器上會產生不小的系統開銷,由於這個問題存在,Addy osmani 將會帶著大家探討移動端網站的腳本問題,讓其在大多數手機瀏覽器上運行更快,更輕。

我們在構建交互式網站自然少不了JavaScript, 為了達到更好的交互,我們讓用戶瀏覽器加載了太多的JavaScript腳本。不知道大家是否有這樣的瀏覽體驗:我們在手機瀏覽器上刷網頁,點擊連結或者滑動頁面時,網頁一點反應都沒。這種經歷,想必大家都有,因為對於手機瀏覽器來說,運行加載JavaScript會消耗不小的系統資源,因此延遲了用戶的交互響應,今天我將會給大家介紹一些有效的方法策略,提升用戶在手機端的使用體驗。

太多的「交互」,讓網站更臃腫!

當你的用戶用手機訪問你的網站時,你的網站讓用戶的瀏覽器加載了大量的文件,其中很多是腳本文件。也許你為了方便開發或者為了更炫的效果,引入了腳本庫或插件庫,從來沒有檢查確認到底加載了多少腳本,體積有多大?加載的腳本是否對用戶有用?對於我們多說前端客來說,我們是如此的喜歡JavaScript,但是我們不得不正視它會消耗不小的系統資源。

不少熱門的網站,向用戶的瀏覽器發送了大於1MB的腳本文件。只有為數不多的網站進行了腳本文件壓縮,使腳本體積大小降到350KB左右,那些未壓縮腳本的網站,如果腳本超過1MB大小,您的用戶至少需要等待14秒的時間才能正常使用你的網站。(部分熱門移動網站腳本加載分析報告:https://beta.httparchive.org/reports/loading-speed)

為什麼這麼慢?用戶大多數是在不穩定的行動網路加載你的網站,腳本加載完了,需要手機CPU進行運行處理。

以下是目前大多數網站存在的問題:

使用了用戶界UI框架(例如bootstrap)客戶端框架或交互依賴框架(React,vue)Polyfills(但是現代瀏覽器並不需要)未壓縮的腳本工具庫(例如moment.js)隨著需求的增加,腳本的數量也在增加,體積也再不斷變大,因此頁面運行的時間也越來越長!

現代網頁加載時...

一個網頁加載時,對於用戶來說:網頁是否還在加載?加載的內容是否有用?功能是否能用?當網頁的內容一點點呈現給用戶時:導航顯示一部分出來,伺服器是否還在正常發送內容?當文本和其他非可見的內容,是不是用戶需要的,內容加載完了,用戶能否正常的點擊和滑動?

所謂的交互式頁面,必須快速響應用戶的輸入,因此javaScript腳本應該快速響應用戶的交互,無論用戶點擊連結還是滾動瀏覽頁面,用戶都需要頁面快速響應自己的行為。

為了最大化的滿足產品業務需求,您可能要求用戶的客戶端運行很多事件,由於JavaScript語言的特點,主線程上的事件延遲了交互元素的呈現,對於許多公司來說縮短交互時間是一個不小的挑戰。

什麼才是好的交互目標?

我們Chrome團隊認為,在大多數中等手機設備(https://calendar.perfplanet.com/2017/time-to-interactive-measuring-more-of-the-user-experience/),3G或4G的網絡環境下,5秒內完成用戶的交互響應,這就是良好的交互目標。你可能會說:我們的用戶都是用高端的手機和使用快速的網絡。但是我們所謂的用戶呢?——在使用「快速」的咖啡店的共享wifi或移動的車廂裡訪問我們的網站,他們的手機實際只能獲取2G或3G的速度。

哪些網站開始減少腳本的體積,縮短了用戶的交互時間?

Pinterest.com 將原先的腳本從2.5MB減少至200KB以下,交互時間從23秒減少至5.3秒(https://medium.com/dev-channel/a-pinterest-progressive-web-app-performance-case-study-3bd6ed2e6154),正式由於這個改進,網站的收入增長了44%,註冊量增加753%,行動網路用戶的活躍度增長了103%(https://medium.com/@Pinterest_Engineering/a-one-year-pwa-retrospective-f4a2f4129e05);autotrader網站將腳本的體積減少了56%,縮短了50%的交互時間。(https://engineering.autotrader.co.uk/2017/07/24/how-we-halved-page-load-times.html)。

對於一個移動網站時,不僅要考慮腳本的體積大小,響應時間,還要考慮移動變化不穩定的手機網絡和大多數終端手機的硬體環境。

為什麼JavaScrip的代價如此之高?

我們都清楚一個請求發送至伺服器後,伺服器會逐步返回一些HTML內容,在逐步解析渲染DOM時發現標記不同的資源(CSS,JavaScript)以及圖片資源,然後完成這些文件的下載和處理。

如果要讓JavaScript快速相應用戶的交互,我們必須要讓腳本快速的加載和編譯執行,由於JavaScript需要快速完成編譯才能執行用戶的響應,這個過程必然會影響延遲用戶的交互體驗。

還有一點需要記住,網絡上同等的資源,消耗的系統資源卻不同。一個200KB的圖片絕對不等於一個200KB的腳本消耗的資源,下載這些資源時間可能相同,但是消耗的資源成本卻不一樣。

不同類型的手機

現實就是這樣,並非每個人都用得起高端手機,還有大部分用戶使用中低端手機。由於中低端手機CPU,GPU的限制,處理JavaScript等資源的時間也不同。因此我們應該在真實的手機環境和網絡環境下測試至關重要。檢查分析您的用戶訪問行為至關重要,如果您無法購買太多中低端手機進行測試,你可以使用這個在線網站工具WebPageTest(webpagetest.org/easy),進行在線測試。(以下是小編前端達人http://www.qianduandaren.com的測試效果)

了解你的網站受眾十分重要,並非每個網站都要滿足低端手機在2G的環境下表現良好,你應該保證你的大多數用戶快速加載你的網站。

如何減少JavaScript腳本的發送

Code splitting(代碼分割)技術——將會幫你拆解大的JavaScript腳本文件,實現了腳本的按需加載(lazy-load)。這樣有效的避免了將單個「main.js」整個站點的腳本文件發送給用戶。

將代碼引入站點的最佳方法是動態import(),相關介紹請點擊查看https://developers.google.com/web/updates/,下面這個例子使我們常見的靜態引入方法:

import{add}from'./math'

console.log(add(30,15));

如果使用動態import(),我們可以按需加載引入math腳本文件,例如實現點擊一個按鈕動態引入math腳本

const btn= document.getElementByld('load);

btn.addEventListener('click',()=>{

import('./math').then(math =>{

console.log(math.add(30,151));

});});

使用webpack構建的項目也能很方便的實現按需加載,具體如何使用可以點擊查看https://www.jianshu.com/p/b3b8fb8a2336這篇文章。代碼分割同時可以應用在路由加載、組件加載、頁面加載等方面,以下分別是使用React,Vue,Angular使用Code splitting的使用指南:

React——https://medium.freecodecamp.org/code-splitting-with-react-and-react-router-62e174382d4cVueJS——https://router.vuejs.org/zh/guide/advanced/lazy-loading.htmlAngular——https://angular.io/guide/lazy-loading-ngmodules如果你正在使用React,我很高興向您推薦推薦React Loadable(https://github.com/jamiebuilds/react-loadable),實現了動態高效的加載組件,以下代碼是我們使用靜態方法引入gallery組件:

import GalleryComponent from 『./GalleryComponent』;

const My Component=()=>(<GalleryComponent/>);

使用React Loadable後,我們改下上面的代碼:

import Loadable from 'react-loadable』;

const LoadableGallerycomponent=Loadable({

loader:()=>import('./GalleryComponent'),

loading:()=><div>Loading...</div>,

});

constMyComponent=()=><LoadableGalleryComponent/>);

最近許多大型團隊正在使用Code splitting方法改寫重寫他們的手機端網站,並取得巨大的成果。比如Twitter他們背後優化的故事——https://blog.twitter.com/engineering/en_us/topics/open-source/2017/how-we-built-twitter-lite.html,Tinder背後優化的故事——https://medium.com/@addyosmani/a-tinder-progressive-web-app-performance-case-study-78919d98ece0,他們都通過此項技術將交互時間縮短了50%。

Next.js[react](https://github.com/zeit/next.js/),Preact CLI(https://github.com/developit/preact-cli) ,PWA starter kit(https://github.com/polymer/pwa-starter-kit) 這些框架設計之初的首要目標就是解決移動端網站的性能問題,讓代碼快速加載響應用戶的交互。

值得慶幸的事情,JavaScript生態為我們提供了分析打包後所有組件與組件的依賴關係的可視化工具,幫助我們分析。比如:

Webpack Bundle Analyzer( https://www.npmjs.com/package/webpack-bundle-analyzer)Source Map Explorer(https://github.com/danvk/source-map-explorer)Bundle Buddy (github.com/samccone/bundle-buddy)

優化,監控

如果你不確定你的JavaScript性能是否有問題,你可以使用Chrome提供的Lighthouse——是一個Google開源的自動化工具,主要用於改進網絡應用(移動端)的質量。目前測試項包括頁面性能、PWA、可訪問性(無障礙)、最佳實踐、SEO。Lighthouse會對各個測試項的結果打分,並給出優化建議,這些打分標準和優化建議可以視為Google的網頁最佳實踐。

還有一件值得你監控和關注的事情,就是檢查有沒有將未使用的代碼發送給用戶, code coverage(https://developers.google.com/web/updates/2017/04/devtools-release-notes#coverage)——谷歌瀏覽器開發者工具中的代碼覆蓋率面板,此面板內會告訴你哪些代碼未使用,哪些又是使用了的。這樣可以精簡掉未使用的代碼來減小頁面的大小。

這些工具對於識別需要分割代碼及哪些需要延長加載非關鍵腳本是非常有價值的,慶幸的是有一套標準的評估指標指引優化——https://timkadlec.com/2014/11/performance-budget-metrics/

設計合理的優化指標

定義一個可衡量可測試的優化目標至關重要,有個標準的行為指南有助指引整個團隊圍繞著目標不斷的改善用戶交互體驗。指標主要包含以下幾個方面:

裡程碑時間——頁面加載完,具備響應用戶的時間。數量指標——JavaScript腳本大小,多少文件請求數,圖片數量和大小基於規則的指標分數——我們可以通過專業的工具Lighthouse或WebPageTest等工具進行相關的評分。績效指標對於團隊來說,最大的挑戰並不是技術而是公司的文化,我們需要開會不斷的圍繞目標進行討論,向業務運營團隊諮詢他們期望的目標並接受各種相關質疑,同時向工程技術人員傳達會議目標讓其解決瓶頸問題,雖然過程有些痛苦,但是對項目的推進還是有很大的幫助。

那麼有什麼樣的工具能夠幫助我們決策制定合理化目標並生成可視化的報告呢,你可以使用 lighthouse CI project (https://github.com/ebidel/lighthouse-ci),Calibre(https://calibreapp.com/),treo(https://treo.sh/),speedcurve(https://speedcurve.com)

快點、再快點

許多小的改變將會帶來巨大的收益,儘可能的減少JavaScipt的體積換取更短用戶交互時間,如果你能漸進式的逐步推進這個目標,你的用戶會十分感謝你。

更多精彩內容,請微信關注」前端達人」公眾號!

新年大禮包

關注「前端達人」公眾號,回復「新年大禮包」獲取英文電子書:

更多精彩內容,請微

相關焦點

  • 帝國cms+jquery.lazyload.js實現圖片延遲懶加載的極簡方法
    如果你對網站速度優化有一定了解,或者你是用過百度統計提供的網站速度診斷工具的網站管理者,會知曉一件事:一個網站頁面圖片過多的話,加載時會導致網頁打開變慢,甚至看得見「卡頓」的現象。這不僅會影響用戶的瀏覽體驗,也會影響到搜尋引擎對網站的優劣評判及seo。
  • 快到飛起:提高網頁加載速度的優化思路與技巧
    網頁加載慢的後果1 嚴重影響直接用戶體驗這個每個人都有很直觀的體會,如果一個網頁半天打不開,絕大部分人都會選擇直接關閉。2 影響在SEO上的表現搜尋引擎爬蟲總是儘量模仿人的行為從而提高其自身的服務水平,如果一個網頁加載很慢,就會影響到網頁在SEO上的排名,這回簡潔影響你網頁的曝光量。
  • 谷歌也發布了Web前端機器學習庫,就叫deeplearn.js
    現在谷歌也決定在機器學習前端開發領域添一把柴,昨天發布了開源了自己的前端機器學習庫 deeplear.js(https://pair-code.github.io/deeplearnjs/ )。deeplearn.js 就是 PAIR 出力、藉助了谷歌大腦團隊的一點幫助開發出來的,它除了支持構建可微的數據流圖、帶有可以直接使用的數學函數外,還使用 WebGL 來加速訓練和推理過程,從而提供了高性能的機器學習模型開發平臺,可以在瀏覽器環境下訓練模型或者用訓練好的模型做推理。PAIR 希望對機器學習感興趣的人可以把它用在教育、理解模型、藝術工作等各個領域。
  • CNZZ的JS統計代碼被Chrome警告,如何解決?
    本文將帶您找出錯誤原因,解決Chrome對CNZZ統計代碼報錯的問題。 該警告的具體內容通過Chrome開發者工具查看器中(按F12查看console),可以查出網站是否存在這類警告(warnings)。
  • 製作了電子書《從零開始學算法》
    這樣,多年後,這篇文章的內容只能代表多年前你對這個知識的認知,而不能代表現在的。所以我計劃換一種形式來記錄這些系列知識。是的,你猜對了,那就是整理成小冊子、電子書。這樣後面可以隨時修復錯別字,調整邏輯不順的地方,甚至新增一些最新的思考。自此,這個知識體系就變的活了,可以持續不斷的刷新。
  • 【送你書】5期:電子DIY專場,EasyDS免費送9本好書
    文末有福利:點擊「閱讀原文」,註冊,即送書1本
  • 他的一款軟體90%的谷歌工程師在用,這樣的大神也被谷歌pass掉!
    國外有一名技術大牛,他叫Max Howell,他開發的Homebrew據谷歌的某一名面試官說有90%的工程師在用,他的作品既然能在谷歌大面積使用想必也不是等閒之輩吧,肯定是屬於大牛級別的人物了,然而這樣一個人去谷歌面試會是什麼請款呢?
  • 谷歌不喜歡 Node.js ? 聽聽開發團隊怎麼說
    作為一家企業,谷歌對 Node.js 並沒有什麼偏見。我寫過很多 React 代碼,它們都依賴 Node ,其中一些代碼甚至現在還在谷歌的 megarepo 中。當然,可能也會有一些個人或是團隊不太喜歡 Node.js 。谷歌內部的確有一些人不喜歡它,但是同時也有很多人能夠看到 Node.js 的價值,尤其是 Cloud 團隊。
  • 你拆分JS代碼的方法可能是錯的!
    在這裡我使用了「vendor」,用於處理從 node_modules 加載的模塊。通常,你只需將輸出文件的 name 定義為字符串,但我將 name 定義為一個函數(在解析每個文件時調用這個函數)。然後我基於模塊的路徑返回包的名稱。因此,對於每個包,我們都會得到一個文件,例如 npm.react-dom.899sadfhj4.js。
  • js讀取Excel報表文件
    原文:https://www.cnblogs.com/imwtr/p/6001480.html文末送大家100本前端電子書。
  • html中使用pdf.js在網頁中加載顯示pdf文件
    但是不同的瀏覽器加載顯示PDF的效果不同。這時就需要專門的JS插件來處理。Mozilla開源了一個插件pdf.js,無需任何本地支持就可以在所有主流的瀏覽器上顯示PDF文檔,使用起來十分的方便。唯一的要求就是瀏覽器必須支持HTML5。
  • JS | document.write
    如你所見,原來的文檔內容被覆蓋了、重寫了。所以,請在文檔加載中使用。document.write('<script src="http:\/\/xx.js"><\/script>')document.write('<h1>hi document.write<\/h1>')比較 document.writeln ,注意單詞拼寫
  • 谷歌工程師點讚中國程式設計師 實現Node.js啟動超4倍提速
    近日,一位谷歌工程師Yang,Guo在其個人推特上連發多條推文,多次稱讚阿里巴巴一位程式設計師的對開源技術Node.js的提速優化。從圖中可以看出,他發貼表示「阿里巴巴的工作人員實現了Node.js引擎啟動速度 的2倍速優化」。隨後他再次推文,表示這位程式設計師將優化效果做到了近4倍的提升,完全符合他的預期。
  • 【學霸助你展翅飛】研究生學術興趣營—大神幫你解鎖XRD和SAED
    我們幫你請到了大神。冷進「學霸助你展翅飛」收官專場中,冷進在冶金館301給我們帶來了主題為「X射線衍射與電子衍射的原理與應用」的報告會。冷進是15級碩士生,目前已發表SCI論文2篇,會議論文1篇申請專利3項,並被保送清華大學讀博士。
  • 開源軟體分享-基於JS的三維地圖,可加載3D模型/BIM模型
    加載天地圖底圖同時支持地形圖設置,我們可以從天地圖加載全國或者全球地形圖。這裡先科普一波,啥是天地圖。繪製河流支持多種模型的加載:CesiumJS 支持gLTF模型、3D Tiles模型、傳統BIM模型。
  • 如何提升Shopify和SHOPYY系統的訪問速度,並提高谷歌評分
    關於網速優化的文章有很多,但大多是隔靴搔癢,始終說不到點上,今天SHOPYY帶你了解它的運作原理和優化技巧。 首先我們找到一個國外大賣通過shopify系統建的網站,並通過谷歌一款測試網速的工具(developers.google.com)進行測試,如圖所示,評分竟然只有20分!(100分滿)。
  • 【K本書單】js大佬編撰的12本jQuery著作,文末免費電子書下載
    這包括(但不限於)客戶端地理信息系統、自用內容管理系統、日曆/日程安排系統和混合查詢/谷歌地圖系統。除了設計和構建前端web應用程式,他還擔任波特蘭大學的sqlserverdba。        業餘時間,羅南在足球場上跑上幾個小時,在高爾夫球場上蕩鞦韆。他喜歡和妻子凱特琳和他們的英國牧羊犬邦0一起散步,研究西北太平洋。
  • 如何利用TensorFlow.js部署簡單的AI版「你畫我猜」圖像識別應用
    作者使用谷歌 Colab 來訓練模型,並使用 TensorFlow.js 將它部署到瀏覽器上。部分圖像類別流程我們將使用 Keras 框架在谷歌 Colab 免費提供的 GPU 上訓練模型,然後使用 TensorFlow.js 直接在瀏覽器上運行模型。
  • 使用JS和NodeJS爬取Web內容
    如你所見,對於一個非常簡單的用例,這種方法用起來都很麻煩。所以我們應該使用 HTML 解析器之類的工具,後文具體討論。Cheerio 是一個高效輕便的庫,它允許你在服務端使用 JQuery 的豐富而強大的 API。如果你以前使用過 JQuery,那麼很容易就能上手 Cheerio。
  • 最佳 JS 入門書
    我們知道你是怎麼想的「這書一點都不嚴肅。」「那些圖片都是幹什麼用的?」「這樣也能學會JavaScript嗎?」老鳥🐦 程序猿🐒 們可能對於 Head First 風格的書不屑一顧 —— 太簡單、太小兒科、太幼稚,但是他們可能已經忘記了自己第一次看編程書學習寫程序時的窘境了。