偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

初學(xué)者使用Application Cache指南

開(kāi)發(fā) 前端
對(duì)于web app來(lái)說(shuō),離線應(yīng)用功能已經(jīng)越來(lái)越重要。誠(chéng)然,瀏覽器本身就有緩存機(jī)制,但是,這些緩存機(jī)制不夠可靠,可能并不會(huì)按你所想要的方式運(yùn)行。HTML5則通過(guò)ApplicationCache接口處理了離線應(yīng)用中的一些問(wèn)題。

 對(duì)于web app來(lái)說(shuō),離線應(yīng)用功能已經(jīng)越來(lái)越重要。誠(chéng)然,瀏覽器本身就有緩存機(jī)制,但是,這些緩存機(jī)制不夠可靠,可能并不會(huì)按你所想要的方式運(yùn)行。HTML5則通過(guò)ApplicationCache接口處理了離線應(yīng)用中的一些問(wèn)題。

使用這個(gè)接口讓你的應(yīng)用擁有三方面的優(yōu)勢(shì):

◆ 離線瀏覽——用戶在不能聯(lián)網(wǎng)的時(shí)候依然能瀏覽整個(gè)站點(diǎn)

◆ 高速——緩存資源是存儲(chǔ)在本地的,因此能更快加載。

◆ 更小的服務(wù)器負(fù)載——瀏覽器只需要從服務(wù)器端下載有改變的資源即可,相同資源不需要重復(fù)下載。

Application Cache(或 AppCache)讓一個(gè)開(kāi)發(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屬性,如下所示:

  1. <html manifest=”example.appcache”> 
  2.    … 
  3.  </html> 

你需要在你想要緩存的web app的每一頁(yè)中都包含 manifest 屬性。如果一個(gè)頁(yè)面沒(méi)有 manifest屬性,它將不會(huì)被緩存(除非在manifest文件中顯式指定了這個(gè)頁(yè)面)。這意味著只要用戶訪問(wèn)的頁(yè)面包含manifest屬性,它都將會(huì)被加入application cache中。這樣,就不用在manifest文件中指定需要緩存哪些頁(yè)面了。

Manifest屬性可以指定一個(gè)絕對(duì)URL或是一個(gè)相對(duì)路徑,但是,一個(gè)絕對(duì)URL需要和web app是同源的。一個(gè)manifest文件可以是任何擴(kuò)展文件類型,但必須有正確的mime-type。如下所示:

  1. <html manifest=”http://www.example.com/example.mf”> 
  2.   … 
  3. </html> 

一個(gè)manifest文件需要正確的mime-type,即text/cache-manifest。你可以在你的web服務(wù)器中加入一個(gè)定制文件類型(a custom file type),或者加入一個(gè) .htaccess 配置。

例如,為了在Apache中能夠解析這種mime-type,可以在你的配置文件中加入如下代碼:

  1. AddType text/cache-manifest .appcache 

或者,如果你的應(yīng)用是在Google App Engine中,那么在app.yaml文件中加入代碼:

  1. - url: /mystaticdir/(.*\.appcache) 
  2.   static_files: mystaticdir/\1 
  3.   mime_type: text/cache-manifest 
  4.   upload: mystaticdir/(.*\.appcache) 

MANIFEST FILE的結(jié)構(gòu)

一個(gè)簡(jiǎn)單的manifest文件看起來(lái)可能是下面這樣的:

CACHE MANIFEST

index.html

stylesheet.css

images/logo.png

scripts/main.js

這個(gè)示例將會(huì)緩存指定使用這個(gè)manifest的頁(yè)面中的四個(gè)文件。

有幾點(diǎn)是需要注意的:

◆ 必須在***行包括 CACHE MANIFEST 字符串。

◆ 站點(diǎn)所能緩存的數(shù)據(jù)上限是5MB 。但是,如果你是在為Chrome Web Store做開(kāi)發(fā)的話,你可以使用unlimitedStorage 來(lái)去除這個(gè)限制。

◆ 如果manifest文件或者是其中指定的某個(gè)資源下載失敗的話,整個(gè)cache的更新都會(huì)失敗。在這種情況下,瀏覽器將會(huì)使用老的application cache。

下面來(lái)看一個(gè)更復(fù)雜的例子:

  1. CACHE MANIFEST 
  2. # 2010-06-18:v2 
  3. # Explicitly cached ‘master entries’. 
  4. CACHE: 
  5. /favicon.ico 
  6. index.html 
  7. stylesheet.css 
  8. images/logo.png 
  9. scripts/main.js 
  10. # Resources that require the user to be online. 
  11. NETWORK: 
  12. login.php 
  13. /myapi 
  14. http://api.twitter.com 
  15. # static.html will be served if main.py is inaccessible 
  16. # offline.jpg will be served in place of all images in images/large/ 
  17. # offline.html will be served in place of all other .html files 
  18. FALLBACK: 
  19. /main.py /static.html 
  20. images/large/ images/offline.jpg 
  21. *.html /offline.html 

以“#”開(kāi)頭的都是注釋,這些注釋還可以起到另外的作用。一個(gè)應(yīng)用只有在manifest文件發(fā)生變化時(shí)才會(huì)更新cache。例如,如果你編輯了圖像或是改寫(xiě)了一個(gè)Javascript函數(shù),cache并不會(huì)發(fā)生更新。你必須改寫(xiě)manifest文件本身來(lái)通知瀏覽器需要更新cache文件了。通過(guò)在manifest文件中添加一行注釋,在其中寫(xiě)上版本號(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)怎樣的頁(yè)面。***個(gè)URL是資源,第二個(gè)就是fallback頁(yè)面。兩個(gè)URL都必須是相對(duì)地址,并且由同一個(gè)manifest文件指定??梢允褂肳ildcards。

注意:這三部分可以以任何順序在manifest文件中出現(xiàn),并且每部分都可以在一個(gè)manifest文件中出現(xiàn)多次。

下面的manifest文件定義了一個(gè)“catch-all”頁(yè)面(offline.html),這個(gè)頁(yè)面將會(huì)在用戶試圖離線訪問(wèn)網(wǎng)站根節(jié)點(diǎn)時(shí)顯示。它還指明了需要聯(lián)網(wǎng)使用的其他資源(如遠(yuǎn)程站點(diǎn)上的資源)。

  1. CACHE MANIFEST 
  2. # 2010-06-18:v3 
  3. # Explicitly cached entries 
  4. index.html 
  5. css/style.css 
  6. # offline.html will be displayed if the user is offline 
  7. FALLBACK: 
  8. / /offline.html 
  9. # All other resources (e.g. sites) require the user to be online. 
  10. NETWORK: 
  11. # Additional resources to cache 
  12. CACHE: 
  13. images/logo1.png 
  14. images/logo2.png 
  15. images/logo3.png 

注意:引用了你的manifest文件的HTML文件都會(huì)自動(dòng)被緩存,因此,沒(méi)有必要在你的manifest文件中再指定這個(gè)文件,但是,在manifest文件中指定這個(gè)文件是一種更好的做法。

注意:頁(yè)面上基于SSL的HTTP cache headers以及caching restrictions都會(huì)被cache manifests重寫(xiě)。因此,基于https的頁(yè)面也能離線工作。

更新緩存(CACHE)

如果一個(gè)應(yīng)用是在離線情況下,那么它會(huì)保持它的緩存狀態(tài),除非有以下事件發(fā)生:

◆ 用戶清除了瀏覽器中存儲(chǔ)有你的站點(diǎn)的數(shù)據(jù)。

◆ manifest file 被修改了。注意:修改了在manifest文件中列出的某個(gè)文件并不會(huì)讓瀏覽器重新緩存資源。必須是manifest文件本身改變了,才會(huì)重新進(jìn)行緩存。

◆ app cache通過(guò)編程更新了。

緩存狀態(tài)CACHE STATUS

在程序中,你可以通過(guò)window.applicationCache 對(duì)象來(lái)訪問(wèn)瀏覽器的app cache。你可以查看 status 屬性來(lái)獲取cache的當(dāng)前狀態(tài):

  1. var appCache = window.applicationCache; 
  2. switch (appCache.status) { 
  3.   case appCache.UNCACHED: // UNCACHED == 0 
  4.     return ‘UNCACHED’; 
  5.     break; 
  6.   case appCache.IDLE: // IDLE == 1 
  7.  
  8.     return ‘IDLE’; 
  9.     break; 
  10.   case appCache.CHECKING: // CHECKING == 2 
  11.     return ‘CHECKING’; 
  12.     break; 
  13.  case appCache.DOWNLOADING: // DOWNLOADING == 3 
  14.     return ‘DOWNLOADING’; 
  15.     break; 
  16.   case appCache.UPDATEREADY:  // UPDATEREADY == 4 
  17.     return ‘UPDATEREADY’; 
  18.     break; 
  19.   case appCache.OBSOLETE: // OBSOLETE == 5 
  20.     return ‘OBSOLETE’; 
  21.     break; 
  22.   default: 
  23.     return ‘UKNOWN CACHE STATUS’; 
  24.     break; 
  25. }; 

為了通過(guò)編程更新cache,首先調(diào)用 applicationCache.update()。這將會(huì)試圖更新用戶的cache(要求manifest文件已經(jīng)改變)。***,當(dāng) applicationCache.status 處于 UPDATEREADY 狀態(tài)時(shí),調(diào)用applicationCache.swapCache(),舊的cache就會(huì)被置換成新的。

  1. var appCache = window.applicationCache; 
  2. appCache.update(); // Attempt to update the user’s cache. 
  3. … 
  4. if (appCache.status == window.applicationCache.UPDATEREADY) { 
  5.   appCache.swapCache();  // The fetch was successful, swap in the new cache. 

注意:像這樣使用 update()和swapCache()并不會(huì)將更新后的資源呈現(xiàn)給用戶。這僅僅是讓瀏覽器檢查manifest文件是否發(fā)生了更新,然后下載指定的更新內(nèi)容,重新填充app cache。因此,要讓用戶看到更新后的內(nèi)容,需要兩次頁(yè)面下載,一次是更新app cache,一次是更新頁(yè)面內(nèi)容。

好消息是,你可以避免兩次頁(yè)面下載帶來(lái)的麻煩。為了讓用戶能看到你的站點(diǎn)的***版本,設(shè)置一個(gè)監(jiān)聽(tīng)器來(lái)監(jiān)聽(tīng)頁(yè)面加載時(shí)的updateready 事件。

  1. // Check if a new cache is available on page load. 
  2. window.addEventListener(‘load’, function(e) { 
  3.   window.applicationCache.addEventListener(‘updateready’, function(e) { 
  4.     if (window.applicationCache.status == window.applicationCache.UPDATEREADY) { 
  5.       // Browser downloaded a new app cache. 
  6.       // Swap it in and reload the page to get the new hotness. 
  7.       window.applicationCache.swapCache(); 
  8.       if (confirm(‘A new version of this site is available. Load it?’)) { 
  9.         window.location.reload(); 
  10.       } 
  11.     } else { 
  12.       // Manifest didn’t changed. Nothing new to server. 
  13.     } 
  14.   }, false); 
  15. }, false); 

APPCACHE事件(APPCACHE EVENTS)

也許你已經(jīng)想到了,還有更多事件可以反映出cache的狀態(tài)。在諸如下載、app cache更新、出現(xiàn)錯(cuò)誤等事件都會(huì)讓瀏覽器觸發(fā)相應(yīng)事件。下面的代碼片段為每一類cache event都設(shè)置了監(jiān)聽(tīng)器:

  1. function handleCacheEvent(e) { 
  2.   //… 
  3. function handleCacheError(e) { 
  4.  alert(‘Error: Cache failed to update!’); 
  5. }; 
  6. // Fired after the first cache of the manifest. 
  7. appCache.addEventListener(‘cached’, handleCacheEvent, false); 
  8. // Checking for an update. Always the first event fired in the sequence. 
  9. appCache.addEventListener(‘checking’, handleCacheEvent, false); 
  10. // An update was found. The browser is fetching resources. 
  11. appCache.addEventListener(‘downloading’, handleCacheEvent, false); 
  12. // The manifest returns 404 or 410, the download failed, 
  13. // or the manifest changed while the download was in progress. 
  14. appCache.addEventListener(‘error’, handleCacheError, false); 
  15. // Fired after the first download of the manifest. 
  16. appCache.addEventListener(‘noupdate’, handleCacheEvent, false); 
  17. // Fired if the manifest file returns a 404 or 410. 
  18. // This results in the application cache being deleted. 
  19. appCache.addEventListener(‘obsolete’, handleCacheEvent, false); 
  20. // Fired for each resource listed in the manifest as it is being fetched. 
  21. appCache.addEventListener(‘progress’, handleCacheEvent, false); 
  22. // Fired when the manifest resources have been newly redownloaded. 
  23. appCache.addEventListener(‘updateready’, handleCacheEvent, false); 

如果manifest文件或者該文件中指定的某個(gè)資源下載失敗,那么整個(gè)更新都會(huì)失敗。在這種情況下,瀏覽器會(huì)繼續(xù)試用老的application cache。

原文鏈接:http://www.webapptrend.com/2012/03/2103.html

【編輯推薦】

  1. Google Web App開(kāi)發(fā)指南之構(gòu)建優(yōu)秀的Web Apps
  2. Google Web App開(kāi)發(fā)指南:交互設(shè)計(jì)
  3. Google Web App開(kāi)發(fā)指南:什么是Web Apps?
  4. ***次為Window8開(kāi)發(fā)Web Apps
  5. 討論了那么多,究竟什么是Web App?
責(zé)任編輯:陳貽新 來(lái)源: Web App Trend
相關(guān)推薦

2022-04-24 15:21:01

MarkdownHTML

2010-06-13 11:13:38

UML初學(xué)者指南

2022-07-22 13:14:57

TypeScript指南

2022-03-28 09:52:42

JavaScript語(yǔ)言

2023-07-28 07:31:52

JavaScriptasyncawait

2023-07-03 15:05:07

預(yù)測(cè)分析大數(shù)據(jù)

2021-05-10 08:50:32

網(wǎng)絡(luò)管理網(wǎng)絡(luò)網(wǎng)絡(luò)性能

2022-09-05 15:36:39

Linux日志記錄syslogd

2023-02-10 08:37:28

2022-10-10 15:28:45

負(fù)載均衡

2020-08-16 13:10:46

TensorFlow深度學(xué)習(xí)數(shù)據(jù)集

2014-04-01 10:20:00

開(kāi)源Rails

2023-02-19 15:31:09

架構(gòu)軟件開(kāi)發(fā)代碼

2024-04-28 10:56:34

Next.jsWeb應(yīng)用搜索引擎優(yōu)化

2013-03-06 10:40:58

Adobe Edge HTML5

2013-04-08 16:35:52

Adobe Edge

2010-08-26 15:47:09

vsftpd安裝

2011-03-02 10:57:27

vsFTPd

2018-10-28 16:14:55

Reactreact.js前端

2021-09-08 12:29:21

物聯(lián)網(wǎng)IOT
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)