我们一直在使用 Dojo 以及在较新的浏览器中提供的存储和离线功能开发一个支持离线的 JavaScript 应用程序。
该应用程序很大,但它似乎从缓存中加载了较大的文件,我可以看到该应用程序确实被缓存了。正在使用应用程序缓存功能,据我和 Chrome 所见,应用程序缓存中没有错误。
然而我们遇到了问题。显然,Dojo 无法加载其语言资源,也无法加载描述我们连接到的服务的 SMD 文件。
这些问题在目标浏览器 webkit-mobile 上非常明显。
有什么想法可能是错的吗?
我们一直在使用 Dojo 以及在较新的浏览器中提供的存储和离线功能开发一个支持离线的 JavaScript 应用程序。
该应用程序很大,但它似乎从缓存中加载了较大的文件,我可以看到该应用程序确实被缓存了。正在使用应用程序缓存功能,据我和 Chrome 所见,应用程序缓存中没有错误。
然而我们遇到了问题。显然,Dojo 无法加载其语言资源,也无法加载描述我们连接到的服务的 SMD 文件。
这些问题在目标浏览器 webkit-mobile 上非常明显。
有什么想法可能是错的吗?
当您使用离线(很可能是移动设备)时,大多数时候您还需要优化构建。您真的不想离线几十个文件。
我认为 XHR 不能离线工作,因此您通过 XHR 加载的任何资源(包括脚本、i18n 包和其他通过 href 触发的动态加载的资源)都应该存储到 localStorage,然后分支以从 loaclStorage 加载离线时的 XHR。
现在,如果您在 iPhone、iPad 或 Android 设备上运行,您确实需要进行优化构建。还可以考虑使用 Closure Compiler 来进一步优化您的构建。请参阅下面的链接。
问题是 dojo 做了一些初始化 XHR 请求。它上线以获取其本地化包和 RPC 功能的任何 .smd 文件。
XHR 无法访问离线 applicationCache,即使 bundle 和 smd 文件在那里可用,当 Dojo 请求它们时也不会找到它们。
另一种方法是将它们留在清单文件之外,但这意味着 dojo 无论如何都不会脱机启动。
我们通过将位于 .smd 文件中的服务规范对象直接添加到 dojo.rpc.Service 的构造函数来解决 .smd 文件的问题。这意味着道场拥有所需的一切,不再需要获取它。
本地化包是不同的。最后,我确保将它们附加到 dojo.js 的末尾,让 dojo.provide 语句处理其余部分。本质上,我修改了构建脚本(对我们来说是一个 bat 文件),以便在构建后将压缩的本地化包放在 dojo.js 的末尾。
现在dojo可以离线启动了。
您是否将清单文件用于 HTML5应用程序缓存?如果是这样,您需要明确列出要缓存的文件和目录。与所有其他资源一样,您构建的本地化包必须在您的清单中进行说明,无论是在 CACHE 部分还是在 NETWORK 部分