成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

H5 緩存機制淺析 - 移動端 Web 加載性能優(yōu)化

alin / 1956人閱讀

摘要:根據(jù)標(biāo)準(zhǔn),到目前為止,一共有種緩存機制,有些是之前已有,有些是才新加入的。首次請求緩存有效期內(nèi)請求緩存過期后請求一般瀏覽器會將緩存記錄及緩存文件存在本地文件夾中。

騰訊 Bugly 特約作者:賀輝超

1. H5 緩存機制介紹

H5,即 HTML5,是新一代的 HTML 標(biāo)準(zhǔn),加入很多新的特性。離線存儲(也可稱為緩存機制)是其中一個非常重要的特性。H5 引入的離線存儲,這意味著 web 應(yīng)用可進行緩存,并可在沒有因特網(wǎng)連接時進行訪問。

H5 應(yīng)用程序緩存為應(yīng)用帶來三個優(yōu)勢:

離線瀏覽 用戶可在應(yīng)用離線時使用它們

速度 已緩存資源加載得更快

減少服務(wù)器負(fù)載 瀏覽器將只從服務(wù)器下載更新過或更改過的資源。

根據(jù)標(biāo)準(zhǔn),到目前為止,H5 一共有6種緩存機制,有些是之前已有,有些是 H5 才新加入的。

瀏覽器緩存機制

Dom Storgage(Web Storage)存儲機制

Web SQL Database 存儲機制

Application Cache(AppCache)機制

Indexed Database (IndexedDB)

File System API

下面我們首先分析各種緩存機制的原理、用法及特點;然后針對 Anroid 移動端 Web 性能加載優(yōu)化的需求,看如果利用適當(dāng)緩存機制來提高 Web 的加載性能。

2. H5 緩存機制原理分析 2.1 瀏覽器緩存機制

瀏覽器緩存機制是指通過 HTTP 協(xié)議頭里的 Cache-Control(或 Expires)和 Last-Modified(或 Etag)等字段來控制文件緩存的機制。這應(yīng)該是 WEB 中最早的緩存機制了,是在 HTTP 協(xié)議中實現(xiàn)的,有點不同于 Dom Storage、AppCache 等緩存機制,但本質(zhì)上是一樣的。可以理解為,一個是協(xié)議層實現(xiàn)的,一個是應(yīng)用層實現(xiàn)的。

Cache-Control 用于控制文件在本地緩存有效時長。最常見的,比如服務(wù)器回包:Cache-Control:max-age=600 表示文件在本地應(yīng)該緩存,且有效時長是600秒(從發(fā)出請求算起)。在接下來600秒內(nèi),如果有請求這個資源,瀏覽器不會發(fā)出 HTTP 請求,而是直接使用本地緩存的文件。

Last-Modified 是標(biāo)識文件在服務(wù)器上的最新更新時間。下次請求時,如果文件緩存過期,瀏覽器通過 If-Modified-Since 字段帶上這個時間,發(fā)送給服務(wù)器,由服務(wù)器比較時間戳來判斷文件是否有修改。如果沒有修改,服務(wù)器返回304告訴瀏覽器繼續(xù)使用緩存;如果有修改,則返回200,同時返回最新的文件。

Cache-Control 通常與 Last-Modified 一起使用。一個用于控制緩存有效時間,一個在緩存失效后,向服務(wù)查詢是否有更新。

Cache-Control 還有一個同功能的字段:Expires。Expires 的值一個絕對的時間點,如:Expires: Thu, 10 Nov 2015 08:45:11 GMT,表示在這個時間點之前,緩存都是有效的。

Expires 是 HTTP1.0 標(biāo)準(zhǔn)中的字段,Cache-Control 是 HTTP1.1 標(biāo)準(zhǔn)中新加的字段,功能一樣,都是控制緩存的有效時間。當(dāng)這兩個字段同時出現(xiàn)時,Cache-Control 是高優(yōu)化級的。

Etag 也是和 Last-Modified 一樣,對文件進行標(biāo)識的字段。不同的是,Etag 的取值是一個對文件進行標(biāo)識的特征字串。在向服務(wù)器查詢文件是否有更新時,瀏覽器通過 If-None-Match 字段把特征字串發(fā)送給服務(wù)器,由服務(wù)器和文件最新特征字串進行匹配,來判斷文件是否有更新。沒有更新回包304,有更新回包200。Etag 和 Last-Modified 可根據(jù)需求使用一個或兩個同時使用。兩個同時使用時,只要滿足基中一個條件,就認(rèn)為文件沒有更新。

另外有兩種特殊的情況:

手動刷新頁面(F5),瀏覽器會直接認(rèn)為緩存已經(jīng)過期(可能緩存還沒有過期),在請求中加上字段:Cache-Control:max-age=0,發(fā)包向服務(wù)器查詢是否有文件是否有更新。

強制刷新頁面(Ctrl+F5),瀏覽器會直接忽略本地的緩存(有緩存也會認(rèn)為本地沒有緩存),在請求中加上字段:Cache-Control:no-cache(或 Pragma:no-cache),發(fā)包向服務(wù)重新拉取文件。

下面是通過 Google Chrome 瀏覽器(用其他瀏覽器+抓包工具也可以)自帶的開發(fā)者工具,對一個資源文件不同情況請求與回包的截圖。

首次請求:200

緩存有效期內(nèi)請求:200(from cache)

緩存過期后請求:304(Not Modified)

一般瀏覽器會將緩存記錄及緩存文件存在本地 Cache 文件夾中。Android 下 App 如果使用 Webview,緩存的文件記錄及文件內(nèi)容會存在當(dāng)前 app 的 data 目錄中。

分析:Cache-Control 和 Last-Modified 一般用在 Web 的靜態(tài)資源文件上,如 JS、CSS 和一些圖像文件。通過設(shè)置資源文件緩存屬性,對提高資源文件加載速度,節(jié)省流量很有意義,特別是移動網(wǎng)絡(luò)環(huán)境。但問題是:緩存有效時長該如何設(shè)置?如果設(shè)置太短,就起不到緩存的使用;如果設(shè)置的太長,在資源文件有更新時,瀏覽器如果有緩存,則不能及時取到最新的文件。

Last-Modified 需要向服務(wù)器發(fā)起查詢請求,才能知道資源文件有沒有更新。雖然服務(wù)器可能返回304告訴沒有更新,但也還有一個請求的過程。對于移動網(wǎng)絡(luò),這個請求可能是比較耗時的。有一種說法叫“消滅304”,指的就是優(yōu)化掉304的請求。

抓包發(fā)現(xiàn),帶 if-Modified-Since 字段的請求,如果服務(wù)器回包304,回包帶有 Cache-Control:max-age 或 Expires 字段,文件的緩存有效時間會更新,就是文件的緩存會重新有效。304回包后如果再請求,則又直接使用緩存文件了,不再向服務(wù)器查詢文件是否更新了,除非新的緩存時間再次過期。

另外,Cache-Control 與 Last-Modified 是瀏覽器內(nèi)核的機制,一般都是標(biāo)準(zhǔn)的實現(xiàn),不能更改或設(shè)置。以 QQ 瀏覽器的 X5為例,Cache-Control 與 Last-Modified 緩存不能禁用。緩存容量是12MB,不分HOST,過期的緩存會最先被清除。如果都沒過期,應(yīng)該優(yōu)先清最早的緩存或最快到期的或文件大小最大的;過期緩存也有可能還是有效的,清除緩存會導(dǎo)致資源文件的重新拉取。

還有,瀏覽器,如 X5,在使用緩存文件時,是沒有對緩存文件內(nèi)容進行校驗的,這樣緩存文件內(nèi)容被修改的可能。

分析發(fā)現(xiàn),瀏覽器的緩存機制還不是非常完美的緩存機制。完美的緩存機制應(yīng)該是這樣的:

緩存文件沒更新,盡可能使用緩存,不用和服務(wù)器交互;

緩存文件有更新時,第一時間能使用到新的文件;

緩存的文件要保持完整性,不使用被修改過的緩存文件;

緩存的容量大小要能設(shè)置或控制,緩存文件不能因為存儲空間限制或過期被清除。
以X5為例,第1、2條不能同時滿足,第3、4條都不能滿足。

在實際應(yīng)用中,為了解決 Cache-Control 緩存時長不好設(shè)置的問題,以及為了”消滅304“,Web前端采用的方式是:

在要緩存的資源文件名中加上版本號或文件 MD5值字串,如 common.d5d02a02.js,common.v1.js,同時設(shè)置 Cache-Control:max-age=31536000,也就是一年。在一年時間內(nèi),資源文件如果本地有緩存,就會使用緩存;也就不會有304的回包。

如果資源文件有修改,則更新文件內(nèi)容,同時修改資源文件名,如 common.v2.js,html頁面也會引用新的資源文件名。

通過這種方式,實現(xiàn)了:緩存文件沒有更新,則使用緩存;緩存文件有更新,則第一時間使用最新文件的目的。即上面說的第1、2條。第3、4條由于瀏覽器內(nèi)部機制,目前還無法滿足。

2.2 Dom Storage 存儲機制

DOM 存儲是一套在 Web Applications 1.0 規(guī)范中首次引入的與存儲相關(guān)的特性的總稱,現(xiàn)在已經(jīng)分離出來,多帶帶發(fā)展成為獨立的 W3C Web 存儲規(guī)范。 DOM 存儲被設(shè)計為用來提供一個更大存儲量、更安全、更便捷的存儲方法,從而可以代替掉將一些不需要讓服務(wù)器知道的信息存儲到 cookies 里的這種傳統(tǒng)方法。

上面一段是對 Dom Storage 存儲機制的官方表述??雌饋?,Dom Storage 機制類似 Cookies,但有一些優(yōu)勢。

Dom Storage 是通過存儲字符串的 Key/Value 對來提供的,并提供 5MB (不同瀏覽器可能不同,分 HOST)的存儲空間(Cookies 才 4KB)。另外 Dom Storage 存儲的數(shù)據(jù)在本地,不像 Cookies,每次請求一次頁面,Cookies 都會發(fā)送給服務(wù)器。

DOM Storage 分為 sessionStorage 和 localStorage。localStorage 對象和 sessionStorage 對象使用方法基本相同,它們的區(qū)別在于作用的范圍不同。sessionStorage 用來存儲與頁面相關(guān)的數(shù)據(jù),它在頁面關(guān)閉后無法使用。而 localStorage 則持久存在,在頁面關(guān)閉后也可以使用。

Dom Storage 提供了以下的存儲接口:

interface Storage { 
readonly attribute unsigned long length; 
[IndexGetter] DOMString key(in unsigned long index); 
[NameGetter] DOMString getItem(in DOMString key); 
[NameSetter] void setItem(in DOMString key, in DOMString data); 
[NameDeleter] void removeItem(in DOMString key); 
void clear();
};

sessionStorage 是個全局對象,它維護著在頁面會話(page session)期間有效的存儲空間。只要瀏覽器開著,頁面會話周期就會一直持續(xù)。當(dāng)頁面重新載入(reload)或者被恢復(fù)(restores)時,頁面會話也是一直存在的。每在新標(biāo)簽或者新窗口中打開一個新頁面,都會初始化一個新的會話。



當(dāng)瀏覽器被意外刷新的時候,一些臨時數(shù)據(jù)應(yīng)當(dāng)被保存和恢復(fù)。sessionStorage 對象在處理這種情況的時候是最有用的。比如恢復(fù)我們在表單中已經(jīng)填寫的數(shù)據(jù)。

把上面的代碼復(fù)制到 session_storage.html(也可以從附件中直接下載)頁面中,用 Google Chrome 瀏覽器的不同 PAGE 或 WINDOW 打開,在輸入框中分別輸入不同的文字,再點擊“Save”,然后分別刷新。每個 PAGE 或 WINDOW 顯示都是當(dāng)前PAGE輸入的內(nèi)容,互不影響。關(guān)閉 PAGE,再重新打開,上一次輸入保存的內(nèi)容已經(jīng)沒有了。

Local Storage 的接口、用法與 Session Storage 一樣,唯一不同的是:Local Storage 保存的數(shù)據(jù)是持久性的。當(dāng)前 PAGE 關(guān)閉(Page Session 結(jié)束后),保存的數(shù)據(jù)依然存在。重新打開PAGE,上次保存的數(shù)據(jù)可以獲取到。另外,Local Storage 是全局性的,同時打開兩個 PAGE 會共享一份存數(shù)據(jù),在一個PAGE中修改數(shù)據(jù),另一個 PAGE 中是可以感知到的。



You have viewed this page an untold number of time(s).

將上面代碼復(fù)制到 local_storage.html 的頁面中,用瀏覽器打開,pageLoadCount 的值是1;關(guān)閉 PAGE 重新打開,pageLoadCount 的值是2。這是因為第一次的值已經(jīng)保存了。

用兩個 PAGE 同時打開 local_storage.html,并分別交替刷新,發(fā)現(xiàn)兩個 PAGE 是共享一個 pageLoadCount 的。

分析:Dom Storage 給 Web 提供了一種更錄活的數(shù)據(jù)存儲方式,存儲空間更大(相對 Cookies),用法也比較簡單,方便存儲服務(wù)器或本地的一些臨時數(shù)據(jù)。

從 DomStorage 提供的接口來看,DomStorage 適合存儲比較簡單的數(shù)據(jù),如果要存儲結(jié)構(gòu)化的數(shù)據(jù),可能要借助 JASON了,將要存儲的對象轉(zhuǎn)為 JASON 字串。不太適合存儲比較復(fù)雜或存儲空間要求比較大的數(shù)據(jù),也不適合存儲靜態(tài)的文件等。

在 Android 內(nèi)嵌 Webview 中,需要通過 Webview 設(shè)置接口啟用 Dom Storage。

WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setDomStorageEnabled(true);

拿 Android 類比的話,Web 的 Dom Storage 機制類似于 Android 的 SharedPreference 機制。

2.3 Web SQL Database存儲機制

H5 也提供基于 SQL 的數(shù)據(jù)庫存儲機制,用于存儲適合數(shù)據(jù)庫的結(jié)構(gòu)化數(shù)據(jù)。根據(jù)官方的標(biāo)準(zhǔn)文檔,Web SQL Database 存儲機制不再推薦使用,將來也不再維護,而是推薦使用 AppCache 和 IndexedDB。

現(xiàn)在主流的瀏覽器(點擊查看瀏覽器支持情況)都還是支持 Web SQL Database 存儲機制的。Web SQL Database 存儲機制提供了一組 API 供 Web App 創(chuàng)建、存儲、查詢數(shù)據(jù)庫。

下面通過簡單的例子,演示下 Web SQL Database 的使用。



Status Message

將上面代碼復(fù)制到 sql_database.html 中,用瀏覽器打開,可看到下面的內(nèi)容。

官方建議瀏覽器在實現(xiàn)時,對每個 HOST 的數(shù)據(jù)庫存儲空間作一定限制,建議默認(rèn)是 5MB(分 HOST)的配額;達(dá)到上限后,可以申請更多存儲空間。另外,現(xiàn)在主流瀏覽器 SQL Database 的實現(xiàn)都是基于 SQLite。

分析:SQL Database 的主要優(yōu)勢在于能夠存儲結(jié)構(gòu)復(fù)雜的數(shù)據(jù),能充分利用數(shù)據(jù)庫的優(yōu)勢,可方便對數(shù)據(jù)進行增加、刪除、修改、查詢。由于 SQL 語法的復(fù)雜性,使用起來麻煩一些。SQL Database 也不太適合做靜態(tài)文件的緩存。

在 Android 內(nèi)嵌 Webview 中,需要通過 Webview 設(shè)置接口啟用 SQL Database,同時還要設(shè)置數(shù)據(jù)庫文件的存儲路徑。

WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setDatabaseEnabled(true);
final String dbPath = getApplicationContext().getDir("db", Context.MODE_PRIVATE).getPath();
webSettings.setDatabasePath(dbPath); 

Android 系統(tǒng)也使用了大量的數(shù)據(jù)庫用來存儲數(shù)據(jù),比如聯(lián)系人、短消息等;數(shù)據(jù)庫的格式也 SQLite。Android 也提供了 API 來操作 SQLite。Web SQL Database 存儲機制就是通過提供一組 API,借助瀏覽器的實現(xiàn),將這種 Native 的功能提供給了 Web App。

2.4 Application Cache 機制

Application Cache(簡稱 AppCache)似乎是為支持 Web App 離線使用而開發(fā)的緩存機制。它的緩存機制類似于瀏覽器的緩存(Cache-Control 和 Last-Modified)機制,都是以文件為單位進行緩存,且文件有一定更新機制。但 AppCache 是對瀏覽器緩存機制的補充,不是替代。

先拿 W3C 官方的一個例子,說下 AppCache 機制的用法與功能。







"; } document.querySelector("#status").innerHTML = s; } else { document.querySelector("#status").innerHTML = "

No match!

"; } } } //獲取所有記錄 function getPeople(e) { var s = ""; db.transaction(["people"], "readonly").objectStore("people").openCursor().onsuccess = function(e) { var cursor = e.target.result; if(cursor) { s += "

Key "+cursor.key+"

"; for(var field in cursor.value) { s+= field+"="+cursor.value[field]+"
"; } s+="

"; cursor.continue(); } document.querySelector("#status2").innerHTML = s; } } //通過索引查詢記錄 function getPeopleByNameIndex(e) { var name = document.querySelector("#name1").value; var transaction = db.transaction(["people"],"readonly"); var store = transaction.objectStore("people"); var index = store.index("name"); //name is some value var request = index.get(name); request.onsuccess = function(e) { var result = e.target.result; if(result) { var s = "

Name "+name+"

"; for(var field in result) { s+= field+"="+result[field]+"
"; } s+="

"; } else { document.querySelector("#status3").innerHTML = "

No match!

"; } } } //通過索引查詢記錄 function getPeopleByNameIndex1(e) { var s = ""; var name = document.querySelector("#name1").value; var transaction = db.transaction(["people"],"readonly"); var store = transaction.objectStore("people"); var index = store.index("name"); //name is some value index.openCursor().onsuccess = function(e) { var cursor = e.target.result; if(cursor) { s += "

Key "+cursor.key+"

"; for(var field in cursor.value) { s+= field+"="+cursor.value[field]+"
"; } s+="

"; cursor.continue(); } document.querySelector("#status3").innerHTML = s; } }

添加數(shù)據(jù)


根據(jù)Key查詢數(shù)據(jù)

獲取所有數(shù)據(jù)

根據(jù)索引:Name查詢數(shù)據(jù)

將上面的代碼復(fù)制到 indexed_db.html 中,用 Google Chrome 瀏覽器打開,就可以添加、查詢數(shù)據(jù)。在 Chrome 的開發(fā)者工具中,能查看創(chuàng)建的 DB 、存儲對象(可理解成表)以及表中添加的數(shù)據(jù)。

IndexedDB 有個非常強大的功能,就是 index(索引)。它可對 Value 對象中任何屬性生成索引,然后可以基于索引進行 Value 對象的快速查詢。

要生成索引或支持索引查詢數(shù)據(jù),需求在首次生成存儲對象時,調(diào)用接口生成屬性的索引??梢酝瑫r對對象的多個不同屬性創(chuàng)建索引。如下面代碼就對name 和 email 兩個屬性都生成了索引。

var objectStore = thisDB.createObjectStore("people",{ autoIncrement:true });
//first arg is name of index, second is the path (col);
objectStore.createIndex("name","name", {unique:false});
objectStore.createIndex("email","email", {unique:true});

生成索引后,就可以基于索引進行數(shù)據(jù)的查詢。

function getPeopleByNameIndex(e)
{
var name = document.querySelector("#name1").value;

var transaction = db.transaction(["people"],"readonly");
var store = transaction.objectStore("people");
var index = store.index("name");

//name is some value
var request = index.get(name);
request.onsuccess = function(e) {
    var result = e.target.result;
    if(result) {
        var s = "

Name "+name+"

"; for(var field in result) { s+= field+"="+result[field]+"
"; } s+="

"; } else { document.querySelector("#status3").innerHTML = "

No match!

"; } } }

分析:IndexedDB 是一種靈活且功能強大的數(shù)據(jù)存儲機制,它集合了 Dom Storage 和 Web SQL Database 的優(yōu)點,用于存儲大塊或復(fù)雜結(jié)構(gòu)的數(shù)據(jù),提供更大的存儲空間,使用起來也比較簡單??梢宰鳛?Web SQL Database 的替代。不太適合靜態(tài)文件的緩存。

以key-value 的方式存取對象,可以是任何類型值或?qū)ο?,包括二進制。

可以對對象任何屬性生成索引,方便查詢。

較大的存儲空間,默認(rèn)推薦250MB(分 HOST),比 Dom Storage 的5MB 要大的多。

通過數(shù)據(jù)庫的事務(wù)(tranction)機制進行數(shù)據(jù)操作,保證數(shù)據(jù)一致性。

異步的 API 調(diào)用,避免造成等待而影響體驗。

Android 在4.4開始加入對 IndexedDB 的支持,只需打開允許 JS 執(zhí)行的開關(guān)就好了。

WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
2.6 File System API

File System API 是 H5 新加入的存儲機制。它為 Web App 提供了一個虛擬的文件系統(tǒng),就像 Native App 訪問本地文件系統(tǒng)一樣。由于安全性的考慮,這個虛擬文件系統(tǒng)有一定的限制。Web App 在虛擬的文件系統(tǒng)中,可以進行文件(夾)的創(chuàng)建、讀、寫、刪除、遍歷等操作。

File System API 也是一種可選的緩存機制,和前面的 SQLDatabase、IndexedDB 和 AppCache 等一樣。File System API 有自己的一些特定的優(yōu)勢:

可以滿足大塊的二進制數(shù)據(jù)( large binary blobs)存儲需求。

可以通過預(yù)加載資源文件來提高性能。

可以直接編輯文件。

瀏覽器給虛擬文件系統(tǒng)提供了兩種類型的存儲空間:臨時的和持久性的。臨時的存儲空間是由瀏覽器自動分配的,但可能被瀏覽器回收;持久性的存儲空間需要顯示的申請,申請時瀏覽器會給用戶一提示,需要用戶進行確認(rèn)。持久性的存儲空間是 WebApp 自己管理,瀏覽器不會回收,也不會清除內(nèi)容。持久性的存儲空間大小是通過配額來管理的,首次申請時會一個初始的配額,配額用完需要再次申請。

虛擬的文件系統(tǒng)是運行在沙盒中。不同 WebApp 的虛擬文件系統(tǒng)是互相隔離的,虛擬文件系統(tǒng)與本地文件系統(tǒng)也是互相隔離的。

File System API 提供了一組文件與文件夾的操作接口,有同步和異步兩個版本,可滿足不同的使用場景。下面通過一個文件創(chuàng)建、讀、寫的例子,演示下簡單的功能與用法。


將上面代碼復(fù)制到 file_system_api.html 文件中,用 Google Chrome 瀏覽器打開(現(xiàn)在 File System API 只有 Chrome 43+、Opera 32+ 以及 Chrome for Android 46+ 這三個瀏覽器支持)。由于 Google Chrome 禁用了本地 HTML 文件中的 File System API功能,在啟動 Chrome 時,要加上”—allow-file-access-from-files“命令行參數(shù)。

上面截圖,左邊是 HTML 運行的結(jié)果,右邊是 Chrome 開發(fā)者工具中看到的 Web 的文件系統(tǒng)?;旧?H5的幾種緩存機制的數(shù)據(jù)都能在這個開發(fā)者工具看到,非常方便。

分析:File System API 給 Web App 帶來了文件系統(tǒng)的功能,Native 文件系統(tǒng)的功能在 Web App 中都有相應(yīng)的實現(xiàn)。任何需要通過文件來管理數(shù)據(jù),或通過文件系統(tǒng)進行數(shù)據(jù)管理的場景都比較適合。

到目前,Android 系統(tǒng)的 Webview 還不支持 File System API。

3 移動端 Web 加載性能(緩存)優(yōu)化

分析完 H5提供的各種緩存機制,回到移動端(針對 Android,可能也適用于 iOS)的場景。現(xiàn)在 Android App(包括手 Q 和 WX)大多嵌入了 Webview 的組件(系統(tǒng) Webview 或 QQ 游覽器的 X5組件),通過內(nèi)嵌Webview 來加載一些H5的運營活動頁面或資訊頁。這樣可充分發(fā)揮Web前端的優(yōu)勢:快速開發(fā)、發(fā)布,靈活上下線。但 Webview 也有一些不可忽視的問題,比較突出的就是加載相對較慢,會相對消耗較多流量。

通過對一些 H5頁面進行調(diào)試及抓包發(fā)現(xiàn),每次加載一個 H5頁面,都會有較多的請求。除了 HTML 主 URL 自身的請求外,HTML外部引用的 JS、CSS、字體文件、圖片都是一個獨立的 HTTP 請求,每一個請求都串行的(可能有連接復(fù)用)。這么多請求串起來,再加上瀏覽器解析、渲染的時間,Web 整體的加載時間變得較長;請求文件越多,消耗的流量也會越多。我們可綜合使用上面說到幾種緩存機制,來幫助我們優(yōu)化 Web 的加載性能。

結(jié)論:綜合各種緩存機制比較,對于靜態(tài)文件,如 JS、CSS、字體、圖片等,適合通過瀏覽器緩存機制來進行緩存,通過緩存文件可大幅提升 Web 的加載速度,且節(jié)省流量。但也有一些不足:緩存文件需要首次加載后才會產(chǎn)生;瀏覽器緩存的存儲空間有限,緩存有被清除的可能;緩存的文件沒有校驗。要解決這些不足,可以參考手 Q 的離線包,它有效的解決了這些不足。

對于 Web 在本地或服務(wù)器獲取的數(shù)據(jù),可以通過 Dom Storage 和 IndexedDB 進行緩存。也在一定程度上減少和 Server 的交互,提高加載速度,同時節(jié)省流量。

當(dāng)然 Web 的性能優(yōu)化,還包括選擇合適的圖片大小,避免 JS 和 CSS 造成的阻塞等。這就需要 Web 前端的同事根據(jù)一些規(guī)范和一些調(diào)試工具進行優(yōu)化了。


想了解更多干貨,請搜索關(guān)注公眾號:騰訊Bulgy,或搜索微信號:weixinBugly,關(guān)注我們。

騰訊Bugly

Bugly是騰訊內(nèi)部產(chǎn)品質(zhì)量監(jiān)控平臺的外發(fā)版本,支持iOS和Android兩大主流平臺,其主要功能是App發(fā)布以后,對用戶側(cè)發(fā)生的crash以及卡頓現(xiàn)象進行監(jiān)控并上報,讓開發(fā)同學(xué)可以第一時間了解到app的質(zhì)量情況,及時修改。目前騰訊內(nèi)部所有的產(chǎn)品,均在使用其進行線上產(chǎn)品的崩潰監(jiān)控。
騰訊內(nèi)部團隊4年打磨,目前騰訊內(nèi)部所有的產(chǎn)品都在使用,基本覆蓋了中國市場的移動設(shè)備以及網(wǎng)絡(luò)環(huán)境,可靠性有保證。使用Bugly,你就使用了和手機QQ、QQ空間、手機管家相同的質(zhì)量保障手段

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/61763.html

相關(guān)文章

  • Web緩存相關(guān)知識整理

    摘要:緩存緩存,也叫網(wǎng)關(guān)緩存反向代理緩存。瀏覽器先向網(wǎng)關(guān)發(fā)起請求,網(wǎng)關(guān)服務(wù)器后面對應(yīng)著一臺或多臺負(fù)載均衡源服務(wù)器,會根據(jù)它們的負(fù)載請求,動態(tài)將請求轉(zhuǎn)發(fā)到合適的源服務(wù)器上。雖然這種架構(gòu)負(fù)載均衡源服務(wù)器之間的緩存沒法共享,但卻擁有更好的處擴展性。 一、前言? 工作上遇到一個這樣的需求,一個H5頁面在APP端,如果勾選已讀狀態(tài),則下次打開該鏈接,會跳過此頁面。用到了HTML5 的本地存儲 API ...

    rickchen 評論0 收藏0
  • WEB/H5性能優(yōu)化總結(jié)

    摘要:如下圖所示一重繪與回流前端性能優(yōu)化最關(guān)鍵的就是減少頁面的重繪與回流。很明顯就是少了一步,這是因為把會觸發(fā)回流的屬性用替代,這樣就使渲染的過程減少了這一步,使渲染的時間減少從而提高性能。 我們今天來說說前端圖形渲染優(yōu)化,因為我接下來的時間可能要開始研究webgl方面的東西,所以就在這里把之前做過的H5做一個總結(jié),現(xiàn)同步發(fā)布于GERRY_BLOG,TiMiGerry-知乎,轉(zhuǎn)載請保留鏈接。...

    stdying 評論0 收藏0
  • WEB/H5性能優(yōu)化總結(jié)

    摘要:如下圖所示一重繪與回流前端性能優(yōu)化最關(guān)鍵的就是減少頁面的重繪與回流。很明顯就是少了一步,這是因為把會觸發(fā)回流的屬性用替代,這樣就使渲染的過程減少了這一步,使渲染的時間減少從而提高性能。 我們今天來說說前端圖形渲染優(yōu)化,因為我接下來的時間可能要開始研究webgl方面的東西,所以就在這里把之前做過的H5做一個總結(jié),現(xiàn)同步發(fā)布于GERRY_BLOG,TiMiGerry-知乎,轉(zhuǎn)載請保留鏈接。...

    mingde 評論0 收藏0

發(fā)表評論

0條評論

alin

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<