12

我使用纱线工作区并具有以下软件包:

  • 包/x-cli
  • 包/x-core

我希望能够从 x-core 子目录导入符号,就像你做的那样import map from 'lodash/map',例如:

import { fn } from '@mycompany/x-core/test';

但我收到以下错误:

tsc -b packages/x-core packages/x-cli
packages/x-cli/src/main.ts:1:20 - error TS2307: Cannot find module '@mycompany/x-core/test'.

1 import { fn } from "@mycompany/x-core/test";
                     ~~~~~~~~~~~~~~~~~~~~~~~~

error Command failed with exit code 1.

但是,如果它在库的根目录中导出,则此方法有效:

import { otherFn } from '@mycompany/x-core';

我在 Github 上做了一个小项目,以准确展示我的设置,基于 lerna-yarn-workspaces-example:https ://github.com/julienfouilhe/example-subdirectory-workspace-typescript-import

有没有办法做到这一点,我找不到任何有效的方法。我对模块分辨率不太了解,所以我无法准确定位问题!

4

2 回答 2

1

在构建时移至根目录可以工作并避免工具问题,但如前所述,它会使构建复杂化,尤其是在工作空间中共享时。“ exports”字段节点 14是一个重要的变化,它最终应该使支持子目录导出更容易,但现在它只解决了部分问题,因为其他工具似乎还不尊重该字段。提到的特定错误仍然存​​在于 typescript 的路径解析中,可以使用根文件中的"baseUrl"and"paths"选项解决tsconfig.json,然后使用"extends"to share that config。不幸的是,如果 lib 最终被使用 webpack 构建的东西使用并且您使用的是 v4,您将需要配置自定义路径解析步骤,因为 webpack 没有支持“出口”领域。如果您可以使用它,它似乎确实是 webpack 5 的一部分。因此,如果您没有在 mono 存储库之外发布您的库,那么这是可以解决的,而无需使用更新的工具和一些配置工作将所有内容移动到根目录。

于 2020-05-26T17:56:47.137 回答
0

对此更新:使用 Nodejs 14,您可以在 package.json 中指定子路径导出。

https://nodejs.org/api/esm.html#esm_subpath_exports

我没有亲自测试过,但看起来它可以通过使用来解决这个问题

"exports": {
  ".": "./lib"
}
于 2020-05-06T12:59:28.343 回答