【发布时间】:2016-04-26 00:03:25
【问题描述】:
我正在构建一个现在相当大的 nodejs 应用程序。为了避免单一的节点应用程序,我采用了更加模块化的系统的架构路线,将几个组件分解为单独的 npm 模块。这些使用 npm 发布并安装在依赖模块中。我有大约 6 个不同的模块(我想分解更多),现在管理包变得很困难。
问题是:
- 存在嵌套依赖,所以如果我更改模块 A,模块 B 依赖模块 A,模块 C 依赖模块 B,那么当我更新模块时,AI 需要发布它的新版本,这意味着我需要更新它在模块 B 中,这意味着我还需要发布它,然后最后我需要在模块 A 中安装该新版本......你可以看到这可能是一个痛苦的地方。而且所有 package.json 中的版本更新都是手动的,容易出错,每次发布都需要等待。
- 模块可以共享 npm 依赖项,因此在更新包时有时会发生冲突。模块越多,冲突的可能性就越高。
好处是我们有一个非常模块化的系统,其中库可以很容易地重用,并且由于不能有任何循环依赖关系,所以执行的模块层次结构清晰。
可能的解决方案是:
Monolith - 将依赖项作为单个存储库中的单个应用程序进行管理,每个模块都只是成为一个服务。这意味着只需要一次更新,所有模块 api 将保持同步。但是,在代码中引用库可能有点麻烦(因为我相信它们必须相对于本地文件被引用),我不确定如何强制执行模块之间的结构层次结构和代码重用将使用存储库之外的模块会更难。
微服务 - 使每个模块成为微服务。这保留了模块化系统的所有优点,但我担心它会给构建增加很多复杂性,并且管理所有服务本身将成为一项全职工作。
继续 - 找出一种方法来保持当前架构,但消除推送更新等的麻烦。也许脚本来更新版本和收缩包装以确保正确的依赖关系。我认为这既困难又可能导致它成为一个不同种类的单一系统。
选项 1 对我来说似乎是最易于管理的,但如果我不需要,我不想失去模块化结构。
这是一个相当广泛的问题,但任何建议/建议/cmets 都会非常有帮助。
谢谢
【问题讨论】:
-
手动更新 package.json 似乎是个大问题,为什么不简单地做一个“moduleA”:“*”?然后,您可以确保在构建/部署脚本中执行 npm install。假设事情没有中断,在部署之前应该由您的持续集成服务器验证
-
另外,如果您更新了 A 和 B,但希望 C 使用旧版本的 B。您可以使用 npm shrinkwrap。
-
您目前使用的 npm 模块是否需要独立运行?
-
不,它们不需要自己运行,但是在其他项目中使用,例如支持工具
-
@RahatMahbub 感谢您的建议,我们允许对配置进行细微更改,但仍需要重新运行每个构建以合并更新的模块
标签: node.js architecture npm