HTML5初學(xué)者使用Application Cache指南 |
發(fā)布時(shí)間: 2012/7/24 9:25:09 |
對(duì)于web app來說,離線應(yīng)用功能已經(jīng)越來越重要。誠(chéng)然,瀏覽器本身就有緩存機(jī)制,但是,這些緩存機(jī)制不夠可靠,可能并不會(huì)按你所想要的方式運(yùn)行。HTML5則通過ApplicationCache接口處理了離線應(yīng)用中的一些問題。 使用這個(gè)接口讓你的應(yīng)用擁有三方面的優(yōu)勢(shì):
Application Cache(或 AppCache)讓一個(gè)開發(fā)者可以指定瀏覽器需要保存哪個(gè)文件。當(dāng)用戶在離線情況下時(shí),即使他們按了刷新按鈕,你的應(yīng)用也能正確加載和工作。 CACHE MANIFEST 文件cache manifest文件是一個(gè)簡(jiǎn)單的文本文件,其中列出了瀏覽器需要緩存的資源。 引用一個(gè)MANIFEST文件 為了讓一個(gè)應(yīng)用能啟用application cache,需要在文檔的html標(biāo)簽中包含manifest屬性,如下所示: <html manifest=”example.appcache”> … </html> 你需要在你想要緩存的web app的每一頁中都包含 manifest 屬性。如果一個(gè)頁面沒有 manifest屬性,它將不會(huì)被緩存(除非在manifest文件中顯式指定了這個(gè)頁面)。這意味著只要用戶訪問的頁面包含manifest屬性,它都將會(huì)被加入application cache中。這樣,就不用在manifest文件中指定需要緩存哪些頁面了。 Manifest屬性可以指定一個(gè)絕對(duì)URL或是一個(gè)相對(duì)路徑,但是,一個(gè)絕對(duì)URL需要和web app是同源的。一個(gè)manifest文件可以是任何擴(kuò)展文件類型,但必須有正確的mime-type。如下所示: <html manifest=”http://www.example.com/example.mf”> … </html> 一個(gè)manifest文件需要正確的mime-type,即text/cache-manifest。你可以在你的web服務(wù)器中加入一個(gè)定制文件類型(a custom file type),或者加入一個(gè) .htaccess 配置。 例如,為了在Apache中能夠解析這種mime-type,可以在你的配置文件中加入如下代碼: AddType text/cache-manifest .appcache 或者,如果你的應(yīng)用是在Google App Engine中,那么在app.yaml文件中加入代碼: - url: /mystaticdir/(.*\.appcache) static_files: mystaticdir/\1 mime_type: text/cache-manifest upload: mystaticdir/(.*\.appcache) MANIFEST FILE的結(jié)構(gòu) 一個(gè)簡(jiǎn)單的manifest文件看起來可能是下面這樣的: CACHE MANIFEST index.html stylesheet.css images/logo.png scripts/main.js 這個(gè)示例將會(huì)緩存指定使用這個(gè)manifest的頁面中的四個(gè)文件。 有幾點(diǎn)是需要注意的:
下面來看一個(gè)更復(fù)雜的例子: CACHE MANIFEST # 2010-06-18:v2 # Explicitly cached ‘master entries’. CACHE: /favicon.ico index.html stylesheet.css images/logo.png scripts/main.js # Resources that require the user to be online. NETWORK: login.php /myapi http://api.twitter.com # static.html will be served if main.py is inaccessible # offline.jpg will be served in place of all images in images/large/ # offline.html will be served in place of all other .html files FALLBACK: /main.py /static.html images/large/ images/offline.jpg *.html /offline.html 以“#”開頭的都是注釋,這些注釋還可以起到另外的作用。一個(gè)應(yīng)用只有在manifest文件發(fā)生變化時(shí)才會(huì)更新cache。例如,如果你編輯了圖像或是改寫了一個(gè)Javascript函數(shù),cache并不會(huì)發(fā)生更新。你必須改寫manifest文件本身來通知瀏覽器需要更新cache文件了。通過在manifest文件中添加一行注釋,在其中寫上版本號(hào),或者文件hash值,或者時(shí)間戳,你都可以確保用戶擁有你的軟件的最新版本。如果有新版本出現(xiàn),你同樣可以以編程的方式更新cache,就跟在Updating the cache 中所討論的那樣。 一個(gè)manifest文件可能包括三個(gè)部分:CACHE, NETWORK 以及 FALLBACK. CACHE: 這是默認(rèn)部分,列在這個(gè)條目下的文件(或者緊跟在CACHE MANIFEST字符串之后的)都會(huì)在第一次被下載后進(jìn)入cache。 NETWORK: 這一部分中所列出的資源都是需要聯(lián)網(wǎng)使用的資源。它們都不會(huì)進(jìn)入cache中,即使用戶處于離線狀態(tài)。這部分可能會(huì)使用Wildcards。 FALLBACK: 可選部分,指定了如果資源獲取失敗,將會(huì)呈現(xiàn)怎樣的頁面。第一個(gè)URL是資源,第二個(gè)就是fallback頁面。兩個(gè)URL都必須是相對(duì)地址,并且由同一個(gè)manifest文件指定?梢允褂肳ildcards。 注意:這三部分可以以任何順序在manifest文件中出現(xiàn),并且每部分都可以在一個(gè)manifest文件中出現(xiàn)多次。 下面的manifest文件定義了一個(gè)“catch-all”頁面(offline.html),這個(gè)頁面將會(huì)在用戶試圖離線訪問網(wǎng)站根節(jié)點(diǎn)時(shí)顯示。它還指明了需要聯(lián)網(wǎng)使用的其他資源(如遠(yuǎn)程站點(diǎn)上的資源)。 CACHE MANIFEST # 2010-06-18:v3 # Explicitly cached entries index.html css/style.css # offline.html will be displayed if the user is offline FALLBACK: / /offline.html # All other resources (e.g. sites) require the user to be online. NETWORK: * # Additional resources to cache CACHE: images/logo1.png images/logo2.png images/logo3.png 注意:引用了你的manifest文件的HTML文件都會(huì)自動(dòng)被緩存,因此,沒有必要在你的manifest文件中再指定這個(gè)文件,但是,在manifest文件中指定這個(gè)文件是一種更好的做法。 注意:頁面上基于SSL的HTTP cache headers以及caching restrictions都會(huì)被cache manifests重寫。因此,基于https的頁面也能離線工作。 更新緩存(CACHE)如果一個(gè)應(yīng)用是在離線情況下,那么它會(huì)保持它的緩存狀態(tài),除非有以下事件發(fā)生:
緩存狀態(tài)CACHE STATUS 在程序中,你可以通過window.applicationCache 對(duì)象來訪問瀏覽器的app cache。你可以查看 status 屬性來獲取cache的當(dāng)前狀態(tài): var appCache = window.applicationCache; switch (appCache.status) { case appCache.UNCACHED: // UNCACHED == 0 return ‘UNCACHED’; break; case appCache.IDLE: // IDLE == 1 return ‘IDLE’; break; case appCache.CHECKING: // CHECKING == 2 return ‘CHECKING’; break; case appCache.DOWNLOADING: // DOWNLOADING == 3 return ‘DOWNLOADING’; break; case appCache.UPDATEREADY: // UPDATEREADY == 4 return ‘UPDATEREADY’; break; case appCache.OBSOLETE: // OBSOLETE == 5 return ‘OBSOLETE’; break; default: return ‘UKNOWN CACHE STATUS’; break; }; 為了通過編程更新cache,首先調(diào)用 applicationCache.update()。這將會(huì)試圖更新用戶的cache(要求manifest文件已經(jīng)改變)。最后,當(dāng) applicationCache.status 處于 UPDATEREADY 狀態(tài)時(shí),調(diào)用applicationCache.swapCache(),舊的cache就會(huì)被置換成新的。 本文出自:億恩科技【1tcdy.com】 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |