JS模块之间的数据编组有什么好的模式?

时间:2015-09-01 18:15:13

标签: javascript user-interface design-patterns architecture

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

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

  1. 在每个模块中。例如:登录了解分析及其格式 要求。
  2. 在分析模块中。现在分析必须知道 关于每个模块的源格式。
  3. 在单独的[module] -analytics模块中。然后我们会有十几个没有太多上下文来调试和理解的文件。
  4. 我的团队分为正确设计。我很好奇是否有一些权威话题可以帮助我们解决这个问题。

    提前致谢!

    例如,

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

    此简短示例脚本使用3个模块中的函数。在一个组织良好的应用程序中它应该存在于哪里?

1 个答案:

答案 0 :(得分:0)

JS在传统意义上没有进行编组。

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

Marshaling历史上有两个主要目的:

  1. 向另一个模块提供它期望的数据,因为C风格的结构和对象(通常)不支持额外的数据。
  2. 在两个编译器上构建的两种语言或模块之间传输数据,这些编译器可能使用不同的内存布局,调用约定或ABI。
  3. JavaScript使用JSON解决了第二个问题,但第一个问题是使用字典样式的对象固有地解决了。传递具有1000个键的对象与具有2个对象的对象一样快,因此您可以(并且经常被鼓励)简单地向消费者提供您拥有的内容并允许他们决定他们需要什么。

    在诸如Typescript之类的语言中进一步强化了这一点,其中参数类型的契约只是最小要求集。 TS允许您传递超过这些要求的对象(通过其他字段),而只是验证您是否知道他们在合同中要求的消费者状态并且已经满足。

    如果您确实需要转换对象,可能是因为两个库使用不同键的相同数据,创建一个带有浅引用的新对象非常简单:

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

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