禁止在 Nrwl Nx 中的同一库中导入桶文件

Nic*_*kon 4 webstorm tslint visual-studio-code angular nrwl

假设我们有一个应用程序和一个库Nrwl Nx

\n\n
/apps\n  /myApp\n\n/libs\n  /myLib\n    /components\n       /my.component.ts\n       /other.component.ts\n    /index.ts\n
Run Code Online (Sandbox Code Playgroud)\n\n

我已经设置了标签nx.jsonnx-enforce-module-boundaries规则来阻止在库中导入应用程序。它有效,这部分很好。

\n\n

我想做的另一件事是强制在库中使用桶文件。所以我创建了一条路径tsconfig.ts

\n\n
"paths": {\n   "@myNs/my-lib": ["libs/myLib/index.ts"]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我遇到了这个问题。假设我们有从 导出的东西index.ts

\n\n
// index.ts\nexport { MyComponent } from \'./components/my.component\';\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,如果我们使用一些自动导入 IDE 功能(例如 fromWebStormVS Code)。他们将MyComponent使用路径导入@myNs/my-lib- 这是预期的,因为我刚刚像这样配置了它。

\n\n

当我想自动导入里面的东西时,一个真正的问题出现了myLib(这些导入应该是相对的,而不是@myNs/my-lib) - 根据逻辑和这篇文章([这里有趣的文章]):

\n\n
\n

永远不要让 lib 从它自己的 Barrel 文件导入

\n\n

特定库中的 TypeScript 模块不应该关心该库公开的功能,因此它不应该在任何时候使用自己的 Barrel 文件。

\n\n

如果模块从其自己的桶文件中导入某些内容,则几乎总是会导致循环引用错误。因此,从模块内部的导入应使用相对路径导入。

\n
\n\n

所以我找到了一种解决方法来阻止 lib 内类似 TS 路径的导入。我在里面添加了一条规则libs/myLib/tslint.json

\n\n
"rules": {\n   "import-blacklist": [true, "@myNs/my-lib"]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

无论如何,它并没有修复自动导入功能,只是不允许在库内使用错误的导入。

\n\n

另一个问题是仍然允许错误的导入。\n假设OtherComponent要导入MyComponent那么有三种可能:

\n\n
/apps\n  /myApp\n\n/libs\n  /myLib\n    /components\n       /my.component.ts\n       /other.component.ts\n    /index.ts\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题:

\n\n
    \n
  1. 如何禁止同一库内导入桶文件?
  2. \n
  3. 如何将 IDE 配置为在 lib 内部具有相对路径,在 ( @myNs/my-lib) 外部具有 TypeScript 路径?
  4. \n
\n

Dav*_*man 6

这是 IntelliJ 中的设置。我在 v2020.1 中看到此功能正常工作。

IntelliJ 中的编辑器 > 代码样式 > Typescript 下的设置名为“使用 tsconfig.json 中的路径映射”设置为“仅在指定路径之外的文件中”

不过,我喜欢 @Nickson 创建的规则,并且认为添加规则以防止错误是个好主意!