html - 编写脱机工作的应用程序(Web 应用程序)

标签 html web-applications offline

在编写离线和在线工作的应用程序时,是否最好编写一次离线工作,在线模式与离线模式一样工作?

例如,我们有一个典型的购物车示例。购物车包含商品和客户。

加载购物车后,我是否应该将所有商品和客户缓存在本地存储中,并将该数据缓存用于在线和离线,并根据需要更新缓存?开发离线/在线混合网络应用程序时有哪些最佳实践?

最佳答案

编写一个在线/离线模式下工作的网络应用程序真的非常像编写任何“普通”服务器驱动的网络应用程序,除了你有一个位于你的应用程序之间的数据访问层 (DAL)以及存在于服务器(在线模式)或浏览器数据(离线模式)上的数据。

根据应用程序及其需要,您可以以两种模式之一运行:a.) 缓存并尝试你最好的模式或 b.) 加载所有内容并检查更新模式。

这两种模式中的每一种都有好的和坏的部分,你绝对可以让你的应用程序的不同部分以一种或另一种方式倾斜。

缓存并尝试最佳模式

对于这种模式,DAL 在正常操作过程中访问数据时,会将来自服务器的数据缓存到浏览器的数据存储中。一旦处于离线模式,DAL 会尽力满足用户的请求,但它只有缓存数据可以使用,因此某些操作可能无法完成(或至少不能立即完成)。从好的方面来说,等待数据加载的启动时间最短,但在不利的方面,每个操作都需要服务器命中(如果已连接)并且必须缓存数据。对于由于数据不完整而无法完成的任何操作,该应用还必须优雅地失败。

加载所有内容并检查更新模式

在这种情况下,DAL 在应用启动时将应用所需的所有数据加载到浏览器中。如果应用程序已经加载,则必须更新所有数据以确保缓存不会过时。从好的方面来说,用户不必等待很长时间就可以做事,因为一切都是本地操作,但从另一方面来说,如果有很多数据,启动时间可能会很长相当长。

无论哪种情况,您都必须解决陈旧的缓存问题,以及持续对服务器进行离线操作的问题。这意味着在启动时,并且可能在应用程序运行时定期,您将需要同步回服务器以保持缓存数据最新,并与服务器共享您可能拥有的任何仅本地状态,以便世界其他地方可以看到来自该应用程序实例的更新。

当与该操作相关的数据在应用程序更新之间发生变化时,将应用程序处于离线模式时发生的操作持久保存到服务器可能会特别棘手。例如,如果缓存的银行余额已过时并且指示的金额比服务器反射(reflect)的“真实”状态多得多,则用户可能会在不知情的情况下 overdraw 帐户。这是一个极端的例子,但需要有这种操作碰撞检测来处理可能相互碰撞的更新。

一般来说,如果您有一个可以同时在线和离线的应用程序,请编写应用程序,以便应用程序本身不需要关心。较低级别的数据层抽象出所有问题,您的应用程序只需要知道如何处理无法获取所需信息的问题(任何好的在线或离线应用程序都应该这样做)。

对于购物车,您可能(或希望?)拥有的产品比任何单个客户可能放入购物车的产品都多。将所有这些都加载到每个人的浏览器中几乎肯定是对带宽的巨大浪费,并且会给您的用户造成如此大的延迟,以至于大量的带宽成本和销售损失(由于响应时间慢)会很快使任何业务陷入困境。根据需要将产品加载到浏览器数据中,如果需要,您可以加载与购物车中实际商品相关联的“其他用户也购买”的其他产品。

关于html - 编写脱机工作的应用程序(Web 应用程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5842837/

相关文章:

iphone - 我应该购买一台 Mac 来开发或测试我的 iPhone Web 应用程序吗?

mysql - 如何使用 "sync"/revision-control 整个 mysql 数据库以及所有 git 提交和 checkout ?

android - 离线 map 包含在 .apk 文件中

Django Compressor 离线继承

php - 循环结果以插入具有复杂性的新 div

javascript - 在输入字段输入/选择值时自动隐藏/显示元素(不使用 keyup() 或单击)

azure - 从 .NET Core 1.1.1 升级到 .NET Core 1.1.2 后,Azure 上的 ASP.NET Core 网站无法启动并出现 502.5 错误

html - 需要一种方法让用户在离线时输入数据并在重新在线时重新提交

javascript - 我可以在不丢失 LI 内容的情况下刷新此页面吗?

javascript - JavaScript 中的数字递增