流星如何更新浏览器?

Posted

技术标签:

【中文标题】流星如何更新浏览器?【英文标题】:How does meteor update the browser? 【发布时间】:2012-04-11 09:41:21 【问题描述】:

看过 Meteor Framework screencast。我注意到更改数据库会无缝更改浏览器中的数据。通常 AJAX 只是每隔几秒钟重新加载页面的一部分,但在这里我没有注意到浏览器重新加载。他们是如何在 Meteor 中做到这一点的?是否依赖 Node.js?

更新:Toby Catlin 提出了另一个有趣的问题。 Meteor 如何处理不同的浏览器?

【问题讨论】:

另见hot code pushes 【参考方案1】:

他们同时使用 SessionMeteor.autosubscribe(来自 Meteor API)来确保更改反映在客户端上。

这些 Meteor API 使用 SockJS 的 XHR (XMLHttpRequest)。 SockJS 是 WebSocket 仿真实用程序。因此,当服务器发生变化时,SockJS 会确保发送 XHR,并且变化的数据在 JSON 响应中。

是的,Meteor 完全依赖于 Node.js。来自 Meteor 文档:

Meteor 应用程序是在客户端 Web 浏览器中运行的 javascript、在 Node.js 容器内的 Meteor 服务器上运行的 JavaScript 以及所有支持的 html 片段、CSS 规则和静态资产的混合体。 Meteor 使这些不同组件的包装和传输自动化。而且,您可以非常灵活地选择如何在文件树中构建这些组件。

唯一的服务器资产是 JavaScript。 Meteor 收集所有 JavaScript 文件,不包括客户端和公共子目录下的任何内容,并将它们加载到纤程内的 Node.js 服务器实例中。在 Meteor 中,您的服务器代码在每个请求中运行在一个线程中,而不是以 Node.js 典型的异步回调样式。我们发现线性执行模型更适合 Meteor 应用程序中的典型服务器代码。

来源:http://docs.meteor.com/ 和 https://github.com/meteor/meteor

【讨论】:

【参考方案2】:

有一些技术可以让服务器在浏览器不需要请求的情况下将数据推送到浏览器中。这种技术的术语是Comet [wikipedia.org],大多数技术都与 AJAX 相关(有一种叫做 Comet 的漂白剂和一种叫做 Ajax 的清洁产品)。有许多连接类型:长轮询、流式 XHR、永远帧、服务器发送事件和 websocket。 Socket.IO 是一个很好的库,它为流服务器提供连接类型。

您确实需要支持 Comet 连接的服务器。你可以用谷歌搜索当前的,但我不知道:node.js、tornado、cometd、orbited、Jetty streaming

我猜 Metor 会根据浏览器的功能使用不同的连接类型,例如 Chrome 的 websocket 和 IE 的长轮询。如果有人可以给出更具体的答案,我会很感兴趣

【讨论】:

使用 WebSockets 你不需要浏览器请求数据,因为浏览器和服务器之间建立了持续的连接。只要客户端连接,服务器就能够向客户端发送数据。 如果它使用套接字 IO,我相信它会退回到旧浏览器的长轮询。对于新的,它将打开一个 webSocket Comet 现在被 W3C 称为服务器发送事件 (SSE)。见:***.com/questions/1964494/…

以上是关于流星如何更新浏览器?的主要内容,如果未能解决你的问题,请参考以下文章

流星自动将地理位置保存到用户文档

在现有状态转换期间无法更新

流星订阅不更新集合的排序顺序

流星:mongodb更新不起作用

在更新流星模板后运行函数

Meteor 版本求解器:为啥“流星更新”会降级软件包?