2017-02-21 3 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" 
    ] 
} 

Теперь предположим, что мы хотим импортировать Foo в Bar.ts. Я понимаю, что, установив baseUrl, теперь мы можем использовать абсолютные пути для импорта модулей

import { Foo } from 'foobar/Foo' 

в отличие от относительных путей

import { Foo } from './Foo' 

Если я правильно понимаю, машинопись компилятор должен быть в состоянии автоматически разрешает foobar/Foo до ./Foo при компиляции Bar.ts.

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' не будет конвертировать пути для вас. Если возможно, будет проще использовать пути в вашем заявлении 'import', которые соответствуют вашему загрузчику модуля spec/config, а затем использовать различные параметры компилятора, чтобы сообщить' tsc', как правильно разрешить имена модулей. – Seamus

+1

@Zsw В качестве альтернативы выберете опцию компилятора «outFile». Он объединит модули в один вывод: https://github.com/Microsoft/TypeScript/wiki/What%27s-new-in-TypeScript#concatenate-amd-and-system-modules-with---outfile – Seamus

Смежные вопросы