整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          前端性能優(yōu)化(四)-網(wǎng)頁加載更快的N種方式

          站前端的用戶體驗(yàn),決定了用戶是否想要繼續(xù)使用網(wǎng)站以及網(wǎng)站的其他功能,網(wǎng)站的用戶體驗(yàn)佳,可留住更多的用戶。除此之外,前端優(yōu)化得好,還可以為企業(yè)節(jié)約成本。那么我們應(yīng)該如何對我們前端的頁面進(jìn)行性能優(yōu)化呢?

          前端性能優(yōu)化可以分為三個方面:接口訪問優(yōu)化、靜態(tài)資源優(yōu)化和頁面渲染速度優(yōu)化。

          一、接口訪問優(yōu)化

          1.1、減少http請求,合理設(shè)置 HTTP緩存

          http協(xié)議是無狀態(tài)的應(yīng)用層協(xié)議,每次發(fā)送http請求時,都需要建立連接、通信、斷開連接,在服務(wù)器端每個http都需要開啟獨(dú)立的線程去處理。所以盡量減少http請求,盡可能地提高訪問性能。

          減少http請求的方法:

          1. 合并 js、css、圖片等文件,合并成一個文件,瀏覽器就只需請求一次就可以了。圖片合并要適當(dāng),不能想著優(yōu)化呢,盲目地都合并成一張圖片。
          2. 借用瀏覽器緩存。恰當(dāng)?shù)木彺嬖O(shè)置可以大大減少http請求。不懂瀏覽器緩存的可參考《瀏覽器九大緩存方法》。
          3. 接口合并。前端交互,經(jīng)常需要請求多個并行或串行接口,此時可以通過接口合并方式,提高接口訪問速度。
          4. 能使用css的盡量不使用js,能使用js的盡量不用三方插件,避免三方插件大量的庫。

          1.2、減少cookie傳輸

          cookie 存在于 http 頭,在客戶端與服務(wù)器之間交換,盡可能地控制 cookie 的大小,cookie越小,響應(yīng)速度越快,減少 cookie 傳輸,響應(yīng)速度更快。

          1.3、使用CDN提供靜態(tài)文件

          使用 CDN 可以更快地在全球范圍內(nèi)獲取到你的靜態(tài)文件,加快網(wǎng)頁加載。

          1.4、啟用 GZIP 壓縮

          http 協(xié)議上 GZIP 編碼,是一種用來改進(jìn) web 應(yīng)用程序的。開啟 GZIP 后,服務(wù)器會把網(wǎng)頁內(nèi)容壓縮后傳輸,一般能壓縮到原大小40%,這樣網(wǎng)頁傳輸速度就更快了。GZIP 有兩大好處:一是減少存儲空間,二是通過網(wǎng)絡(luò)傳輸文件時,可以減少傳輸時間。

          1.5、分域存放資源

          HTTP 客戶端一般對同一個服務(wù)器的并發(fā)連接個數(shù)都是有限制的,通常最大并行連接為四了,剩下的會進(jìn)入等待隊列,等前邊的執(zhí)行完畢,等待的才會執(zhí)行。所以利用多域名主機(jī)存放資源,增加并行連接量,縮短資源加載時間。

          1.6、減少頁面重定向

          開啟 https 可以有效防范攻擊,保證用戶始終訪問到網(wǎng)站的加密連接,保護(hù)數(shù)據(jù)安全,同時省去 301/302 跳轉(zhuǎn)的時間,大大提升網(wǎng)站的安全系數(shù)和用戶體驗(yàn)。

          如果在網(wǎng)站設(shè)置當(dāng)用戶訪問域名的時候強(qiáng)制 https 進(jìn)行 301 或者 302 跳轉(zhuǎn),但是這個過程中,用到 HTTP 因此容易發(fā)生劫持,受到第三方的攻擊。所以盡可能使用https安全。

          1.7、避免使用iframe

          iframe 相當(dāng)于本頁面又嵌套了一個頁面,消耗性能,還要加載嵌套頁面的資源,所以更消耗時間。

          1.8、借用瀏覽器緩存

          ajax 請求到的數(shù)據(jù),可以緩存到瀏覽器,下次使用的時候無需再次獲取,直接取緩存數(shù)據(jù)就可以。這個會根據(jù)具體的項(xiàng)目來做,比如常用的角色類型就會緩存,獲取到的普通數(shù)據(jù)為了保證實(shí)時性,不能使用緩存。

          二、靜態(tài)資源優(yōu)化

          2.1、壓縮 html、css、js 等文件

          刪除不必要的空格、注釋和中行,減少文件大小,顯著減少用戶下載時間,加快網(wǎng)頁加載速度。可以直接使用壓縮工具,可以自動刪除所有不必要內(nèi)容。

          2.2、在 js 之前引用 css

          這是一個小細(xì)節(jié),js 執(zhí)行的時候會進(jìn)入阻塞,如果放入 js 之后加載,會等待 js 執(zhí)行完成之后才能加載 css,渲染頁面,此時就會出現(xiàn)布局錯亂。所以 css 文件需要非阻塞引入,以防DOM 花費(fèi)更多時間才能渲染。

          2.3、非阻塞 js

          js 會阻止 html 文檔的正常解析,當(dāng)解析器到達(dá) script 標(biāo)記時,它會停止解析并執(zhí)行腳本。所以我們經(jīng)常把 script 引入的 js,放到 html 中最底下。如果需要讓腳本位于頁面頂部,建議添加非阻塞屬性。經(jīng)常使用 defer 和 async 來異步加載js文件。

          <!--  使用defer  -->
          <script defer src="foo.js" ></script>
          <!--   使用async  -->
          <script async src="foo.js"></script>

          2.4、圖片壓縮

          最常見的就是 css 雪碧,就是將很多很多的小圖標(biāo)放在一張圖片上,就稱為雪碧圖。雪碧圖最大優(yōu)點(diǎn)就是可以減少http請求,除此也能壓縮圖片文件大小。使用的時候,通過設(shè)置 background-position ,移動圖片的位置。除此之外,網(wǎng)站用到的大圖,也需要在保證圖片質(zhì)量前提下優(yōu)化到最小。

          2.5、矢量圖替代位圖

          矢量圖(SVG)往往比圖像小很多,縮放的時候不失真,這些圖像還可以通過 css 進(jìn)行動畫和修改,比位圖方便控制。可以的話,盡量用矢量圖多點(diǎn)。

          2.6、js代碼相關(guān)優(yōu)化

          1. 盡量減少使用閉包,因?yàn)殚]包所在的上下文不會被釋放。
          2. js避免嵌套循環(huán)和死循環(huán),一旦遇到死循環(huán),瀏覽器會卡死。
          3. 在js封裝過程中,盡量做到低耦合高內(nèi)聚。減少頁面的冗余代碼。
          4. 盡量減少遞歸,避免死遞歸。
          5. 盡量使用window.requestAnimationFrame替代傳統(tǒng)的定時器。

          三、頁面渲染速度

          3.1、懶加載

          素材類的網(wǎng)站,頁面一屏展示很多圖片,而且圖片還不能失真,圖片加載太多,網(wǎng)頁加載慢得很,所以就引用懶加載,只加載可視區(qū)的圖片,避免加載可以能不需要或不必要的圖像。改善頁面的響應(yīng)時間。

          3.2、避免響應(yīng)式布局

          響應(yīng)式網(wǎng)站雖然能夠兼容所有終端設(shè)備,但是會出現(xiàn)隱藏部分無用內(nèi)容,浪費(fèi)帶寬,加載時間還長,頁面的渲染時間也長。想更多了解響應(yīng)式布局,請點(diǎn)擊《前端響應(yīng)式布局為什么是個坑?》。

          3.3、設(shè)置大小,避免重繪

          遇到 img 標(biāo)簽,會立馬發(fā)送一個 http 請求,下載圖片,頁面繼續(xù)向下渲染,等圖片加載成功了,發(fā)現(xiàn)圖片的寬高大小發(fā)生變化,影響后邊排版,所以頁面會重新再繪制一次這部分。所以盡可能設(shè)置圖片的大小。

          3.4、減少DOM元素

          解析 html 內(nèi)容,將標(biāo)簽轉(zhuǎn)化為DOM節(jié)點(diǎn),之后再解析其他文件,DOM元素越少,也就是標(biāo)簽越少,文件轉(zhuǎn)化得越快,加載速度也就快了。

          3.5、減少 Flash 的使用

          flash 文件比較大,加載起來耗時。除此,flash 插件還需要運(yùn)行才能運(yùn)行,最主要有些瀏覽器flash插件馬上要下線了,建議盡量不用 flash。

          3.6、文件順序

          css文件放在最頂部,優(yōu)先渲染。js放在最底部,避免阻塞。

          讓網(wǎng)頁如何加載更快,有好多的細(xì)節(jié),還是要好好提升自己的技能~~~~~~~~~


          點(diǎn)個關(guān)注!更多分享內(nèi)容。

          年來,隨著互聯(lián)網(wǎng)的高速發(fā)展,網(wǎng)頁中蘊(yùn)藏的海量數(shù)據(jù)成為各行業(yè)競爭的關(guān)鍵。而在獲取這些數(shù)據(jù)的過程中,一個重要的技術(shù)就是爬蟲。結(jié)合JavaScript渲染技術(shù),爬蟲不僅能夠更好地應(yīng)對動態(tài)網(wǎng)頁,還能為用戶帶來更加精準(zhǔn)、豐富的信息。下面小編將為您詳細(xì)介紹這一新興技術(shù)。

          一、爬蟲與JavaScript渲染的概念

          爬蟲是一種自動化程序,可以模擬人類對網(wǎng)頁進(jìn)行訪問,并從中提取所需信息。而JavaScript渲染則是指網(wǎng)頁加載時,瀏覽器會執(zhí)行其中的JavaScript代碼,生成并顯示頁面內(nèi)容。傳統(tǒng)的爬蟲技術(shù)只能抓取靜態(tài)網(wǎng)頁內(nèi)容,無法獲取通過JavaScript動態(tài)生成的信息。而結(jié)合爬蟲和JavaScript渲染技術(shù),則可以解決這一問題。

          二、爬蟲與JavaScript渲染技術(shù)的優(yōu)勢

          1.動態(tài)網(wǎng)頁抓取:傳統(tǒng)爬蟲只能抓取靜態(tài)頁面,無法獲取動態(tài)生成的內(nèi)容。而結(jié)合JavaScript渲染技術(shù),爬蟲可以模擬瀏覽器行為,獲取完整的網(wǎng)頁數(shù)據(jù)。

          2.數(shù)據(jù)準(zhǔn)確性:JavaScript渲染技術(shù)可以實(shí)時加載和更新數(shù)據(jù),爬蟲可以及時抓取最新的信息,保證數(shù)據(jù)的準(zhǔn)確性。

          3.用戶體驗(yàn)優(yōu)化:通過爬蟲和JavaScript渲染技術(shù),網(wǎng)頁內(nèi)容可以更加豐富、多樣化,提升用戶體驗(yàn)。

          4.數(shù)據(jù)分析與挖掘:爬蟲獲取到的數(shù)據(jù)可以用于各種分析和挖掘工作,為企業(yè)決策提供參考。

          三、爬蟲與JavaScript渲染的應(yīng)用案例

          1.電商行業(yè):通過爬蟲和JavaScript渲染技術(shù),企業(yè)可以實(shí)時抓取競爭對手的商品信息、價格變動等數(shù)據(jù),從而制定更具競爭力的銷售策略。

          2.新聞媒體:通過爬蟲和JavaScript渲染技術(shù),新聞媒體可以快速抓取各類資訊,并實(shí)時更新到自己的平臺上,提供給用戶最新、全面的新聞內(nèi)容。

          3.社交媒體監(jiān)測:通過爬蟲和JavaScript渲染技術(shù),企業(yè)可以實(shí)時監(jiān)測社交媒體上與自身品牌相關(guān)的討論和用戶反饋,及時做出回應(yīng)和調(diào)整。

          4.數(shù)據(jù)分析與預(yù)測:通過爬蟲和JavaScript渲染技術(shù),可以獲取大量的數(shù)據(jù),進(jìn)行數(shù)據(jù)分析和挖掘,為企業(yè)決策提供可靠的依據(jù)。

          四、注意事項(xiàng)與發(fā)展趨勢

          1.合法合規(guī):在使用爬蟲技術(shù)時,需要遵守相關(guān)法律法規(guī),尊重網(wǎng)站的使用規(guī)則,避免侵犯他人的權(quán)益。

          2.技術(shù)更新迭代:隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,爬蟲和JavaScript渲染技術(shù)也在不斷更新迭代中。開發(fā)者需要及時了解新技術(shù),并靈活應(yīng)用于實(shí)際項(xiàng)目中。

          總結(jié):

          爬蟲與JavaScript渲染技術(shù)的結(jié)合為我們帶來了更多可能性。無論是從數(shù)據(jù)獲取、用戶體驗(yàn)還是商業(yè)決策等方面,這一技術(shù)都具有重要意義。然而,在應(yīng)用過程中,我們也要遵守相關(guān)規(guī)定,保護(hù)他人的權(quán)益。相信隨著技術(shù)的不斷發(fā)展,爬蟲與JavaScript渲染將會在更多領(lǐng)域展現(xiàn)出其強(qiáng)大的潛力和價值。

          面性能和用戶體驗(yàn)的各個指標(biāo)怎么來優(yōu)化呢?open signal官方提供了2018年2月份統(tǒng)計的全世界4G網(wǎng)絡(luò)覆蓋率和通信速率的統(tǒng)計分布圖如下,在目前移動互聯(lián)網(wǎng)的浪潮下,我們要利用好用戶終端設(shè)備的每個字節(jié)的流量。

          當(dāng)然頁面性能和體驗(yàn)優(yōu)化并不是一蹴而就的,需要不斷的研究、跟蹤,發(fā)現(xiàn)問題,解決問題。但是我們可以在一開始編寫業(yè)務(wù)代碼的時候就做的更好,做到極致。所以,關(guān)于優(yōu)化實(shí)戰(zhàn)我們主要分為兩部分:加載渲染鏈路優(yōu)化 和 編程代碼優(yōu)化。

          加載渲染鏈路優(yōu)化

          從訪問url到頁面呈現(xiàn),整個鏈路可以做優(yōu)化的思路。

          幸運(yùn)的是,W3C推薦的Navigation Timing標(biāo)準(zhǔn)中所定義的核心的頁面性能數(shù)據(jù),它包含了從上個頁面銷毀到跳轉(zhuǎn)到當(dāng)前頁面加載完成每個階段所消耗的時間。在canIuse上查到的兼容性也很好:

          利用這個接口可以很方便的幫助我們排查鏈路問題。在Navigation Timing標(biāo)準(zhǔn)中介紹到這個API主要包含兩個接口:PerformanceTiming和PerformanceNavigation,這兩個接口由瀏覽器進(jìn)行實(shí)現(xiàn)和維護(hù),當(dāng)瀏覽器創(chuàng)建頁面的時候就會把接口定義的相關(guān)數(shù)據(jù)掛載到window.performance.timing和window.performance.navigation這兩個屬性上。我們可以打開一個網(wǎng)頁看一下:

          我們把這兩個圖對比一下,就可以很容易的排查出頁面的加載鏈路問題。

          靜態(tài)資源鏈路

          打開頁面的第一步是請求頁面的html,這里面涉及TTFB這個綜合指標(biāo)。同時如果有必要我們也可以統(tǒng)計DNS時間和TCP時間。

          DNS時間:主要是根據(jù)請求域名查詢到對應(yīng)主機(jī)IP的時間。這個和DNS服務(wù)器有關(guān)系,也可能和本地緩存有關(guān),如果這個很慢,可以找服務(wù)商排查下問題。

          TCP時間:tcp是承接http協(xié)議的下層協(xié)議。主要是路由到主機(jī)ip,并建立tcp鏈接的時間。這個時間反應(yīng)了服務(wù)器到用戶客戶端之間鏈路是否通暢,網(wǎng)絡(luò)是否通暢。

          請求完HTML之后,就開始解析html代碼,按照從上至下、自然順序解析,解析內(nèi)聯(lián)CSS代碼或者加載外鏈CSS腳本,解析內(nèi)聯(lián)Javascript腳本,或者加載外鏈Javascript腳本。由于瀏覽器是單線程的,這些CSS和Javascript腳本很可能就會造成頁面卡頓。參考 瀏覽器線程理解與microtask與macrotask。

          加載

          CDN是內(nèi)容分發(fā)網(wǎng)絡(luò),主要用于緩存靜態(tài)資源。CDN服務(wù)商一般會在全國各地部署服務(wù),而且?guī)捄艽螅@樣訪問CDN的資源時就可以有較短的路由路徑,而且?guī)捯脖容^大,訪問比較快。

          1. 建議最好把html, CSS、JS、font、img這些資源放在CDN上,沒有CDN也可以放在OSS存儲服務(wù)上,總之比自己的服務(wù)器硬盤快多了,至少服務(wù)商會在不同區(qū)域做分布式部署
          2. 如果沒有錢買CDN服務(wù),那么就盡可能少的加載外聯(lián)CSS和JS代碼,注意html頭部可以增加dns-prefetch,減少DNS解析時間
          3. 不是在首屏展示的資源,不要立即加載,可以在頁面onload之后加載,或者首屏渲染完成再加載
          4. 壓縮CSS、JS、font、img,盡量減少體積,服務(wù)端開啟gzip
          5. 考慮資源combo請求,減少http請求量,瀏覽器一般都有并發(fā)限制, 比如chrome一次6個并發(fā)http請求,不同瀏覽器內(nèi)核可能不一樣。
          6. <script>加載腳本會阻塞瀏覽器主線程,考慮異步化,參考 script標(biāo)簽的defer與async
          7. 利用好緩存,利用好http響應(yīng)頭緩存字段,開啟靜態(tài)資源緩存,減少資源下載,建議開啟service worker緩存,這個是作為APP Cache的替代方案,參考MDN;
          8. 對于單純的獲取數(shù)據(jù)做展示,盡量采用JSONP請求數(shù)據(jù),而不是AJAX,提升數(shù)據(jù)請求性能。參考jsonp而不是AJAX?
          9. 開啟HTTP/2 ,HTTP2支持鏈接復(fù)用,可以很高效下載多個小文件。HTTP/2 的目的是通過支持完整的請求與響應(yīng)復(fù)用來減少延遲,通過有效壓縮 HTTP 標(biāo)頭字段將協(xié)議開銷降至最低,同時增加對請求優(yōu)先級和服務(wù)器推送的支持。

          解析渲染

          加載完JS和CSS之后,瀏覽器開始解析執(zhí)行。Chrome的渲染流程是這樣的:(可以參考 高性能CSS動畫)

          為了讓瀏覽器更快的解析渲染,我們需要考慮這幾點(diǎn):

          1. CSS嵌套層級不要太深,不超過3級,避免在最內(nèi)層使用通配選擇器。參考關(guān)于 CSS 選擇器性能
          2. JS腳本不要太復(fù)雜,考慮輕量化架構(gòu),降低JS復(fù)雜性,減少解析時間,盡量不要引用復(fù)雜的第三方腳本。
          3. 按需加載模塊,按需打包,首頁僅僅加載和執(zhí)行和首屏相關(guān)的腳本。其他腳本延遲加載執(zhí)行。
          4. 考慮依賴的第三方模塊是不是必須,需不需要精簡。
          5. 打包優(yōu)化,code split 和 tree shaken。常用webpack和rollup的優(yōu)化。
          6. 用戶交互相關(guān)事件綁定(比如頁面scroll,用戶左右滑動等),添加參數(shù){passive:true},減少瀏覽器事件等待。因?yàn)檫@些事件屬于可阻止事件,瀏覽器不知道用戶會不會阻止,所以需要等待js執(zhí)行,然后再做響應(yīng)。添加passive參數(shù),就告訴瀏覽器不用等待了。
          7. IOS8以后的ios支持wkwebview,但是很多app之前用的還是uiwebview,建議轉(zhuǎn)換成wkwebview,獲得性能的提升(UIwebview在執(zhí)行JS時會阻塞UI渲染進(jìn)程,WKwebview不會)。

          介紹一下code split的方案: react-loadable

          // 未處理
          import OtherComponent from './OtherComponent';
          const MyComponent = () => (
           <OtherComponent/>
          );
          // 使用react-loadable按需加載
          import Loadable from 'react-loadable';
          const LoadableOtherComponent = Loadable({
           loader: () => import('./OtherComponent'),
           loading: () => <div>Loading...</div>,
          });
          const MyComponent = () => (
           <LoadableOtherComponent/>
          );
          

          這個也可以在打包工具統(tǒng)一配置,不用每個模塊都自己寫。

          只有瀏覽器盡快渲染出來,用戶才能盡快的可以交互。

          數(shù)據(jù)埋點(diǎn)

          上面我們梳理了加載到解析渲染過程應(yīng)該做的事情,那么如果你這些都做好了,發(fā)現(xiàn)網(wǎng)頁表現(xiàn)依然不盡人意,那么你就要考慮做一下數(shù)據(jù)埋點(diǎn)。其實(shí)數(shù)據(jù)埋點(diǎn)在企業(yè)項(xiàng)目中也是必不可少的,和性能體驗(yàn)優(yōu)化構(gòu)成閉環(huán)。通過數(shù)據(jù)來發(fā)現(xiàn)頁面性能和體驗(yàn)的問題,更有針對的進(jìn)行解決。

          事實(shí)上數(shù)據(jù)埋點(diǎn)分為三類:

          1. 業(yè)務(wù)埋點(diǎn),統(tǒng)計諸如pv、uv、點(diǎn)擊率、流失率、轉(zhuǎn)化率等
          2. 大數(shù)據(jù)埋點(diǎn),統(tǒng)計與用戶行為相關(guān)信息,比如那個用戶點(diǎn)擊了那個商品,上報用戶id和商品id,方便后臺分析用戶和商品的關(guān)系,可以用做大數(shù)據(jù)分析,推薦算法來為用戶推薦商品。

          工程埋點(diǎn),統(tǒng)計工程上的數(shù)據(jù)信息,比如頁面秒開率,dns時間等,也就是我們上節(jié)課總結(jié)的性能和體驗(yàn)數(shù)據(jù)指標(biāo)。

          資源緩存

          這一節(jié)我們單獨(dú)介紹緩存,是的,利用好緩存可以解決很多問題,包括頁面加載和渲染的問題都能得到很好的優(yōu)化。

          常見的h5緩存方案有很多種,

          通常,與頁面加載性能相關(guān)的,有下面幾種緩存,

          (1)MemoryCache

          MemoryCache,資源存放在內(nèi)存中,一般資源響應(yīng)回來就會放進(jìn)去,頁面關(guān)閉就會釋放。內(nèi)存存取性能可達(dá)磁盤緩存性能的100倍,但這還不是MemoryCache的最大優(yōu)勢,MemoryCache最大的優(yōu)勢是離排版渲染引擎非常近,可以直接被讀取,甚至無需經(jīng)過線程轉(zhuǎn)換。在真實(shí)的頁面訪問過程中,獲取資源的時間,磁盤IO僅僅是其中的一部分,更多的時間往往消耗在各種線程拋轉(zhuǎn)。

          (2)ClientCache

          ClientCache,客戶端緩存,比如,手淘里的ZCache(離線壓縮包緩存),本質(zhì)上屬于磁盤緩存。這類Cache的優(yōu)點(diǎn)是能以相對可控的方式讓資源提前緩存在磁盤,但它也有一系列的成本。比如,它需要一套服務(wù)器與客戶端協(xié)同的下發(fā)更新邏輯,服務(wù)器端需要管理下發(fā),客戶端需要提前解壓縮。我們可能覺得提前解壓并不是什么弱點(diǎn),但如果有一千個離線包,這個問題就比較嚴(yán)重了,如果不提前解壓,就無法保證首次訪問性能,如果提前解壓會讓IO非常繁忙,可能會造成客戶端打開時嚴(yán)重卡頓。

          (3)HttpCache

          HttpCache,是歷史比較悠久的緩存,它利用標(biāo)準(zhǔn)的 Cache-Control 與服務(wù)器端進(jìn)行協(xié)商,根據(jù)標(biāo)準(zhǔn)的規(guī)則去緩存或更新資源。它應(yīng)用非常廣泛,是非常有效果的一種磁盤緩存。它的缺點(diǎn)是完全由瀏覽器按標(biāo)準(zhǔn)規(guī)則控制,其它端的控制力度非常弱。比如,某些被HttpCache緩存的靜態(tài)資源出問題了,通常只能是改頁面,不再使用出問題的資源,而無法主動清除出問題的資源。參考http請求緩存頭,HTTP協(xié)商緩存VS強(qiáng)緩存原理

          (4)NetCache

          網(wǎng)絡(luò)相關(guān)的Cache,一般是指DNS解析結(jié)果的緩存,或預(yù)連接的緩存。DNS預(yù)解析和預(yù)連接是非常重要的,創(chuàng)建一個Https連接的成本非常大,通常需要600ms以上,也就是說,頁面如果有關(guān)鍵資源需要全新建連接,秒開基本是不可能了。

          (5)CDN

          CDN一般是通過負(fù)載均衡設(shè)備根據(jù)用戶IP地址,以及用戶請求的URL,選擇一臺離用戶比較近,緩存了用戶所需的資源,有較好的服務(wù)能力的服務(wù)器,讓用戶從該服務(wù)器去請求內(nèi)容。它能讓各個用戶的緩存共享,縮短用戶獲取資源的路徑,來提升整體的性能。

          當(dāng)然,還有其它非常多類型的Cache,比如,

          JS相關(guān),V8 Bytecode Cache,字節(jié)碼緩存,能極大的減少JS解析耗時,甚至可以提升3-6倍的性能。參考:前端優(yōu)化系列 – JS解析性能分析

          渲染相關(guān),圖片解碼數(shù)據(jù)緩存,是一塊非常大的內(nèi)存緩存,約100M,能保證頁面滾動過程可以實(shí)時獲取到圖片解碼數(shù)據(jù),讓滾動非常流暢。

          頁面相關(guān),頁面緩存,Safari的PageCache,F(xiàn)irefox的Back-Forward Cache,UC瀏覽器的WebViewCache,都是一樣性質(zhì)的緩存,將整個執(zhí)行過的頁面保存在內(nèi)存。標(biāo)準(zhǔn)的頁面緩存,進(jìn)入的條件非常苛刻,大部分情況都無法進(jìn)入,而且在前進(jìn)后退的場景才允許使用。

          緩存優(yōu)化實(shí)例

          前面介紹了很多理論層面的內(nèi)容,我們接下來介紹一些實(shí)踐優(yōu)化案例。

          (1)預(yù)置資源進(jìn)MemoryCache

          在頁面的onPageFinished的回調(diào)里面去檢查是否有資源可以預(yù)置,如果有,就通過相關(guān)接口把資源設(shè)置進(jìn)內(nèi)核的MemoryCache。我們并不知道用戶即將會訪問什么頁面,如果把大量的資源都預(yù)置進(jìn)內(nèi)存,而用戶卻沒有使用,那就會造成浪費(fèi)。另外,資源在內(nèi)核內(nèi)存,僅僅是加快了資源的加載速度,頁面的首屏包含非常多非常復(fù)雜的流程,某個流程的加速并不一定能帶來整體性能的提升,比如,非關(guān)鍵的JS放在內(nèi)存,可能就會先于一些關(guān)鍵JS被提前執(zhí)行,反而讓首屏更慢。所以,選擇放那些資源進(jìn)內(nèi)存也是非常有講究的,能預(yù)置的資源一般是 非常關(guān)鍵的更新頻率較低的少量公共基礎(chǔ)資源。

          對于一般公司來說,沒有能力自己定制webview渲染的內(nèi)核,可以看下系統(tǒng)默認(rèn)webview內(nèi)核有沒有這樣的接口來實(shí)現(xiàn)操作MemoryCache預(yù)置數(shù)據(jù)的能力。

          (2)預(yù)加載資源進(jìn)HttpCache

          預(yù)置資源進(jìn)內(nèi)存,對加載性能的提升是最明顯的,但成本也是最大的,會占用用戶手機(jī)寶貴的內(nèi)存資源。另外一種預(yù)置資源的思路是,提前通過內(nèi)核去預(yù)加載一些資源,資源加載回來之后就直接保存在標(biāo)準(zhǔn)的HttpCache。資源在HttpCache和在客戶端緩存(比如,手淘ZCache)的性能差別不大。但如果資源不能放進(jìn)ZCache,通過這種方式提前放到HttpCache,也是一種優(yōu)化思路。

          (3)使用WebViewCache極速切換頁面

          H5頁面的加載流程是非常重的一套流程,即使同一個頁面多次重復(fù)訪問,也需要走比較完整的流程,耗時極長,這與用戶的期望是不符的,通常用戶期望訪問過的頁面就能快速展現(xiàn)出來。在一些特定的場景,H5也是可以做到極速展現(xiàn)的,比如,前進(jìn)后退。其它的場景,比如頁內(nèi)幾個TAB切換,是否也可以用上這類緩存呢?也是可以的。原理上也是比較簡單的,在頁面首次訪問時,會將排版渲染好的頁面放進(jìn)WebViewCache里,WebViewCache是存儲完整頁面的一塊內(nèi)存。

          用戶再次訪問該頁面時,會將WebViewCache內(nèi)存中的完整頁面讀取出來,直接繪制展現(xiàn),而無需再進(jìn)行加載解析排版渲染等流程,從而達(dá)到極速打開的效果。

          除了內(nèi)核提供WebViewCache基礎(chǔ)技術(shù)之外,前端也需要與內(nèi)核進(jìn)行一定的交互,比如,通過JSAPI查詢當(dāng)前頁面是否在WebViewCache,如果在則返回它在WebViewCache列表的位置,然后前端就可以使用JSAPI去跳轉(zhuǎn)到相應(yīng)位置的頁面,內(nèi)核就把頁面從內(nèi)存讀取和展現(xiàn)出來。使用此類技術(shù),頁面一般能在500ms左右完全展現(xiàn)出來,具有非常好的用戶體驗(yàn)。

          當(dāng)然這個也是需要瀏覽器內(nèi)核提供這種能力,如果公司有自己的內(nèi)核開發(fā)團(tuán)隊,可以做到定制。

          (4)前端使用LocalStorage緩存HTML文檔

          當(dāng)前前端渲染非常流行,頁面大部分的邏輯都會由前端JS去執(zhí)行,JS執(zhí)行完才會生成完整的HTML文檔,而JS執(zhí)行的成本是非常大的,JS執(zhí)行時間可能占據(jù)首屏?xí)r間的50%,有些甚至能達(dá)到80%。那么,我們有沒有可能將JS執(zhí)行生成的完整HTML文檔緩存起來呢,下次訪問時直接使用已緩存的頁面,而無需重復(fù)執(zhí)行JS?這也是可以的原理上也不復(fù)雜,首次訪問頁面時,JS執(zhí)行完之后會生成完整的HTML文檔,我們將HTML文檔緩存到LocalStorage里面。

          在后續(xù)的訪問中,我們優(yōu)先從LocalStorage里面讀取HTML文檔,解析排版渲染頁面,而無需JS執(zhí)行去生成頁面,讓頁面展現(xiàn)速度得到極大的提升。

          這種方案的關(guān)鍵在于前端能夠?qū)崿F(xiàn)一套DOM-Diff更新的機(jī)制,在從LocalStorage讀取HTML頁面的同時,前端還會發(fā)起請求去更新HTML文檔,在新的HTML文檔回來之后,會和舊的文檔進(jìn)行Diff,針對Diff來進(jìn)行局部更新,這樣能保證頁面得到及時的更新。

          (5) service worker

          參考使用 Service Workers提升體驗(yàn),這里附帶介紹下這個方案,目前service worker 只有在android的webview中可用,ios還不支持。我們通過先注冊一個serviceworker服務(wù),指定哪些資源和數(shù)據(jù)需要存儲,然后下次請求頁面會自動激活這個service worker,頁面請求時會先從service worker中返回緩存的數(shù)據(jù)。當(dāng)然service worker中需要自己處理版本和維護(hù)數(shù)據(jù)更新。


          主站蜘蛛池模板: 日韩一区二区在线播放| 风间由美性色一区二区三区| 欧美日韩精品一区二区在线观看| 亚洲一区二区三区免费视频| 乱精品一区字幕二区| 亚无码乱人伦一区二区| 国产一区内射最近更新| 中文人妻av高清一区二区| 亚洲电影一区二区| 免费看AV毛片一区二区三区| 精品国产香蕉伊思人在线在线亚洲一区二区 | 制服丝袜一区二区三区| 中文字幕日韩一区二区三区不卡| 精品少妇人妻AV一区二区| 亚洲国产一区视频| 精品国产一区AV天美传媒| 福利一区国产原创多挂探花| 性无码一区二区三区在线观看| 国精产品999一区二区三区有限| 国产成人精品一区二区三区| 熟妇人妻AV无码一区二区三区| 国产福利在线观看一区二区| 精品国产免费一区二区三区香蕉| 亚洲性色精品一区二区在线| 久久精品无码一区二区三区日韩| 2021国产精品一区二区在线| 视频一区二区三区人妻系列| 亚洲电影一区二区| 久久99国产一区二区三区| 夜精品a一区二区三区| 久久精品国产一区二区三| 国产中文字幕一区| 亚洲狠狠狠一区二区三区| 亚洲AV无码一区二区三区鸳鸯影院| 成人精品一区二区三区不卡免费看| 夜夜高潮夜夜爽夜夜爱爱一区| 内射白浆一区二区在线观看| 亚洲国产美女福利直播秀一区二区| 精品国产日韩亚洲一区| 国产肥熟女视频一区二区三区| 麻豆高清免费国产一区|