防止模块外部导入,除非通过索引

Hav*_*uit 5 import typescript

是否有一个简单的解决方案(也许是 lint 规则?)可以帮助通过索引文件强制执行干净的代码导入?我想阻止从“表兄弟”文件导入代码,除非它是通过索引文件提供的。

前任:

- app
  + dogs
  | + index.ts  
  | + breeds
  | |  + retriever.ts
  | |  + schnauzer.ts
  | + activities
  |    + playing.ts
  |    + walking.ts
  + cats
    + index.ts
    + breeds
    |  + siamese.ts
    |  + persion.ts
    + activities
       + sleeping.ts
       + hunting.ts  
Run Code Online (Sandbox Code Playgroud)

从以下角度导入cats/activities/hunting.ts

import { sleeping } from './sleeping'       // VALID - inside same folder
import { siamese } from '../breeds/siamese' // VALID - inside cats module
import { playing } from '../../dogs'        // VALID - importing from an index

import { retriever} from '../../dogs/activities/breeds' // INVALID - cousin file outside module possibly not exported from index
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 4

您可以使用 eslint 的import/no-internal-modules规则.eslintrc为每个“根”模块配置单独的规则。

在您的dogs文件夹中,创建一个.eslintrc包含以下内容的新文件:

{
  "rules": {
    "import/no-internal-modules": [ "error", {
      "allow": [ "app/dogs/**", "app/*" ],
    } ]
  }
}
Run Code Online (Sandbox Code Playgroud)

这意味着 dogs 文件夹(或 dogs 的任何子文件夹)中的任何 js/ts 文件都可以从其自己的包任何类似的包导入文件/cats

cats对您的模块和任何其他“根”模块执行相同的操作。