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

问题描述

在典型的 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/*"],

解决方法

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

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

在您的库内部,您只使用相对导入,但外部的所有内容都应仅使用映射的 ts 路径。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...