在 nx 库中,为啥通过公共 API 强制执行模块边界?

Posted

技术标签:

【中文标题】在 nx 库中,为啥通过公共 API 强制执行模块边界?【英文标题】:in nx libs, why are module boundaries enforced through public APIs?在 nx 库中,为什么通过公共 API 强制执行模块边界? 【发布时间】:2021-07-08 01:02:08 【问题描述】:

在典型的 NX 存储库中,libs 通过从 index.js 导出的内容公开公共 API。我可以理解为什么这很有用(特别是如果想将库发布到 npm 或有一个明确定义的公共 api 供消费)。但是,还有其他我没有看到的好处吗?

如果不需要上面列出的好处,那么我是否有理由不能直接从库中导入文件/方法/变量,而不必通过index.js 公开它们?

// typical convention in nx
import  Foo  from '@company/fooLib';

// tsconfig would look something like this
"paths": 
  "@company/fooLib": ["libs/fooLib/src/index.js"],
,

vs.

// import from file directly
import  Foo  from '@company/fooLib/Foo';

// tsconfig would look something like this
"paths": 
  "@company/fooLib/*": ["libs/fooLib/src/*"],
,

【问题讨论】:

【参考方案1】:

通常您使用 index.ts 来定义您的库中哪些是公共的,哪些是私有的。所有公开的东西都不应包含重大更改。这意味着你可以在你的库中做任何你想做的事情,只要你确保所有公共的东西都是向下兼容的。

如果您无法控制从您的库中导入哪些其他库,则每次更改都可能破坏其他库的功能,并且您不知道在您的库之外使用了什么。这是只使用 index.ts 的主要原因。

在你的库内部你只使用相对导入,但是来自外部的所有东西都应该只使用映射的 ts 路径。

一般来说,如果多个团队在一个 monorepo 中一起工作,并且库对特定团队拥有代码所有权,这很重要。即使你只是作为一个团队工作,重构和移动库也更容易,因为它们是松散耦合的,你可以看到哪些东西在你的库之外使用,只有那些需要考虑。

【讨论】:

以上是关于在 nx 库中,为啥通过公共 API 强制执行模块边界?的主要内容,如果未能解决你的问题,请参考以下文章

Etcd 读请求如何执行

在 C++ 中,为啥语言不强制对类/结构的公共、私有和受保护成员进行分组?

scss 样式未在 nx 角度工作区库中应用

JAVA 中强制执行一个类的方法

尝试调用外部 VBA 函数时,只能强制在公共对象模块中定义的用户定义类型

是否可以在 nx 工作区中使用不同的应用程序作为 git 子模块?