使用 yarn-workspace,指定包根文件夹以获得更好的导入路径

ben*_*d-g 5 typescript package.json yarn-workspaces

语境

我正在yarn-workspacetypescript.

考虑以下项目结构:

project/
|- package.json
|- packages/
| |- common/
| | |- build/
| | | `- src/
| | |  |- myFile.d.ts
| | |  `- myFile.js
| | |- package.json
| | `- src/
| |  | `- myFile.ts
| |  `- tsconfig.json
| `- app/
|   |- package.json
|   |- src/
|   | `- index.ts
|   `- tsconfig.json
`- yarn.lock
Run Code Online (Sandbox Code Playgroud)
project/
|- package.json
|- packages/
| |- common/
| | |- build/
| | | `- src/
| | |  |- myFile.d.ts
| | |  `- myFile.js
| | |- package.json
| | `- src/
| |  | `- myFile.ts
| |  `- tsconfig.json
| `- app/
|   |- package.json
|   |- src/
|   | `- index.ts
|   `- tsconfig.json
`- yarn.lock
Run Code Online (Sandbox Code Playgroud)

问题

我的问题是,当尝试functionFromCommon从“app”文件夹引用时,我必须编写以下内容:

// packages/common/src/myFile.ts
export function functionFromCommon(): void {
  console.log("Greetings from common");
}
Run Code Online (Sandbox Code Playgroud)

我想要的是找到一种方法,只import {} from "common/myFile"在从其他包中引用它时才写入。

我知道我可以将所有常用包捆绑在一个入口点中,index.js但我想保留文件夹结构,以便编写:

// packages/app/src/index
import { functionFromCommon } from 'common/build/src/myFile';

functionFromCommon();
Run Code Online (Sandbox Code Playgroud)

我试图查看可以在package.json(某种“mainFolder”字段)中指定的内容,但找不到任何内容。

附加信息

供您参考,这些package.json文件如下所示:

import { f1 } from "common/moduleA";
import { f2 } from "common/moduleB";
Run Code Online (Sandbox Code Playgroud)
// root package.json
{
  "name": "project",
  "license": "MIT",
  "workspaces": [
    "packages/*"
  ]
}
Run Code Online (Sandbox Code Playgroud)
// packages/common/package.json
{
  "name": "common",
  "version": "1.0.0",
  "license": "MIT",
  "dependencies": {},
  "devDependencies": {
    "@types/node": "^14.0.4",
    "typescript": "^3.9.3"
  }
}
Run Code Online (Sandbox Code Playgroud)

而且tsconfig.json都是这样的:

// packages/app/package.json
{
  "name": "app",
  "version": "1.0.0",
  "license": "MIT",
  "dependencies": {
    "common": "1.0.0"
  },
  "devDependencies": {
    "@types/node": "^14.0.4",
    "typescript": "^3.9.3"
  }
}
Run Code Online (Sandbox Code Playgroud)

更新:(2020-10-13)

一个所谓的新领域"exports"已经被添加到package.json刚刚定义。在此处查看更多信息:https : //nodejs.org/docs/latest-v12.x/​​api/esm.html#esm_exports_sugar

但它目前不受 Typescript 支持...

通过遵循以下解决方法,我能够获得一个工作版本:https : //github.com/microsoft/TypeScript/issues/33079#issuecomment-702617758