【问题标题】:How does Grails support HTML5 Offline Mode?Grails 如何支持 HTML5 离线模式?
【发布时间】:2014-11-09 01:59:44
【问题描述】:

我正在编写一个 Grails/GSP 应用程序,该应用程序需要在没有网络时离线运行。我阅读了以下关于 HTML5 Offline/AppCache 的文章,内容非常丰富:

总结一下 (tl;dr),我需要在每个页面的 <html> 元素中定义一个 manifest 属性,如下所示:

<html manifest="myapp-cache.manifest">
    ...
</html>

其中myapp-cache.manifest 是“缓存清单”文件的名称,它指定离线/缓存行为,可能如下所示:

CACHE MANIFEST
NETWORK:
    *
CACHE:
index.html
somethingCool.html
myimage.png
myapp.css

这里的问题是,使用 Grails,我将没有要缓存的 HTML 文件。实际上,我可能有一个 index.gspsomethingCool.gsp,但它们代表的是预处理的 HTML并且永远不会作为 HTML 文档存在。而且我无法在缓存清单中指定 GSP,因为 GSP 可以(也不应该)直接从客户端获取。

当我们开始重用 GSP(例如 header.gspfooter.gsp、标签库等)时,事情会变得更加复杂。

所以我问:Grails 是否支持 HTML5 Offline? 如果支持,如何以及以何种能力(文档在哪里)?如果没有,是否有强制 Grails 与离线兼容的方法?还是 Grails 没有这个 HTML5 功能?


更新

也许这可以通过 URL 映射以某种方式完成?例如,也许有一种方法可以让 Grails 将请求从 http://myapp.example.com/fizzbuzz.html 映射到 http://myapp.example.com/fizzbuzz,然后提示 Grails 调用正确的控制器操作,并呈现正确的 GSP?

【问题讨论】:

  • 我可以假设这意味着 Grails 不支持 HTML5 吗?

标签: html grails offline-caching


【解决方案1】:

您的陈述“我将没有要缓存的 HTML 文件”是错误的。 Grails 是一个服务器端框架,尽管您在服务器端使用 GSP、标签库等,但您的客户端(浏览器)看到的只是纯 HTML。

因此,缓存 .gsp 应该非常好,因为所有浏览器都会获取和缓存 Grails 提供的 HTML。不要对扩展感到困惑!离线时,浏览器将从 AppCache 中获取 HTML,就像获取 .html 一样。

AppCache 是一种客户端技术,因此我怀疑是否有任何关于服务器端技术的特定文档,尤其是 Grails,因为它对任何服务器端技术都一样。

@sneeb Grails 可以以您希望的任何格式交付内容,HTML、JSON、XML 等等。因此,Grails 支持任何类型的内容,包括 HTML5。

【讨论】:

  • 感谢@Michael B (+1) - 但我认为您遗漏了一个重要概念:不能从客户端请求 GSP。如果我有一个名为 fizzbuzz.gsp 的 GSP,并且我拨打了 http://myapp.example.com/fizzbuzz.gsp 的电话,我会收到错误消息。这是因为,对于正在运行的应用服务器,GSP 不存在。 Grails 动态地将 URL 转换为 HTML。为了生成这个 HTML,它使用 GSP。但它们不是可获取的资源。这就是为什么我不相信 Grails 可以支持 HTML5 Offline。
  • 离线需要您指定文件名。在服务器端,不存在这样的文件(因为没有 HTML 文件,而且 GSP 不可请求)。
  • 另外@Michael B 请查看我的更新和我的 URL 映射想法。这合理吗?如果是这样,关于我如何实施的任何想法?再次感谢!
  • 无论您从客户端使用什么 URL 来从服务器获取页面,都是您必须放入清单中以使其缓存的 URL。离线时客户端所做的所有事情都是在 appcache 中查找相同的 URL。因此,缓存 host/controller/action 之类的内容应该是完全可以的。如果在 URL 中使用一些扩展名更适合您,您可以按照您的建议去管理 URL 映射(但恕我直言,这并不是真正必要的)。
  • 只是让你知道 - AppCache 有很多陷阱,可能不会永远存在。部分问题请见alistapart.com/article/application-cache-is-a-douchebag
【解决方案2】:

我意识到这是一个老问题,但我想我会提到:您不需要在缓存清单文件中包含每个 html 页面,只要每个页面都包含 manifest 属性。当浏览器看到 manifest 属性时,它足够聪明地缓存当前页面以及 manifest 文件中的所有内容。

我从未尝试过,但我相信这意味着您可以在主模板中包含清单属性,然后使用主模板的每个页面都会与清单文件的内容一起被缓存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多