2017-02-21 133 views
6

考虑一个简单的打字稿项目用下面的目录结构:如何让tsc在使用baseUrl导入模块时解析绝对路径?

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

如果我的理解是正确的,打字稿编译器应该能够当编译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; 

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

回答

1

问题是您的模块加载程序不知道如何找到给定绝对路径foobar/Foo的模块。

TypeScript编译器(tsc)正确解析模块路径,否则会出现编译错误。但它相信你会适当地配置你的模块加载器。

例如,从documentation for RequireJS

支持的配置选项:

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

打字稿documentation谈一点关于为什么需要baseUrl

使用的baseUrl是使用输入模块的“部署”到AMD模块装载机在应用程序中常见的做法运行时单个文件夹。这些模块的源代码可以存在于不同的目录中,但构建脚本会将它们放在一起。

+1

谢谢!换句话说,'tsc'不负责将绝对路径转换为相对路径,我应该配置模块加载器来解析它。如果是这样的话,有没有办法让'tsc'简单地转换为相对路径呢? – Zsw

+0

不,据我所知,'tsc'不会为你转换路径。如果可能的话,在符合模块加载器spec/config的'import'语句中使用路径会更容易,然后使用各种编译器选项来告诉'tsc'如何相应地解析模块名称。 – Seamus

+1

@Zsw作为替代方案,请检出“outFile”编译器选项。它将连接模块到单个输出中:https://github.com/Microsoft/TypeScript/wiki/What%27s-new-in-TypeScript#concatenate-amd-and-system-modules-with---outfile – Seamus

相关问题