2017-02-21 39 views
6

Rozważmy prosty projekt maszynopis z następującej struktury katalogów:Jak uzyskać tsc do rozwiązywania bezwzględnych ścieżek podczas importowania modułów przy użyciu baseUrl?

| package.json 
| tsconfig.json 
|    
\---src 
    | app.ts 
    | 
    \---foobar 
      Foo.ts 
      Bar.ts 

tsconfig.json został skonfigurowany tak, aby mieć ./src/ być baseUrl.

{ 
    "compilerOptions": { 
     "module": "commonjs", 
     "target": "es6", 
     "noImplicitAny": true, 
     "removeComments": true, 
     "preserveConstEnums": true, 
     "outDir": "./dist/", 
     "baseUrl": "./src/" 
    }, 
    "include": [ 
     "./src/**/*" 
    ], 
    "exclude": [ 
     "node_modules" 
    ] 
} 

Teraz przypuśćmy, że chcemy importować Foo w Bar.ts. W moim rozumieniu jest to, że przez ustawienie baseUrl, możemy teraz używać ścieżek bezwzględnych importować moduły

import { Foo } from 'foobar/Foo' 

w przeciwieństwie do względnych ścieżek

import { Foo } from './Foo' 

Jeśli moje rozumienie jest poprawne, kompilator maszynopis powinien być w stanie automatycznie rozwiązuje foobar/Foo do ./Foo podczas kompilowania Bar.ts.

import { Foo } from 'foobar/Foo'; 

export class Bar { 
    foo: Foo; 

    constructor(num: number) { 
    this.foo = new Foo(num); 
    } 
} 

Uruchamianie tsc kompiluje bez błędów. Jednak gdy przyjrzymy się kompilacji Bar.js, zobaczymy, że ścieżka nie została poprawnie rozwiązana, co dałoby nam błąd Nie można znaleźć modułu, jeśli chcemy go uruchomić.

"use strict"; 
const Foo_1 = require("foobar/Foo"); 
class Bar { 
    constructor(num) { 
     this.foo = new Foo_1.Foo(num); 
    } 
} 
exports.Bar = Bar; 

Więc moje pytanie brzmi: Jak mogę dostać tsc poprawnie rozwiązać bezwzględne ścieżki podczas importowania modułów za pomocą baseUrl? A jeśli to nie jest coś, co da się zrobić, jaki jest cel tego baseUrl?

Odpowiedz

1

Problem polega na tym, że moduł ładujący moduły nie wie, jak znaleźć moduł z absolutną ścieżką foobar/Foo.

Kompilator TypeScript (tsc) prawidłowo rozpoznaje ścieżki modułów, w przeciwnym razie wystąpią błędy kompilacji. Ale ufasz, że odpowiednio skonfigurujesz moduł ładujący moduł.

Na przykład, z documentation for RequireJS:

Obsługiwane opcje konfiguracyjne:

baseUrl: ścieżka korzeń w obsłudze dla wszystkich wyszukiwań modułów.

maszynopisu documentation opowiada trochę o tym, dlaczego może trzeba baseUrl:

Korzystanie z baseURL jest powszechną praktyką w aplikacjach przy użyciu ładowarki modułu AMD gdzie moduły są „Wdrożone” Do pojedynczy folder w czasie wykonywania. Źródła tych modułów mogą znajdować się w różnych katalogach, ale skrypt budujący je umieści je wszystkie razem.

+1

Dzięki!Innymi słowy, 'tsc' nie jest odpowiedzialny za przekształcenie ścieżki bezwzględnej w ścieżkę względną, a ja mam skonfigurować moduł ładujący modułu, aby go rozwiązać? Jeśli tak, to czy istnieje sposób, aby zamiast tego 'tsc' po prostu przekształcił się w ścieżkę względną? – Zsw

+0

Nie, o ile mi wiadomo, 'tsc' nie konwertuje ścieżek dla ciebie. Jeśli to możliwe, łatwiej będzie użyć ścieżek w twoim poleceniu 'import', które jest zgodne z twoją specyfikacją/konfiguracją modułu ładowania modułów, a następnie użyj różnych opcji kompilatora, aby powiedzieć' tsc' jak odpowiednio rozwiązać nazwy modułów. – Seamus

+1

@Zsw Alternatywnie, wypróbuj opcję kompilatora "outFile". Łączy moduły w jednym wyjściu: https://github.com/Microsoft/TypeScript/wiki/What%27s-new-in-TypeScript#concatenate-amd-and-system-modules-with---outfile – Seamus