在 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 强制执行模块边界?的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 中,为啥语言不强制对类/结构的公共、私有和受保护成员进行分组?