考虑一个简单的TypeScript项目,其目录结构如下:
| package.json
| tsconfig.json
|
\---src
| app.ts
|
\---foobar
Foo.ts
Bar.ts
tsconfig.json
已被配置为将./src/
作为baseUrl
。
{
"compilerOptions": {
"module": "commonjs",
"target": "es6",
"noImplicitAny": true,
"removeComments": true,
"preserveConstEnums": true,
"outDir": "./dist/",
"baseUrl": "./src/"
},
"include": [
"./src/**/*"
],
"exclude": [
"node_modules"
]
}
现在假设我们想在Bar.ts
中导入Foo
。我的理解是,通过设置baseUrl
,我们现在可以使用绝对路径导入模块。
import { Foo } from 'foobar/Foo'
与相对路径相反
import { Foo } from './Foo'
如果我理解得正确,TypeScript编译器在编译Bar.ts
时应该能够自动将foobar/Foo
解析为./Foo
。
import { Foo } from 'foobar/Foo';
export class Bar {
foo: Foo;
constructor(num: number) {
this.foo = new Foo(num);
}
}
使用tsc
编译时没有错误。 但是,当我们实际查看编译的Bar.js
文件时,会发现路径没有正确解析,如果运行它,就会出现找不到模块错误。
"use strict";
const Foo_1 = require("foobar/Foo");
class Bar {
constructor(num) {
this.foo = new Foo_1.Foo(num);
}
}
exports.Bar = Bar;
所以我的问题是:当使用 baseUrl
导入模块时,如何让 tsc
正确解析绝对路径?如果无法做到这一点,那么 baseUrl
的目的是什么呢?
tsc
并不负责将绝对路径转换为相对路径,我们需要配置模块加载器来解决这个问题?如果是这样的话,有没有办法让tsc
直接转换为相对路径呢? - Zswtsc
不会为您转换路径。如果可能的话,最好在您的import
语句中使用符合您的模块加载器规范/配置的路径,然后使用各种编译器选项告诉tsc
如何相应地解析模块名称。 - SeamusNODE_PATH=dist/ node dist/app.js
命令,这样 Node 就能够解析绝对路径了。 - Denis Pshenov