1

这个问题纯粹是基于假设。可能是也可能不是有效的问题。无论如何,它来了

假设我们有一个带有一些 UI 组件/小部件的重型 javascript 客户端应用程序,每个小部件都有一个端点来查询数据

在页面加载时,这些组件将发出 http 请求。多个;到多个不同的端点。

显然,与从服务器端生成 UI 的传统 Web 相比,重型客户端架构的 http 请求数量会增加。

示例案例:

  • 小部件 A 请求资源 A
  • 小部件 B 请求资源 B

当然,我们可以通过以下方式最小化 http 请求:

  • 父小部件请求返回 { 资源 A,资源 B } 的端点
  • 父小部件将数据分发到小部件 A
  • 父小部件将数据分发到小部件 B

这可以通过基于业务逻辑对相关小部件进行分组来完成

并不是所有的都可以这样构图。即使可以,如何维护代码模块化?大型javascript应用程序是否有任何众所周知的设计模式。表现?也许我想多了,因为我当然没有这里的数字。有什么想法吗?

4

3 回答 3

1

对于初学者,我会考虑创建一个客户端 JavaScript 库来处理获取/发送数据并使所有小部件都使用这个 API。

这样,您可以在一个地方优化/分组所有小部件的数据流/来自所有小部件的数据流。

于 2012-12-08T20:00:33.563 回答
0

听起来您想要的是所有数据请求的中央队列。每个小部件自己都可以通过排队特定请求来发出请求。然后,您将拥有一段通用代码,用于检查队列中的所有请求,并确定它们是否可以稍微优化(在一个请求中从同一端点请求多条数据)。

使用这种类型的设计模式仍然保持所有小部件模块化,但有一个小的代码库来处理请求的优化。

从技术上讲,这将如何工作是您将创建一个用于将请求添加到队列的库函数。该函数需要一个端点、一个数据准备就绪时的回调函数以及请求的描述。每个小部件都会调用这个通用函数来发出数据请求。

这个通用函数会将每个请求放入队列中,然后执行setTimeout()0 毫秒(如果尚未设置)。这setTimeout()将在当前执行线程完成时调用,这将是当当前初始化线程的所有请求现在都在队列中时。然后可以检查队列,并且可以将任何对同一端点的请求合并为一个请求并发送该请求。当数据到达时,单独的数据片段被打包出来,并调用适当的小部件的回调。

如果缓存数据会有所帮助(如果随着时间的推移对完全相同的数据发生多个请求),该层也可以实现缓存。

于 2012-12-08T20:16:16.253 回答
0

想到的一个想法(不会减少传输的数据量,但会减少 HTTP 请求的数量)是通过您控制的一些通用 Javascript 接口在客户端路由所有 AJAX 请求。

然后,您可以等待几毫秒并批处理在该时间间隔内发生的所有请求,而不是为每个 UI 请求发送一个 HTTP 请求,只为整个批处理发送一个 HTTP 请求(您必须小心对发送到您的服务器的请求执行此操作)。

在服务器上,您可以有一个特殊的通用“批处理”端点,它在内部为所有批处理请求(最好是并行的)提供服务,并以批处理响应的形式返回结果。

然后客户端将批处理结果分发给原始请求者。

请注意,这仅在请求都花费大致相同的服务时间时才有效;当所有其他请求都已完成时,您不希望批处理响应等待一个子请求完成 30 秒。您也许可以通过黑名单或其他方式解决此问题。

此外,尝试确定哪些请求需要首先得到服务并分配它们的优先级!

于 2012-12-08T20:05:57.277 回答