在JS模块之间进行数据封送的好模式是什么?

What is a good pattern for data marshaling between JS modules?

本文关键字:模式 是什么 数据 模块 JS 之间      更新时间:2023-09-26

这个问题是关于在服务器上使用JS模块构建数据对象以供另一个模块使用的最佳实践。

我们有许多web应用程序模块,如登录视图,表单处理程序,包含不同的数据片段,如用户状态,应用程序状态等,我们需要将其发送到需要特定对象格式的分析套件。我们应该在哪里映射数据?(选择我们想要发送的东西,重命名键,删除不需要的值。)

  1. 在每个模块中。例如:Login了解分析及其格式要求。
  2. 在分析模块。现在分析人员必须知道关于每个模块的源格式。
  3. 在单独的[模块]-分析模块。然后我们就会有一打没有太多上下文的文件需要调试和理解。

我的团队在设计上存在分歧。我很好奇在这个问题上是否有权威的声音可以帮助我们解决这个问题。

提前感谢!

例如,

var objectForAnalytics = { 
  logged_in: user.get('isLoggedIn'), 
  app_context: application.get('environment') 
}; 
analytics.send(objectForAnalytics);

这个简短的示例脚本使用了来自3个模块的函数。它应该存在于一个组织良好的应用程序的什么地方?

JS不做传统意义上的封送处理。

由于该语言鼓励鸭子类型并在单个VM中运行所有加载的模块,因此每个模块可以简单地传递数据并让消费者选择他们感兴趣的字段。

从历史上看,封送处理有两个主要目的:
  1. 为另一个模块提供它期望的数据,因为c风格的结构和对象通常不支持额外的数据。
  2. 在两个编译器上构建的两种语言或模块之间传输数据,这可能使用不同的内存布局,调用约定或abi。

JavaScript使用JSON解决了第二个问题,但第一个问题本质上是用字典样式的对象解决的。传递一个有1000个键的对象和传递一个有2个键的对象一样快,所以你可以(经常被鼓励)简单地给消费者你所拥有的,让他们决定他们需要什么。

这在Typescript等语言中得到了进一步加强,其中参数类型的契约只是要求的最小集合。TS允许你传递一个超出这些要求的对象(通过其他字段),而不是仅仅验证你知道消费者在他们的合同中需要什么,并且已经满足了这些要求。

当您确实需要转换对象时,可能是因为两个库使用具有不同键的相同数据,创建具有浅引用的新对象非常容易:

let foo = {
  bar: old.baz,
  baz: old.bin
};

这不会更改或复制底层数据,因此对原始(或副本)的任何更改都会传播到另一个。它不包括原始值,这些值是不可变的,因此不会传播。