我有一个包含多个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完全满意-但我无法编译。
答案 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