将自定义导入路径与多个tsconfig一起使用时找不到模块

时间:2019-06-12 15:01:35

标签: typescript

我有一个包含多个tsconfig.json文件的项目。我想缩短所有导入时间,但是由于某种原因,缩短的导入时间在特定情况下不起作用。

项目结构:

foo/
|  main.ts
|  tsconfig.json
projects/
|  bar/
|    index.ts
tsconfig.json

每当我要编译foo/main.ts时,都会出现以下错误:Cannot find module @bar/shared

一些细节:

projects/bar/index.ts文件仅导出一个普通类:export class Foo {}

foo/main.ts尝试导入Foo类:

import {Foo} from '@bar/shared';

最后但并非最不重要的tsconfig.json中的foo

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "target": "es2015",
    "module": "commonjs",
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "resolveJsonModule": true,
    "lib": ["es6", "dom"],
    "types": [
      "node"
    ],
    "outDir": "../dist/foo"
  }
}

还有根tsconfig.json

{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "module": "es2015",
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "importHelpers": true,
    "target": "es5",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2018",
      "dom"
    ],
    "paths": {
      "@bar/shared": ["projects/bar"]
    }
  }
}

我的IDE完全满意-但我无法编译。

1 个答案:

答案 0 :(得分:0)

简短回答

在您的foo/tsconfig.json文件中,删除baseUrl条目,因为它错误地覆盖了根baseUrl文件中的tsconfig.json条目。

详细信息

baseUrl值是解析非相对模块名称和paths映射条目的基础目录。结果,在解析@bar/shared映射条目时,相对于baseUrl的{​​{1}}搜索了模块解析策略。此外,由于./src是相对路径,因此其完整路径基于其./src文件的位置。因此,路径映射条目解析为/foo/tsconfig.json

所有这些详细信息以及更多信息都可以在the module resolution docs中找到。

./foo/src/projects/bar/

使用--traceResolution选项进行构建是解决这些错误的绝佳工具。对于您的项目设置,从--traceResolution目录中进行的构建包括以下输出:

  

将模块作为文件/文件夹加载,候选模块位置foo/,目标文件类型为'TypeScript'。

运行时

TypeScript路径映射允许进行路径映射,但不能重写这些路径。运行时(在您的情况下为'C:/dev/temp/foo/src/projects/bar')必须知道如何找到node。您还将需要使用路径映射来配置运行时。这是一个@bar/shared软件包,可让您执行此操作:https://www.npmjs.com/package/module-alias