使用 Yarn 工作区和 Typescript 时导入子目录中的文件

she*_*nan 7 javascript node.js typescript monorepo yarn-workspaces

我在将 Yarn Workspaces monorepo 移植到 TypeScript 时遇到问题。在 monorepo 的先前工作版本中,moduleA可以从moduleB.

新移植的代码尝试同样的事情......

/* monorepo/packages/moduleA/src/helpers/misc.ts */

export const someHelper = () => console.log('hello world')

Run Code Online (Sandbox Code Playgroud)
/* monorepo/packages/moduleB/src/index.ts */

import {someHelper} from 'moduleA/src/helpers/index.js'
Run Code Online (Sandbox Code Playgroud)

这会产生错误:

错误 [ERR_MODULE_NOT_FOUND]:找不到从 monorepo/packages/moduleB/lib/index.js 导入的模块“monorepo/node_modules/moduleA/src/helpers/misc.js”

我的两个包的 TsConfig:

{
  "compilerOptions": {
    "declaration": true,
    "declarationMap": true,
    "sourceMap": true,
    "composite": true,
    "outDir": "lib",
    "rootDir": "src",
    "allowJs": true,
    "esModuleInterop": true,
    "moduleResolution": "node",
    "module": "es6"
  },
  "include": ["src"],
}
Run Code Online (Sandbox Code Playgroud)

并添加了moduleB包的配置:

"references": [
  {
    "path": "../moduleA"
  }
]
Run Code Online (Sandbox Code Playgroud)

请注意,我正在moduleB使用tsc --build.

解决该问题的一种方法是简单地从moduleA模块入口点中的命名导出中导出我需要的所有内容。我不想这样做的原因是因为在从 monorepo 的各个部分构建的相应发行版中可能不需要它们。导入和导出它们moduleA意味着捆绑代码,有时运行不需要运行或由于环境原因不应运行的代码。

另一件需要注意的事情是,如果我monorepo/packages/moduleA/src/helpers/misc.ts.js扩展名而不是打字稿重命名;有用。

我似乎还可以通过将其添加到“compilerOptions”中来更改错误moduleB

"baseUrl": "src",
"paths": {
  "moduleA/helpers/*": ["../moduleA/src/helpers/*"]
},
Run Code Online (Sandbox Code Playgroud)

并将导入语句更改为:

/* monorepo/packages/moduleB/src/index.ts */

import {someHelper} from 'moduleA/helpers/index.js'
Run Code Online (Sandbox Code Playgroud)

但这给了我一个类型定义错误:

src/index.ts:2:28 - 错误 TS2307:找不到模块“moduleA/helpers/misc.js”或其相应的类型声明。

也许上面在 TsConfig 中使用paths不是正确的方法。

总而言之,这里的最终目标是允许从moduleA的子目录导入任何文件以在 中使用moduleB,而无需为此目的发布单独的模块。