繁体   English   中英

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

[英]Disallow barrel file imports within the same library in Nrwl Nx

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

/apps
  /myApp

/libs
  /myLib
    /components
       /my.component.ts
       /other.component.ts
    /index.ts

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

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

"paths": {
   "@myNs/my-lib": ["libs/myLib/index.ts"]
}

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

// index.ts
export { MyComponent } from './components/my.component';

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

当我想里面的东西AUTOIMPORT出现一个现实的问题myLib (这些进口应该是相对的,不是@myNs/my-lib ) -根据逻辑和这篇文章( [有趣的文章,在这里] ):

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

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

如果一个模块从它自己的桶文件中导入一些东西,它几乎总是会导致循环引用错误。 因此,从模块内部导入应该使用相对路径导入。

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

"rules": {
   "import-blacklist": [true, "@myNs/my-lib"]
}

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

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

import { MyComponent } from './my.component'; // the correct way
import { MyComponent } from '.'; // not the best, but also the correct way
import { MyComponent } from '..'; // using barrel file - not correct (look at the citation above), but still successfuly validated by TSLint

问题:

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

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

在 IntelliJ 下的 Editor > Code Style > Typescript 中设置名为“使用来自 tsconfig.json 的路径映射”设置为“仅在指定路径之外的文件中”

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

没有人回答,所以我决定创建一个简单的TSLint规则来处理这种情况: import-blacklist-extended

规则在Nrwl monorepo 中Nrwl良好,但它可以优化并且某些机制可以更好地解决。 如果您需要任何更改,请随时在 Github 上创建问题和 PR。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM