--- title: Использование кэширования приложений slug: Web/HTML/Использование_кэширования_приложений translation_of: Web/HTML/Using_the_application_cache ---
HTML5 предоставляет механизм кэширования приложения, позволяющий веб-приложениям работать в автономном режиме. Разработчики теперь могут использовать интерфейс Кэша приложения (AppCache), сообщая браузеру, какие из ресурсов браузеру следует закэшировать и сделать доступными в режиме оффлайн. Закэшированные приложения загружаются и работают корректно, даже если пользователь обновляет страницу в тот момент, когда он отключён от сети.
Использование механизма кэширования даёт следующие преимущества:
Для включения механизма кэширования приложения вам необходимо включить атрибут {{htmlattrxref("manifest", "html")}} в элемент {{HTMLElement("html")}} на странице вашего приложения, как показано примере ниже:
Атрибут manifest
ссылается на файл манифеста кэша, который является текстовым файлом и содержит список ресурсов (файлов), которые браузеру следует закэшировать для вашего приложения.
Вам следует включить атрибут manifest
в каждую страницу вашего приложения, внутри которой вы хотели бы осуществлять кэширование. Браузер не закэширует страницы, не содержащие атрибута manifest
, пока такие страницы не будут явно указаны в файле манифеста. Вам не обязательно перечислять все страницы, которые вы хотите закэшировать, в файле манифеста, т.к. браузер неявно добавляет в кэш приложения каждую посещаемую пользователем страницу, где есть атрибут manifest
.
Некоторые браузеры (например, Firefox) показывают панель уведомлений , когда пользователь загружает использующее кэш приложение в первый раз. Панель уведомлений может показывать примерно такое сообщение::
Этот веб-сайт (www.example.com
) запрашивает у вас разрешение на хранение данных для автономной работы на вашем компьютере. [Разрешить] [Никогда для этого сайта] [Не сейчас]
Термин "оффлайн(-доступные) приложения" иногда относится конкретно к приложениям, которым пользователь разрешил использовать возможности работы оффлайн.
Использование кэша приложений изменяет обычный процесс загрузки документа:
Ниже приведено более подробное описание процесса загрузки документов и обновления кэша приложения:
manifest
и кэша приложения не существует, браузер загружает документ, а затем получает все пункты файла манифеста, создавая тем самым первую версию кэша приложения.checking
объекту window.applicationCache
и получает файл манифеста в соответствии с правилами кэширования HTTP.noupdate
объекту applicationCache
, завершая процесс обновления. Обратите внимание, если вы изменили закэшированные ресурсы на стороне сервера, вам также необходимо изменить и файл манифеста, тем самым давая браузеру знать, какие из ресурсов нужно получить повторно.applicationCache.add()
, попадают во временный кэш с учётом правил кэширования HTTP. Во время обновления каждого файла в этом временном кэше браузер посылает событие progress
объекту applicationCache
. Если происходит ошибка, браузер посылает событие error
, а обновление прекращается.applicationCache
посылается событие cached
. Поскольку документ уже был загружен в браузер из кэша, обновлёный документ не перерисуется, пока страница не будет перезагружена (неважно как, вручную или программно).В Chrome оффлайн-кэш можно очистить, выбрав «Очистить историю...» в настройках или перейдя на адрес chrome://appcache-internals/. У Safari также есть похожий пункт «Очистить кэш» в настройках, но для этого также может понадобиться перезапуск браузера.
Firefox хранит данные оффлайн-кэша отдельно от профиля — по соседству с обычным дисковым кэшем:
C:\Users\<пользователь>\AppData\Local\Mozilla\Firefox\Profiles\<соль>.<имя профиля>\OfflineCache
/Users/<пользователь
>/Library/Caches/Firefox/Profiles/<соль
>.<имя профиля
>/OfflineCache
Текущее состояние оффлайн-кэша в Firefox можно посмотреть на странице about:cache
(в разеделе «Offline cache device»). Оффлайн-кэш можно очистить по отдельности для каждого сайта, используя кнопку «Удалить...» в разделе Инструменты -> Настройки -> Дополнительные -> Сеть -> Автономное содержимое.
До Firefox 11 кэш нельзя было очистить ни кнопкой Инструменты -> Удалить недавнюю историю, ни Инструменты -> Настройки -> Дополнительные -> Сеть -> Автономное содержимое -> Очистить сейчас. Сейчас эта проблема устранена.
В Linux настройки оффлайн-кэша можно найти в разделе Инструменты -> Настройки -> Дополнительные -> Сеть -> Автономное содержимое и данные пользователя
См. также очистка данных хранилища DOM.
Также кэши приложения могут устареть. Если с сервера удалить файл манифеста, браузер удалит все кэши, которые были в нём указаны, и пошлёт событие obsoleted
объекту applicationCache
, что установит состояние кэша в OBSOLETE
.
Атрибут manifest
может модержать как относительный путь, так и абсолютный URL (который должен соответствовать принципу единого источника) к файлу манифеста. Файл манифеста кэша может иметь любое расширение, но его MIME- тип должен быть text/cache-manifest
.
AddType text/cache-manifest .appcache
в файл .htaccess в корневой директории или же директории приложения.Манифест кэша представляет собой обычный текстовый файл, содержащий список ресурсов, которые браузеру следует закэшировать для обеспечения автономного доступа. Ресурсы идентифицируются по URI. Объекты, перечисленные в манифесте кэша должны иметь те же протокол, хост и порт, что и сам манифест.
Ниже приведено содержимое простого файла манифеста кэша для воображаемого веб-сайта www.example.com.
CACHE MANIFEST # v1 - 2011-08-13 # Это комментарий. http://www.example.com/index.html http://www.example.com/header.png http://www.example.com/blah/blah
Манифест кэша может включать три секции (CACHE
, NETWORK
и FALLBACK
, которые будут рассмотрены далее). В приведённом примере нет заголовков секций, поэтому предполагается, что все строчки находятся в явной секции CACHE
, подразумевая, что все указанные в них ресурсы браузеру следует сохранить в кэше приложения. Ресурсы могут быть указаны с использованием как абсолютных, так и относительных URL (например, index.html
).
Для наличия в кэше комментария «v1» есть веские основания. Браузер обновляет кэш приложения, только если изменён файл манифеста, хотя бы один байт в нём. Если вы изменяете закэшированный ресурс на стороне сервера, (например, при обновлении содержимого картинки header.png
), вы также должны изменить содержимое файла манифеста, тем самым сообщая браузеру, что нужно обновить кэш. Вы можете изменять файл манифеста так, как вам угодно, но лучшие практики рекомендуют использовать изменение номера пересмотра.
CACHE
, NETWORK
, and FALLBACK
A manifest can have three distinct sections: CACHE
, NETWORK
, and FALLBACK
.
CACHE:
CACHE:
section header (or immediately after the CACHE MANIFEST
line) are explicitly cached after they're downloaded for the first time.NETWORK:
NETWORK:
section header in the cache manifest file are white-listed resources that require a connection to the server. All requests to such resources bypass the cache, even if the user is offline. Wildcards may be used.FALLBACK:
FALLBACK:
section specifies fallback pages the browser should use if a resource is inaccessible. Each entry in this section lists two URIs—the first is the resource, the second is the fallback. Both URIs must be relative and from the same origin as the manifest file. Wildcards may be used.The CACHE
, NETWORK
, and FALLBACK
sections can be listed in any order in a cache manifest file, and each section can appear more than once in a single manifest.
The following is a more complete cache manifest file for the imaginary web site at www.example.com:
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
This example uses NETWORK
and FALLBACK
sections to specify that the network.html
page must always be retrieved from the network, and that the fallback.html
page should be served as a fallback resource (e.g., in case a connection to the server cannot be established).
Cache manifest files must be served with the text/cache-manifest
MIME type. All resources served using this MIME type must follow the syntax for an application cache manifest, as defined in this section.
Cache manifests are UTF-8 format text files, and may optionally include a BOM character. Newlines may be represented by line feed (U+000A
), carriage return (U+000D
), or carriage return and line feed both.
The first line of the cache manifest must consist of the string CACHE MANIFEST
(with a single U+0020
space between the two words), followed by zero or more space or tab characters. Any other text on the line is ignored.
The remainder of the cache manifest must be comprised of zero or more of the following lines:
#
character, followed by zero or more characters of comment text. Comments may only be used on their own lines (after the initial CACHE MANIFEST line), and cannot be appended to other lines. This means that you cannot specify fragment identifiers.
Section header Description CACHE:
Switches to the explicit section of the cache manifest (this is the default section). NETWORK:
Switches to the online whitelist section of the cache manifest. FALLBACK:
Switches to the fallback section of the cache manifest.
:
) in the section name.CACHE:
) section, each line is a valid URI or IRI reference to a resource to cache (no wildcard characters are allowed in this sections). Whitespace is allowed before and after the URI or IRI on each line. In the Fallback section each line is a valid URI or IRI reference to a resource, followed by a fallback resource that is to be served up when a connection with the server cannot be made. In the network section, each line is a valid URI or IRI reference to a resource to fetch from the network (the wildcard character * is allowed in this section).Cache manifest files can switch from section to section at will (each section header can be used more than once), and sections are allowed to be empty.
An application cache always includes at least one resource, identified by URI. All resources fit into one of the following categories:
manifest
attribute.Resource categories are described in greater detail below.
Master entries are any HTML files that include a {{htmlattrxref("manifest","html")}} attribute in their {{HTMLElement("html")}} element. For example, let's say we have the HTML file http://www.example.com/entry.html
, which looks like this:
<html manifest="example.appcache"> <h1>Application Cache Example</h1> </html>
If entry.html
is not listed in the example.appcache
cache manifest file, visiting the entry.html
page causes entry.html
to be added to the application cache as a master entry.
Explicit entries are resources that are explicitly listed in the CACHE
section of a cache manifest file.
The NETWORK
section of a cache manifest file specifies resources for which a web application requires online access. Network entries in an application cache are essentially an "online whitelist"—URIs specified in the NETWORK
section are loaded from the server instead of the cache. This lets the browser's security model protect the user from potential security breaches by limiting access to approved resources.
As an example, you can use network entries to load and execute scripts and other code from the server instead of the cache:
CACHE MANIFEST NETWORK: /api
The cache manifest section listed above ensures that requests to load resources contained in the http://www.example.com/api/
subtree always go to the network without attempting to access the cache.
manifest
attribute set in the html
element) from the manifest file would not have the same result, because master entries will be added—and subsequently served from—the application cache.Fallback entries are used when an attempt to load a resource fails. For example, let's say the cache manifest file http://www.example.com/example.appcache
includes the following content:
CACHE MANIFEST FALLBACK: example/bar/ example.html
Any request to http://www.example.com/example/bar/
or any of its subdirectories and their content cause the browser to issue a network request to attempt to load the requested resource. If the attempt fails, due to either a network failure or a server error of some kind, the browser loads the file example.html
instead.
Each application cache has a state, which indicates the current condition of the cache. Caches that share the same manifest URI share the same cache state, which can be one of the following:
UNCACHED
IDLE
CHECKING
DOWNLOADING
UPDATEREADY
updateready
event, which is fired instead of the cached
event when a new update has been downloaded but not yet activated using the swapCache()
method.OBSOLETE
You can programmatically test to see if an application has an updated cache manifest file, using JavaScript. Since a cache manifest file may have been updated before a script attaches event listeners to test for updates, scripts should always test window.applicationCache.status
.
function onUpdateReady() { alert('found new version!'); } window.applicationCache.addEventListener('updateready', onUpdateReady); if(window.applicationCache.status === window.applicationCache.UPDATEREADY) { onUpdateReady(); }
To manually start testing for a new manifest file, you can use window.applicationCache.update()
.
other-cached-page.html?parameterName=value
). This will make the browser bypass the cache and attempt to get it from network. To link to cached resources that have parameters parsed in JavaScript use parameters in the hash part of the link, such as other-cached-page.html#whatever?parameterName=value
.window.applicationCache.swapCache()
, though resources that have already been loaded will not be affected. To make sure that resources are loaded from a new version of the application cache, refreshing the page is ideal.*.appcache
files to expire immediately. This avoids the risk of caching manifest files. For example, in Apache you can specify such a configuration as follows:ExpiresByType text/cache-manifest "access plus 0 seconds"
{{CompatibilityTable}}
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 4.0 | 3.5 | 10.0 | 10.6 | 4.0 |
Feature | Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Basic support | 2.1 | {{CompatVersionUnknown}} | {{CompatNo}} | 11.0 | 3.2 |
Note: Versions of Firefox prior to 3.5 ignore the NETWORK
and FALLBACK
sections of the cache manifest file.