可扩展和可修改节点(npm)模块的最佳做法

时间:2019-06-15 11:36:52

标签: javascript node.js typescript design-patterns architecture

我需要经验丰富的javascript(typescript)/ nodejs开发人员的建议。几个月以来,我一直在寻找制作可扩展和可修改节点(npm)模块的最佳实践。

为了更好地理解:在大多数PHP框架(例如Symfony,Laravel,Nette)中,我们都有DI容器,该容器可用于更改或添加对来自包的服务的自己的实现。例如。我有一个购物车包,用于执行计算购物车价格和征税的服务。当我需要更改税收计算时,可以像这样在DI容器上更改实现

services:
      myTaxCalculator:
    class: MyTaxCalculator
      Package\Taxes\CalculatorInterface: ‘@myTaxCalculator’

现在,当程序包与Package \ Taxes \ CalculatorInterface一起使用时,请使用我自己的计算器而不是默认实现。

我正在javascript(typescript)/ nodejs中寻找类似的内容。如果我构建了任何程序包,并且在程序包中,我需要用于计算税金的函数,请使用此const taxCalculator = require('...'),但现在我无法更改此函数的实现。

我当然可以使软件包可配置。添加一些机制来为特定情况设置自定义函数,但是我认为我需要所有在应用程序中使用的类/函数都不需要使用此逻辑,而不必调用require(“ something”)。

重点是使用默认逻辑构建基本和标准软件包,可以在具体应用程序中对其进行修改以解决客户问题,而无需编写具有90%相同代码的新软件包。 我知道存在一些针对javascript(typescript)/ nodejs的IoC / DI实现,例如InversifyJS,但我不确定何时是javascript(typescript)/ nodejs应用程序的最佳方法。 您对此有任何经验吗?您如何解决这些问题?

感谢您的回复!

1 个答案:

答案 0 :(得分:0)

我不会说我是专家或“最佳实践专家”,但我认为三种情况很常见。我不会深入研究Inverseify,因为您已经知道了。

  1. 在入口点类/函数处使用config获取对象。默认为您的实施。
interface TaxCalculator { /* tax related stuff */ }

interface CalculateCartPriceArgs {
  taxCalculator: TaxCalculator,
  // probably lots of other stuff
}

export function calculateCartPrice({
  taxCalculator = defaultTaxCalculator
}: CalculateCartPriceArgs) {
  // implementation
}
  1. 插件/中间件。
  2. 公开内部结构,以允许用户构建自己的版本。