使用baseUrl导入模块时如何让tsc解析绝对路径?

Zsw*_*Zsw 9 typescript tsc tsconfig typescript2.0

考虑一个具有以下目录结构的简单打字稿项目:

|   package.json
|   tsconfig.json
|               
\---src
    |   app.ts
    |   
    \---foobar
            Foo.ts
            Bar.ts
Run Code Online (Sandbox Code Playgroud)

tsconfig.json已配置为具有./src/baseUrl.

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es6",
        "noImplicitAny": true,
        "removeComments": true,
        "preserveConstEnums": true,
        "outDir": "./dist/",
        "baseUrl": "./src/"
    },
    "include": [
        "./src/**/*"
    ],
    "exclude": [
        "node_modules"
    ]
}
Run Code Online (Sandbox Code Playgroud)

现在假设我们要导入FooBar.ts.我的理解是,通过设置baseUrl,我们现在可以使用绝对路径来导入模块

import { Foo } from 'foobar/Foo'
Run Code Online (Sandbox Code Playgroud)

而不是相对路径

import { Foo } from './Foo'
Run Code Online (Sandbox Code Playgroud)

如果我的理解是正确的,打字稿编译器应该能够自动解析foobar/Foo./Foo编译时Bar.ts.

import { Foo } from 'foobar/Foo';

export class Bar {
  foo: Foo;

  constructor(num: number) {
    this.foo = new Foo(num);
  }
}
Run Code Online (Sandbox Code Playgroud)

运行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;
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:如何tsc使用导入模块时正确解析绝对路径baseUrl?或者,如果这不是可以做的事情,那么目的是baseUrl什么?

Ouy*_*hao 8

对于任何仍在这个问题上苦苦挣扎的人。

npm i -D tsc-alias
# pacakage.json#scripts
tsc && tsc-alias
Run Code Online (Sandbox Code Playgroud)


Sea*_*mus 6

问题是你的模块加载器不知道如何在给定绝对路径的情况下找到模块foobar/Foo

\n\n

TypeScript 编译器 (tsc) 正在正确解析模块路径,否则您会收到编译错误。但它信任您正确配置模块加载器。

\n\n

例如,来自RequireJS 的文档

\n\n
\n
\n

支持的配置选项:

\n\n

baseUrl:用于所有模块查找的根路径。

\n
\n
\n\n

TypeScript文档讨论了您可能需要的原因baseUrl

\n\n
\n
\n

在使用 AMD 模块加载器的应用程序中使用 baseUrl 是一种常见做法,其中模块在运行时 \xe2\x80\x9cdeployed\xe2\x80\x9d 到单个文件夹。这些模块的源代码可以位于不同的目录中,但构建脚本会将它们放在一起。

\n
\n
\n

  • 您可以使用“NODE_PATH=dist/node dist/app.js”,以便node也可以解析绝对路径。 (9认同)

Joh*_*ika 5

答案来自@DenisPshenov 在其中一个答案中的评论。它被掩埋了,所以我会在这里提供它......

使用NODE_PATH环境变量告诉 Node 基本 url 的位置,以便它可以解析绝对路径:

Linux / macOS

NODE_PATH=dist/ node ./dist/index.js
Run Code Online (Sandbox Code Playgroud)

Windows PowerShell

$env:NODE_PATH="dist/"
node ./dist/index.js
Run Code Online (Sandbox Code Playgroud)