58

我目前正在使用所有用于离线支持的 html5 好东西编写离线 webapp。但是,我现在开始考虑编写同步模块,以确保将任何离线数据发送到服务器并将服务器数据发送回客户端。现在我确信这已经完成了,我的意思是它是一个非常经典的设计问题,会影响移动设备和许多其他事情。所以我想知道有人能指点我一些好的设计资源吗?

现在我真的不需要太复杂,我的意思是我不处理访问相同数据的多个用户,我很高兴不合并冲突(只取最新的)但我仍然想要一个设计让我将来有这些选择。

另外,是否有任何开源项目实现了这种类型的东西?我不会抄袭别人的代码(如果许可证允许的话),我很乐意移植。

4

9 回答 9

13

我有一个类似的问题。我决定使用纯 JSON 进出方法。我正在提交表单的解决方案是:

  1. 捕捉表单提交事件
  2. 检查用户是否在线
  3. 如果用户在线,则以普通形式 POST 提交表单
  4. 如果用户离线,则对 JSON 请求进行字符串化并将其存储在本地(我决定使用 Web SQL 数据库)。队列表就是简单的 Uri 和 Payload。

然后我有在线/离线事件的全局事件挂钩。当用户重新上线时,它会检查队列,如果队列中有项目,它就会将它们作为 JSON POST 请求发送出去。

如果您主要对获取JSON 数据并将其缓存以供离线使用感兴趣,请查看jquery.offline

双向同步的挑战是您需要使用已排队的任何 CRUD 工作更新本地缓存列表。

我想找到一种更通用的方法来做到这一点。

于 2011-01-27T06:11:25.357 回答
10

我对类似设计(尚未尝试)的计划是使用PouchDB之类的东西在本地存储数据,然后将其与远程沙发实例同步。

于 2012-02-13T19:37:13.847 回答
7

查看 Derby,这是一个 Node MVC 框架,它具有一些非常好的同步和冲突解决功能。http://derbyjs.com/

于 2012-04-01T10:02:39.053 回答
4

在我们的团队中,我们已经在离线/在线模式下开发了应用程序。

我们正在使用以下库:

使用 rack-offline 我们缓存所有资源文件和 jst 模板以在页面上呈现内容。骨干js 和骨干js-localStorage 有助于在客户端制作MVC 应用程序。它非常棒,你应该试试。我们总是使用本地存储来保存数据。当我们为模型对象创建帖子并保存到本地存储时,我们正在触发同步队列(我们也有计时器后台工作人员用于自动运行同步过程)。对于每个模型,我们都有单独的同步类,应该由队列同步触发器运行。如果您的 navigator.onLine => true 我们正在向服务器发送请求,其中包含要更新的数据。如果您关闭浏览器,无论如何您都不会丢失数据,因为您在 localStorage 中有队列。下次客户端将在第一次加载时使用 navigator.onLine => true 同步数据。

rack-offline的使用方法可以查看我的github中的小项目:

番茄钟应用

祝你好运!

于 2012-02-23T12:43:37.813 回答
2

我遇到了同样的问题,最终使用 XML 文件进行存储,并使用 git 来跟踪更改并在连接可用时自动提交它们。同步是通过 shell 脚本中通常的 git commit / push / pull 命令和启动脚本的 cronjob 完成的。如果您将 JSON 存储在文本文件中,这也将起作用。

于 2011-12-21T12:14:13.377 回答
1

DerbyJS 可能是最好的解决方案。然而,Derby 仍在开发中,离线支持仅在规划中,尚未实施。在 Google 群组 ( http://groups.google.com/group/derbyjs/browse_thread/thread/7e7f4d6d005c219c ) 中,您可以找到有关未来计划的其他信息。

于 2012-04-08T12:50:15.883 回答
1

如果你准备使用可能很重的 Ext JS / Sencha 框架,它有一个很好的数据 API,支持离线(例如 localStorage)和一个代理方法,用于写入本地然后服务器。我使用 Sencha Touch(特定于移动设备)。

要调试 Web 存储,请查看 Weinre。

于 2012-03-16T18:08:38.550 回答
1

我目前正在开发类似的 webapp。我决定制作这样的工作流程:

  1. 表单并没有真正提交 - “提交”按钮实际上将序列化的表单数据保存到 localStorage(在某些队列中)。这样可以避免提交捕获的麻烦,也可以避免编写额外的错误处理代码来处理表单提交期间的断开连接。
  2. 数据保存后触发传输脚本。它检查在线/离线状态。
  3. 在线时,它尝试将最新数据从队列发送到服务器(AJAX 请求),并在成功时将其从队列中删除(并在短暂超时后继续从队列中发送下一个数据)。
  4. 它会在一段时间后重新检查(通过 setTimeout())。
于 2012-03-14T10:50:56.143 回答
1

我个人建议您在 indexedDB API 之上编写一个包装器,以检查您是否在线/离线。

  • 如果离线,只需存储在 indexedDB 中并将所有文档的持久化标志设置为 false
  • 如果在线,获取所有持久化为 false 的文档并将它们存储在 mongodb 或后端的等价物中,然后将新文档存储在 indexedDB 和服务器上,并将持久化标志设置为 true。

我写了一个小

您必须增加隧道以自动设置持久标志,并将这些文档的同步隧道传输到后端

于 2012-04-08T12:56:02.913 回答