目录
切勿在清单文件中列出清单文件
缓存页面上未缓存的资源不会加载
始终在服务器的 .htaccess 文件中设置应用程序类型清单
避免因找不到文件而丢弃整个清单
即使在线,数据也从 AppCache 加载
服务器上的更改不会发生,直到清单文件更新
清单文件必须与主机来自相同的来源提供服务
相对 URL 相对于清单的 URL
以编程方式检查清单的状态
结论
关于 HTML5 应用程序缓存的常见问题解答 (FAQ)
什么是 HTML5 应用程序缓存,为什么它很重要?
HTML5 应用程序缓存是如何工作的?
使用 HTML5 应用程序缓存时有哪些常见的陷阱?
如何避免这些陷阱?
HTML5 应用程序缓存的未来是什么?
如何创建清单文件?
如何将网页与清单文件关联?
如何更新缓存?
如果清单文件中列出的资源无法下载会发生什么?
我可以将 HTML5 应用程序缓存用于所有资源吗?
首页 web前端 js教程 使用HTML5应用程序缓存时,常见的陷阱要避免

使用HTML5应用程序缓存时,常见的陷阱要避免

Feb 20, 2025 am 10:05 AM

Common Pitfalls to Avoid when using HTML5 Application Cache

关键要点

  • 切勿将清单文件包含在应用程序缓存清单中,这会造成循环,几乎无法通知您的网站有新的缓存文件可用。
  • 始终在服务器的 .htaccess 文件中设置应用程序类型清单,以确保 AppCache 正确运行。如果未设置媒体类型,AppCache 将无法工作。
  • 请注意,如果清单文件中指定的单个文件都找不到或无法下载,则整个清单文件将被丢弃。这是 AppCache 的一种特殊行为。
  • 更新网站后,始终更新清单文件,否则用户将看不到更改,只会看到以前缓存的数据。您可以在清单文件中注释中更新版本号或日期,以强制用户的 Web 浏览器下载清单文件的新版本。

HTML5 应用程序缓存(也称为 AppCache)近来成为 Web 开发人员关注的热点话题。AppCache 使您可以允许网站访问者在离线时浏览您的网站。您甚至可以将网站的部分内容(例如图像、样式表或 Web 字体)存储在用户计算机上的缓存中。这可以帮助您的网站加载速度更快,从而减少服务器的负载。

要使用 AppCache,您可以创建一个扩展名为“appcache”的清单文件,例如:manifest.appcache。在此文件中,您可以列出要缓存的所有文件。要在您的站点上启用它,您必须在 html 元素的网页上包含对该清单文件的引用,如下所示:

<html lang="en" manifest="manifest.appcache">
登录后复制
登录后复制
登录后复制

这是一个示例清单文件:

<code>CACHE MANIFEST
# 2015-01-23 v0.1
/style.css
/logo.gif
/script.js

NETWORK:
*

FALLBACK:
/server/ /fallback.html</code>
登录后复制
登录后复制
登录后复制

除了 AppCache 的好处之外,还有一些常见的陷阱应该避免,以防止破坏用户体验并破坏您的应用程序。

切勿在清单文件中列出清单文件

如果您在应用程序缓存清单中包含清单文件本身,它会陷入某种循环,几乎无法通知您的网站有新的缓存文件可用,并且它应该下载并使用新的清单文件而不是旧的清单文件。因此,务必小心不要犯以下错误:

<code>CACHE MANIFEST
# 2015-01-23 v0.1

manifest.appcache
page2.css</code>
登录后复制
登录后复制
登录后复制

缓存页面上未缓存的资源不会加载

这是第一次使用 AppCache 时非常常见的错误。这就是清单文件中的 NETWORK 标志发挥作用的地方。清单文件的 NETWORK 部分指定 Web 应用程序需要在线访问的资源。

在 NETWORK 标志下指定的 URL 基本上是“白名单”,也就是说,在此标志下指定的文 件在有互联网连接时始终从服务器加载。例如,以下代码片段确保对加载包含在 /api/ 子树中的资源的请求始终从网络加载,而不是从缓存加载。

<html lang="en" manifest="manifest.appcache">
登录后复制
登录后复制
登录后复制

始终在服务器的 .htaccess 文件中设置应用程序类型清单

清单文件应始终在正确的媒体类型 text/cache-manifest 下提供服务。如果未设置媒体类型,则 AppCache 将无法工作。

它应始终在生产服务器的 .htaccess 文件中配置。大多数讲解 AppCache 的教程中都提到了这一点,但在将 Web 应用程序从开发服务器迁移到生产服务器时,许多开发人员都会忽略这一点。

在 Apache 的 .htaccess 文件中输入以下内容:

<code>CACHE MANIFEST
# 2015-01-23 v0.1
/style.css
/logo.gif
/script.js

NETWORK:
*

FALLBACK:
/server/ /fallback.html</code>
登录后复制
登录后复制
登录后复制

如果您将应用程序上传到 Google App Engine,则可以通过将以下代码段添加到 app.yaml 文件中来完成相同的任务:

<code>CACHE MANIFEST
# 2015-01-23 v0.1

manifest.appcache
page2.css</code>
登录后复制
登录后复制
登录后复制

避免因找不到文件而丢弃整个清单

如果清单文件中指定的单个文件都找不到或无法下载,则整个清单文件将被丢弃。这是 AppCache 的一种奇怪的行为,在设计使用 AppCache 的 Web 应用程序时应牢记这一点。

例如:

<code>NETWORK:

/api</code>
登录后复制
登录后复制

如果删除了 logo.gif,AppCache 将无法找到已删除的图像文件,因此清单文件中的任何内容都不会执行。

即使在线,数据也从 AppCache 加载

一旦您的 Web 浏览器保存了缓存清单文件,即使用户已连接到互联网,文件也会从缓存清单本身加载。此功能有助于提高网站的加载速度,并有助于减少服务器负载。

服务器上的更改不会发生,直到清单文件更新

由于您从前一点知道即使用户在线,数据也会从 AppCache 加载,因此对网站或服务器中文件的更改不会发生,直到清单文件更新。

更新网站后,您始终必须更新清单文件,否则您的用户将永远无法看到更改,他们只会看到以前缓存的数据。您可以在清单文件中注释中更新版本号或日期,以强制用户的 Web 浏览器下载清单文件的新版本。例如,如果在对网站进行更改之前,以下是您使用的清单文件:

<code>AddType text/cache-manifest .manifest</code>
登录后复制

它可以更改为类似于以下代码块的内容,以便用户的浏览器可以下载清单文件的新副本。

<code>- url: /public_html/(.*\.appcache)
  static_files: public_html/
  mime_type: text/cache-manifest
  upload: public_html/(.*\.appcache)</code>
登录后复制

请注意,以 # 开头的行是不会执行的注释行。

清单文件必须与主机来自相同的来源提供服务

尽管清单文件可以保存对要从其他域缓存的资源的引用,但它应从与主机页面相同的来源提供给 Web 浏览器。如果不是这种情况,则清单文件将无法加载。例如,以下清单文件是正确的:

<code>CACHE MANIFEST
# 2015-01-23 v0.1
/style.css
/logo.gif
/script.js</code>
登录后复制

在这里,我们指定了要存储在用户浏览器缓存中的内容,该内容是从另一个域引用的,这完全没问题。

相对 URL 相对于清单的 URL

需要注意的一件重要事情是,您在清单中提到的相对 URL 相对于清单文件,而不是相对于您引用清单文件的文档。如果清单和引用不在同一路径中,则资源将无法加载,进而清单文件将无法加载。

如果您的应用程序结构如下所示:

<html lang="en" manifest="manifest.appcache">
登录后复制
登录后复制
登录后复制

那么您的清单文件应如下所示:

<code>CACHE MANIFEST
# 2015-01-23 v0.1
/style.css
/logo.gif
/script.js

NETWORK:
*

FALLBACK:
/server/ /fallback.html</code>
登录后复制
登录后复制
登录后复制

以编程方式检查清单的状态

您可以通过测试 window.applicationCache.status 以编程方式检查您的应用程序是否正在使用缓存清单的更新版本。这是一些示例代码:

<code>CACHE MANIFEST
# 2015-01-23 v0.1

manifest.appcache
page2.css</code>
登录后复制
登录后复制
登录后复制

在网站上运行上述代码可以让你知道何时有 AppCache 清单的新更新可用。请注意,UPDATEREADY 是一个已定义的状态。您甚至可以在 onUpdateReady() 函数中使用 swapCache() 方法来将旧的清单文件替换为新的清单文件:

<code>NETWORK:

/api</code>
登录后复制
登录后复制

结论

AppCache 是一项有用的技术,但正如我们所看到的,在项目中实现它时应谨慎。开发人员应选择性地选择应在清单文件中包含的内容。理想情况下,清单文件应包含静态内容,例如样式表、脚本、Web 字体和图像。但是,您始终是对清单文件中包含哪些内容的最佳判断者。Appcache 是一把双刃剑,因此在使用它时要小心!

上述内容中的大部分内容已在其他地方介绍过,还有一些其他要点。您可以查看以下资源以了解更多信息:

  • MDN 上的应用程序缓存陷阱
  • Jake Archibald 的应用程序缓存是个混蛋
  • Jake Archibald 的离线食谱

关于 HTML5 应用程序缓存的常见问题解答 (FAQ)

什么是 HTML5 应用程序缓存,为什么它很重要?

HTML5 应用程序缓存 (AppCache) 是一项允许开发人员指定浏览器应缓存哪些文件并使其可供用户离线使用的功能。它之所以重要,是因为它可以通过减少服务器负载和节省带宽来提高 Web 应用程序的性能。它还允许应用程序即使在用户离线时也能运行,从而提供更好的用户体验。

HTML5 应用程序缓存是如何工作的?

HTML5 应用程序缓存的工作原理是使用清单文件。此文件列出了浏览器应缓存以供离线使用的资源。当用户访问网页时,浏览器会检查是否与其关联了清单文件。如果是,浏览器将下载并存储列出的资源。下次用户访问网页时,浏览器将加载缓存的资源,而不是从服务器下载它们。

使用 HTML5 应用程序缓存时有哪些常见的陷阱?

使用 HTML5 应用程序缓存时,一些常见的陷阱包括:未正确更新清单文件,导致提供旧资源;未正确处理缓存清单回退部分,导致错误;以及未考虑缓存对用户设备存储的影响。

如何避免这些陷阱?

为避免这些陷阱,请在资源更改时始终正确更新清单文件。使用清单文件的 NETWORK 部分指定永远不应该缓存的资源。此外,请考虑用户的设备存储,并且只缓存必要的资源。

HTML5 应用程序缓存的未来是什么?

HTML5 应用程序缓存正在被弃用,取而代之的是 Service Workers。Service Workers 提供对缓存的更多控制,并且可以处理更复杂的场景。但是,目前并非所有浏览器都支持 Service Workers,因此了解和使用 HTML5 应用程序缓存仍然很重要。

如何创建清单文件?

清单文件是一个简单的文本文件,其中列出了要缓存的资源。它应该以 MIME 类型“text/cache-manifest”提供服务。文件的首行应为“CACHE MANIFEST”,后跟要缓存的资源。

如何将网页与清单文件关联?

要将网页与清单文件关联,请将“manifest”属性添加到网页的“html”标记中。 “manifest”属性的值应为清单文件的 URL。

如何更新缓存?

要更新缓存,请对清单文件进行更改。每次用户访问网页时,浏览器都会检查清单文件的更新。如果清单文件已更改,浏览器将下载并缓存新资源。

如果清单文件中列出的资源无法下载会发生什么?

如果清单文件中列出的资源无法下载,则整个缓存更新过程将失败。浏览器将继续使用旧缓存。

我可以将 HTML5 应用程序缓存用于所有资源吗?

虽然从技术上讲您可以将 HTML5 应用程序缓存用于所有资源,但不建议这样做。缓存过多的资源可能会填满用户的设备存储并对性能产生负面影响。最好只缓存必要的资源。

以上是使用HTML5应用程序缓存时,常见的陷阱要避免的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

前端热敏纸小票打印遇到乱码问题怎么办? 前端热敏纸小票打印遇到乱码问题怎么办? Apr 04, 2025 pm 02:42 PM

前端热敏纸小票打印的常见问题与解决方案在前端开发中,小票打印是一个常见的需求。然而,很多开发者在实...

神秘的JavaScript:它的作用以及为什么重要 神秘的JavaScript:它的作用以及为什么重要 Apr 09, 2025 am 12:07 AM

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

谁得到更多的Python或JavaScript? 谁得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? 如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

JavaScript难以学习吗? JavaScript难以学习吗? Apr 03, 2025 am 12:20 AM

学习JavaScript不难,但有挑战。1)理解基础概念如变量、数据类型、函数等。2)掌握异步编程,通过事件循环实现。3)使用DOM操作和Promise处理异步请求。4)避免常见错误,使用调试技巧。5)优化性能,遵循最佳实践。

如何实现视差滚动和元素动画效果,像资生堂官网那样?
或者:
怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? 如何实现视差滚动和元素动画效果,像资生堂官网那样? 或者: 怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? Apr 04, 2025 pm 05:36 PM

实现视差滚动和元素动画效果的探讨本文将探讨如何实现类似资生堂官网(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的演变:当前的趋势和未来前景 JavaScript的演变:当前的趋势和未来前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

console.log输出结果差异:两次调用为何不同? console.log输出结果差异:两次调用为何不同? Apr 04, 2025 pm 05:12 PM

深入探讨console.log输出差异的根源本文将分析一段代码中console.log函数输出结果的差异,并解释其背后的原因。�...

See all articles