使用yarn工作区和typescript的项目引用来引用另一个包子目录

时间:2019-04-04 14:45:44

标签: typescript typescript-typings yarnpkg yarn-workspaces

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

  • packages / x-cli
  • packages / x-core

我希望能够像使用import map from 'lodash/map'一样从x-core子目录导入符号,例如:

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';

基于lerna-yarn-workspaces-example:https://github.com/julienfouilhe/example-subdirectory-workspace-typescript-import

,我在Github上做了一个小项目,以准确显示我的设置。

有没有办法做到这一点,我找不到任何有效的方法。我对模块分辨率了解不多,所以我无法确切指出问题所在!

2 个答案:

答案 0 :(得分:1)

在构建时移至根部是可行的,并且避免了工具问题,但是如上所述,这使构建变得复杂,尤其是在工作空间中共享时。 "exports" field node 14是一项重要的更改,最终将使支持子目录的导出更加容易,但目前它只能解决部分问题,因为其他工具似乎还没有遵守该领域。可以使用打字稿的路径解析来解决上述特定错误,可以使用根目录下"baseUrl"文件中的"paths"tsconfig.json选项,然后使用"extends"来{ {3}}。不幸的是,如果lib最终被webpack内置的东西所使用,而您正在使用v4,则需要配置自定义路径解析步骤,因为webpack没有share that config字段。如果可以使用,它似乎确实是webpack 5的一部分。因此,如果您不在lib仓库之外发布lib,则可以解决此问题,而无需使用较新的工具和一些配置工作将所有内容移至根目录。

答案 1 :(得分:0)

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

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

我还没有亲自测试过,但是看起来它可以使用解决此问题

"exports": {
  ".": "./lib"
}