?
本文檔使用 PHP中文網(wǎng)手冊(cè) 發(fā)布
Deprecated
該功能已從Web標(biāo)準(zhǔn)中刪除。盡管一些瀏覽器可能仍然支持它,但它正在被丟棄。避免使用它并盡可能更新現(xiàn)有的代碼;請(qǐng)參閱本頁(yè)底部的兼容性表格來(lái)指導(dǎo)您的決定。請(qǐng)注意,此功能可能隨時(shí)停止工作。
使用此處描述的應(yīng)用程序緩存功能在這一點(diǎn)上非常令人沮喪;它正在從Web平臺(tái)中移除。改用服務(wù)人員。事實(shí)上,從Firefox 44開始,當(dāng)AppCache用于為頁(yè)面提供脫機(jī)支持時(shí),控制臺(tái)中現(xiàn)在會(huì)顯示一條警告消息。
HTML5提供了一種應(yīng)用程序緩存機(jī)制,可讓基于Web的應(yīng)用程序脫機(jī)運(yùn)行。開發(fā)人員可以使用應(yīng)用程序緩存(AppCache)界面來(lái)指定瀏覽器應(yīng)緩存的資源并使其可供離線用戶使用。即使用戶在脫機(jī)狀態(tài)下單擊刷新按鈕,緩存的應(yīng)用程序也會(huì)正常加載并正常工作。
使用應(yīng)用程序緩存為應(yīng)用程序提供了以下好處:
離線瀏覽:用戶即使在離線時(shí)也可以瀏覽網(wǎng)站。
速度:緩存的資源是本地的,因此加載速度更快。
降低服務(wù)器負(fù)載:瀏覽器僅下載從服務(wù)器更改的資源。
要為應(yīng)用程序啟用應(yīng)用程序緩存,必須在應(yīng)用程序頁(yè)面manifest
的<html>
元素中包含該屬性,如以下示例所示:
<html manifest="example.appcache"> ...</html>
清單屬性引用緩存清單文件,該文件是列出瀏覽器應(yīng)為應(yīng)用程序緩存的資源(文件)的文本文件。
您應(yīng)該manifest
在應(yīng)用程序的每個(gè)頁(yè)面上包含要緩存的屬性。瀏覽器不會(huì)緩存不包含manifest
屬性的頁(yè)面,除非這些頁(yè)面明確列在清單文件本身中。您不需要列出要在清單文件中緩存的所有頁(yè)面,瀏覽器會(huì)隱式添加用戶訪問(wèn)的每個(gè)頁(yè)面,并將manifest
屬性設(shè)置為應(yīng)用程序緩存。
某些瀏覽器(例如Firefox)會(huì)在用戶首次加載使用應(yīng)用程序緩存的應(yīng)用程序時(shí)顯示通知欄。通知欄顯示一條消息,例如:
本網(wǎng)站(www.example.com
)要求將數(shù)據(jù)存儲(chǔ)在您的計(jì)算機(jī)上供脫機(jī)使用?,F(xiàn)在不允許
術(shù)語(yǔ)“脫機(jī)(啟用)應(yīng)用程序”有時(shí)專指用戶已允許使用脫機(jī)功能的應(yīng)用程序。
使用應(yīng)用程序緩存修改了加載文檔的正常過(guò)程:
如果應(yīng)用程序緩存存在,則瀏覽器直接從緩存中加載文檔及其關(guān)聯(lián)資源,而不訪問(wèn)網(wǎng)絡(luò)。這加快了文檔加載時(shí)間。
然后瀏覽器檢查是否已在服務(wù)器上更新緩存清單。
如果緩存清單已更新,瀏覽器會(huì)下載清單的新版本和清單中列出的資源。這是在后臺(tái)完成的,不會(huì)顯著影響性能。
下面更詳細(xì)地指定加載文檔和更新應(yīng)用程序緩存的過(guò)程:
當(dāng)瀏覽器訪問(wèn)包含manifest
屬性的文檔時(shí),如果沒有應(yīng)用程序緩存存在,瀏覽器將加載文檔,然后獲取清單文件中列出的所有條目,從而創(chuàng)建應(yīng)用程序緩存的第一個(gè)版本。
對(duì)該文檔的后續(xù)訪問(wèn)會(huì)導(dǎo)致瀏覽器從應(yīng)用程序緩存(而不是從服務(wù)器)加載清單文件中指定的文檔和其他資產(chǎn)。另外,瀏覽器還會(huì)向?qū)ο蟀l(fā)送一個(gè)checking
事件window.applicationCache
,并根據(jù)適當(dāng)?shù)腍TTP緩存規(guī)則獲取清單文件。
如果清單的當(dāng)前緩存副本是最新的,則瀏覽器noupdate
向該applicationCache
對(duì)象發(fā)送一個(gè)事件,并且更新過(guò)程完成。請(qǐng)注意,如果您更改服務(wù)器上的任何緩存資源,則還必須更改清單文件本身,以便瀏覽器知道它需要再次獲取所有資源。
如果清單文件已更改,則清單中列出的所有文件(以及通過(guò)調(diào)用添加到高速緩存的文件applicationCache.add()
)都會(huì)根據(jù)相應(yīng)的HTTP高速緩存規(guī)則提取到臨時(shí)高速緩存中。對(duì)于每個(gè)獲取到該臨時(shí)緩存中的文件,瀏覽器都會(huì)progress
向該applicationCache
對(duì)象發(fā)送一個(gè)事件。如果發(fā)生任何錯(cuò)誤,瀏覽器將發(fā)送一個(gè)error
事件,并停止更新。
一旦成功檢索到所有文件,它們就會(huì)自動(dòng)移入真正的脫機(jī)緩存中,并將cached
事件發(fā)送到applicationCache
對(duì)象。由于文檔已經(jīng)從緩存中加載到瀏覽器中,所以在文檔重新加載(手動(dòng)或編程)之前,更新的文檔將不會(huì)被渲染。
在Chrome中,您可以通過(guò)在首選項(xiàng)中選擇“清除瀏覽數(shù)據(jù)...”或通過(guò)訪問(wèn)chrome://appcache-internals/來(lái)清除脫機(jī)緩存。Safari在其偏好設(shè)置中有類似的“空緩存”設(shè)置,但也可能需要重啟瀏覽器。
在Firefox中,脫機(jī)緩存數(shù)據(jù)與Firefox配置文件分開存儲(chǔ) - 位于常規(guī)磁盤緩存旁邊:
Windows Vista/7: C:\Users\<username>\AppData\
Local
\Mozilla\Firefox\Profiles\<salt>.<profile name>\OfflineCache
Mac/Linux: /Users/<username>/Library/Caches/Firefox/Profiles/<salt>.<profile name>/OfflineCache
在Firefox中,可以在about:cache
頁(yè)面上檢查脫機(jī)緩存的當(dāng)前狀態(tài)(在“脫機(jī)緩存設(shè)備”標(biāo)題下)??梢允褂霉ぞ?- >選項(xiàng) - >高級(jí) - >網(wǎng)絡(luò) - >離線數(shù)據(jù)中的“刪除...”按鈕單獨(dú)清除每個(gè)站點(diǎn)的脫機(jī)緩存。
在Firefox 11之前,無(wú)論是工具 - >清除最近的歷史記錄,還是工具 - >選項(xiàng) - >高級(jí) - >網(wǎng)絡(luò) - >離線數(shù)據(jù) - >立即清除,都會(huì)清除離線緩存。這已被修復(fù)。
在Linux上,您可以在編輯>首選項(xiàng)>高級(jí)>網(wǎng)絡(luò)>離線Web內(nèi)容和用戶數(shù)據(jù)中找到該設(shè)置
另請(qǐng)參閱清除DOM存儲(chǔ)數(shù)據(jù)。
應(yīng)用程序緩存也可能過(guò)時(shí)。如果從服務(wù)器中刪除應(yīng)用程序的清單文件,瀏覽器將刪除使用該清單的所有應(yīng)用程序緩存,并向該applicationCache
對(duì)象發(fā)送“已廢棄”事件。這將應(yīng)用程序緩存的狀態(tài)設(shè)置為OBSOLETE
。
manifest
Web應(yīng)用程序中的屬性可以指定緩存清單文件的相對(duì)路徑或絕對(duì)URL。(絕對(duì)URL必須來(lái)自與應(yīng)用程序相同的來(lái)源)。緩存清單文件可以具有任何文件擴(kuò)展名,但它必須以MIME類型提供text/cache-manifest
。
注意:在Apache服務(wù)器上,清單(.appcache)文件的MIME類型可以通過(guò)添加AddType text/cache-manifest .appcache
到根目錄或與應(yīng)用程序相同的目錄中的.htaccess文件來(lái)設(shè)置。
緩存清單文件是一個(gè)簡(jiǎn)單的文本文件,列出了瀏覽器為了離線訪問(wèn)而緩存的資源。資源由URI標(biāo)識(shí)。緩存清單中列出的條目必須與清單具有相同的方案,主機(jī)和端口。
以下是一個(gè)簡(jiǎn)單的緩存清單文件example.appcache
,適用于www.example.com上的虛擬網(wǎng)站。
CACHE MANIFEST # v1 - 2011-08-13# This is a comment.http://www.example.com/index.html http://www.example.com/header.png http://www.example.com/blah/blah
緩存清單文件可以包括三個(gè)部分(CACHE
,NETWORK
,和FALLBACK
,在下面討論)。在上面的示例中,沒有節(jié)頭,因此假定所有數(shù)據(jù)行都位于explicit(CACHE
)節(jié)中,這意味著瀏覽器應(yīng)將所有列出的資源緩存在應(yīng)用程序緩存中。資源可以使用絕對(duì)或相對(duì)URL(例如,index.html
)指定。
上例中的“v1”注釋有一個(gè)很好的理由。清單文件更改時(shí),瀏覽器僅更新應(yīng)用程序緩存,字節(jié)為字節(jié)。如果更改緩存的資源(例如,header.png
用新內(nèi)容更新映像),則還必須更改清單文件的內(nèi)容,以便讓瀏覽器知道他們需要刷新緩存。您可以對(duì)清單文件進(jìn)行任何更改,但建議最佳做法是修改版本號(hào)。
重要提示:不要在緩存清單文件中指定清單本身,否則幾乎不可能通知瀏覽器新的清單可用。
CACHE
,NETWORK
,和FALLBACK
清單可以有三個(gè)不同的部分:CACHE
,NETWORK
,和FALLBACK
。
CACHE:
這是緩存清單文件中條目的默認(rèn)部分。在CACHE:
部分標(biāo)題下(或直接在該CACHE MANIFEST
行后面)列出的文件在第一次下載后被顯式緩存。緩存清單文件中NETWORK:
的NETWORK:
部分標(biāo)題下列出的文件是需要連接到服務(wù)器的白名單資源。即使用戶處于離線狀態(tài),對(duì)這些資源的所有請(qǐng)求都會(huì)繞過(guò)緩存。通配符*
可以使用一次。大多數(shù)網(wǎng)站需要*
。FALLBACK:
該FALLBACK:
部分指定瀏覽器在資源不可訪問(wèn)時(shí)應(yīng)使用的備用頁(yè)面。本節(jié)中的每個(gè)條目都列出了兩個(gè)URI--第一個(gè)是資源,第二個(gè)是后備。這兩個(gè)URI必須是相對(duì)的,并且來(lái)自清單文件的相同來(lái)源。可以使用通配符。
CACHE
,NETWORK
和FALLBACK
部分可以在高速緩存中的清單文件的任何順序排列,并且各部分可以在單一清單中出現(xiàn)一次以上。
以下是www.example.com上虛構(gòu)網(wǎng)站的更完整的緩存清單文件:
CACHE MANIFEST # v1 2011-08-14# This is another comment index.html cache.html style.css image1.png # Use from network if available NETWORK:network.html # Fallback content FALLBACK:. fallback.html
本例使用NETWORK
和FALLBACK
部分指定的network.html
頁(yè)面必須始終從網(wǎng)絡(luò)檢索,并且該fallback.html
頁(yè)面應(yīng)該充當(dāng)后備資源(例如,在情況下與服務(wù)器的連接不能建立)。
緩存清單文件必須以text/cache-manifest
MIME類型提供。使用此MIME類型提供的所有資源必須遵循本節(jié)中定義的應(yīng)用程序緩存清單的語(yǔ)法。
高速緩存清單是UTF-8格式的文本文件,可以選擇包含BOM字符。換行符可以由換行符(U+000A
),回車符(U+000D
)或回車符和換行符來(lái)表示。
緩存清單的第一行必須包含字符串CACHE MANIFEST
(U+0020
兩個(gè)單詞之間有一個(gè)空格),后跟零個(gè)或多個(gè)空格或制表符。該行上的任何其他文本都將被忽略。
緩存清單的其余部分必須包含零個(gè)或多個(gè)以下行:
空白行您可以使用由零個(gè)或多個(gè)空格和制表符組成的characters.CommentComments包含零個(gè)或多個(gè)制表符或空格,后跟單個(gè)#
字符,后跟零個(gè)或多個(gè)注釋文本字符。注釋只能用于他們自己的行(在第一CACHE MANIFEST
行之后),不能附加到其他行。這意味著您無(wú)法指定片段標(biāo)識(shí)符。部分headerSection標(biāo)頭指定正在處理緩存清單的哪一部分。有三種可能的部分標(biāo)題:
節(jié)標(biāo)題說(shuō)明`CACHE:`切換到緩存清單的顯式部分(這是默認(rèn)部分)。`NETWORK:`切換到緩存清單的在線白名單部分。`FALLBACK:`切換到緩存清單的后備部分。
部分標(biāo)題行可能包含空格,但必須:
在部分名稱中包含冒號(hào) (:
)。部分?jǐn)?shù)據(jù)數(shù)據(jù)行的格式因部分而異。在explicit(CACHE:
)部分中,每行都是要緩存的資源的有效URI或IRI引用(本節(jié)中不允許使用通配符)。在每行的URI或IRI之前和之后允許使用空格。在Fallback部分中,每一行都是對(duì)資源的有效URI或IRI引用,隨后是在無(wú)法與服務(wù)器建立連接時(shí)要提供的后備資源。在網(wǎng)絡(luò)部分,每一行都是一個(gè)有效的URI或IRI引用,用于從網(wǎng)絡(luò)中獲取資源(或者*
可以在本節(jié)中使用通配符)。
注意:相對(duì)URI與緩存清單的URI相關(guān),而不是引用清單的文檔的URI。
高速緩存清單文件可以隨意從節(jié)段切換到節(jié)段(每節(jié)段標(biāo)題可以多次使用),并且節(jié)段允許為空。
應(yīng)用程序緩存始終包含至少一個(gè)由URI標(biāo)識(shí)的資源。所有資源都適用于以下類別之一:
主條目這些是添加到緩存的資源,因?yàn)橛脩粼L問(wèn)的瀏覽上下文包含一個(gè)文檔,該文檔使用其manifest
屬性指示它位于此緩存中。隱式條目這些是在應(yīng)用程序的緩存清單文件中明確列出的資源。網(wǎng)絡(luò)條目這些是應(yīng)用程序的緩存清單文件作為網(wǎng)絡(luò)條目?;赝藯l目這些是在應(yīng)用程序的緩存清單文件中列為備用條目的資源。
注意:資源可以使用多個(gè)類別進(jìn)行標(biāo)記,因此可以分類為多個(gè)條目。例如,一個(gè)條目既可以是顯式條目又可以是后備條目。
下面將更詳細(xì)地描述資源類別。
主條目是manifest
在其<html>
元素中包含屬性的任何HTML文件。例如,假設(shè)我們有HTML文件http://www.example.com/entry.html,它看起來(lái)像這樣:
<html manifest="example.appcache"> <h1>Application Cache Example</h1></html>
如果entry.html
未在example.appcache
緩存清單文件中列出,則訪問(wèn)該entry.html
頁(yè)面會(huì)導(dǎo)致entry.html
作為主條目添加到應(yīng)用程序緩存中。
顯式條目是在CACHE
緩存清單文件的部分中明確列出的資源。
NETWORK
緩存清單文件的部分指定了Web應(yīng)用程序需要聯(lián)機(jī)訪問(wèn)的資源。應(yīng)用程序緩存中的網(wǎng)絡(luò)條目本質(zhì)上是“在線白名單” - 該NETWORK
節(jié)中指定的URI 從服務(wù)器而不是緩存中加載。這可以讓瀏覽器的安全模型通過(guò)限制對(duì)已批準(zhǔn)資源的訪問(wèn)來(lái)保護(hù)用戶免受潛在的安全漏洞攻擊。
作為示例,您可以使用網(wǎng)絡(luò)條目從服務(wù)器(而不是緩存)加載和執(zhí)行腳本和其他代碼:
CACHE MANIFEST NETWORK:/api
上面列出的緩存清單部分確保加載http://www.example.com/api/
子樹中包含的資源的請(qǐng)求始終訪問(wèn)網(wǎng)絡(luò),而不嘗試訪問(wèn)緩存。
注意:從清單文件中簡(jiǎn)單省略主條目(manifest
在html
元素中設(shè)置了屬性的文件)將不會(huì)有相同的結(jié)果,因?yàn)橹鳁l目將被添加到應(yīng)用程序緩存中,并隨后從該應(yīng)用程序緩存中提供。
當(dāng)嘗試加載資源失敗時(shí)使用回退條目。例如,假設(shè)緩存清單文件http://www.example.com/example.appcache
包含以下內(nèi)容:
CACHE MANIFEST FALLBACK:example/bar/ example.html
對(duì)其http://www.example.com/example/bar/
或其任何子目錄及其內(nèi)容的任何請(qǐng)求都會(huì)導(dǎo)致瀏覽器發(fā)出網(wǎng)絡(luò)請(qǐng)求以嘗試加載所請(qǐng)求的資源。如果嘗試失敗,由于網(wǎng)絡(luò)故障或某種服務(wù)器錯(cuò)誤,瀏覽器會(huì)加載example.html
文件。
每個(gè)應(yīng)用程序緩存都有一個(gè)狀態(tài),用于指示緩存的當(dāng)前狀態(tài)。共享相同清單URI的緩存共享相同的緩存狀態(tài),可以是以下之一:
UNCACHED
指示應(yīng)用程序緩存對(duì)象未完全初始化的特殊值。IDLE
應(yīng)用程序緩存當(dāng)前未處于更新過(guò)程中。CHECKING
清單正在提取并檢查更新。DOWNLOADING
由于資源清單發(fā)生變化,正在下載資源以添加到緩存中。UPDATEREADY
有一個(gè)新版本的應(yīng)用程序緩存可用。有一個(gè)相應(yīng)的updateready
事件,cached
當(dāng)一個(gè)新的更新被下載但尚未使用該swapCache()
方法激活時(shí),將被觸發(fā)而不是事件。OBSOLETE
應(yīng)用程序緩存組現(xiàn)在已經(jīng)過(guò)時(shí)。
您可以使用JavaScript以編程方式測(cè)試以查看應(yīng)用程序是否具有更新的緩存清單文件。由于緩存清單文件在腳本附加事件偵聽器以測(cè)試更新之前可能已更新,因此腳本應(yīng)始終測(cè)試window.applicationCache.status
。
function onUpdateReady() { console.log('found new version!');}window.applicationCache.addEventListener('updateready', onUpdateReady);if(window.applicationCache.status === window.applicationCache.UPDATEREADY) { onUpdateReady();}
要手動(dòng)開始測(cè)試新清單文件,可以使用window.applicationCache.update()
。
永遠(yuǎn)不要使用傳統(tǒng)的GET參數(shù)來(lái)訪問(wèn)緩存的文件(如other-cached-page.html?parameterName=value
)。這將使瀏覽器繞過(guò)緩存并嘗試從網(wǎng)絡(luò)獲取它。要鏈接到具有JavaScript解析參數(shù)的緩存資源,請(qǐng)?jiān)阪溄拥纳⒘胁糠质褂脜?shù),例如other-cached-page.html#whatever?parameterName=value
。
當(dāng)緩存應(yīng)用程序時(shí),僅更新網(wǎng)頁(yè)中使用的資源(文件)不足以更新已緩存的文件。您必須在瀏覽器檢索并使用更新的文件之前更新緩存清單文件本身。window.applicationCache.swapCache()
盡管已經(jīng)加載的資源不會(huì)受到影響,但您可以通過(guò)編程方式使用此功能。為了確保從新版本的應(yīng)用程序緩存中加載資源,刷新頁(yè)面非常理想。
在您的Web服務(wù)器上設(shè)置過(guò)期標(biāo)題*.appcache
以便立即過(guò)期的文件是個(gè)好主意。這樣可以避免緩存清單文件的風(fēng)險(xiǎn)。例如,在Apache中,您可以指定如下配置: ExpiresByType text/cache-manifest "access plus 0 seconds"
Feature | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Basic support | 4.0 | (Yes) | 3.5 (1.9.1)1 | 10.0 | 10.6 | 4.0 |
Feature | Android | Edge | Firefox Mobile (Gecko) | Firefox OS | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|---|
Basic support | 2.1 | (Yes) | (Yes) | 1.0.12 | 11.03 | 11.0 | 3.2 |