2015-12-19 18 views
10

Importieren eines Moduls, das sich nicht in oder um den gleichen Ordner befindet, ist ziemlich ärgerlich. Sie müssen weiterhin die '../' zählen. Wie im Beispiel unten:Importieren von Modulen aus tief verschachtelten Verzeichnisstrukturen

import {AnswersService, AddAnswerModel, Answer} from '../../../../../../../BackendServices/AnswersService'; 

Durch meine system.config zum Beispiel unten ändern, kann ich um all diese ‚../‘ mit und der Code funktioniert perfekt in Ihrem Browser.

System.config({ 
     packages: { 
      'app': { defaultExtension: 'js' }, 
      'rxjs': { defaultExtension: 'js' } 
     }, 
     paths: { 
      'rxjs/*': 'node_modules/rxjs/*', 
      'BackendServices/*': 'app/BackendServices/*' 
     } 
    }); 

Es reduziert die Import-Anweisung auf den verwaltbaren Befehl unten.

Aber das Problem mit diesem Ansatz ist, dass ich Intellisense in Visual Studio Code verliere. Ich bin mir nicht sicher, ob dies ein Schreibmaschinenproblem, ein visuelles Studiocode-Problem oder etwas anderes ist.

Weiß jemand, wie man das funktioniert, ohne Intellisense zu verlieren?

+0

Warum haben Sie so unglaublich tiefe Verzeichnisstruktur? Halten Sie Ihren ganzen Baum 2-3 Stufen tief. –

Antwort

4

Visual Studio kann nur relative Pfade und Module auflösen, die sich in node_module wie angular2/* oder rxjs/* befinden.

Es ist die TypeScript-Standard moduleResolution (node) .. Sie können es in tsconfig.json mit 'classic' ändern .. aber VS-Code wird nicht mehr Knotenmodule erkennen.

Das Problem wird in diesem Ticket diskutiert https://github.com/Microsoft/TypeScript/issues/5039

Es gibt viele Vorschläge .. aber ist noch nichts umgesetzt.

+0

Für das OP besteht die Lösung vielleicht darin, die App-Ressourcen in einem privaten Repo mit den erforderlichen npm-Metadaten zu verpacken, so dass die App mit npm in der Entwicklungsumgebung installiert wird. – RibaldEddie

+0

Sie können einige Teile Ihrer Anwendung (zB Backed Connectors) in einem separaten npm-Modul verpacken .. und eine .d.ts-Datei erstellen, die die Module exportiert. Aber es ist nicht praktisch. Ich habe die Codequelle von Angular2 überprüft. Sie verwenden keine '../ ..' Pfadauflösung. In der tsconfig.json haben sie "moduleResolution": "classic" (Standardwert ist "node") Ich habe es versucht .. es funktioniert .. aber die Knoten-Module sind nicht mehr recongnized. :( –

+0

Danke Jungs für die Antwort. Ich denke, wir müssen warten, bis dieses Problem in der Zukunft angepackt wird. Verpackung der Anwendung Teile in private rep scheint nicht machbar für mein aktuelles Projekt. Also ich denke, ich werde um ein flaches Komponentenverzeichnis für jetzt zu behalten. Und die Anwendung in der Zukunft umgestalten, sobald sie dieses Problem angehen. Danke für die ganze Hilfe! – Zorthgo

5

Sie können ein Muster kopieren, die von der angular-cli durch den Export jede Komponente implementiert wird Sie an anderer Stelle durch eine index.ts auf Verzeichnisebene verfügbar sein soll. Auf diese Weise können Sie verschachtelte Komponenten auf einer höheren Ebene verfügbar machen.

Hier ist ein Beispiel:

parent 
├── child 
│   ├── child.component.ts 
│   └── index.ts 
├── parent.component.ts 
└── index.ts 

Innen child/index.ts einfach relevante Komponenten exportieren.

export { ChildComponent } from './child.component'; 

Dann kann parent/index.ts die Exportkette fortsetzen.

export { ParentComponent } from './parent.component'; 
export { ChildComponent } from './child'; 

Hinweis: Beachten Sie, wie die oben nicht statt child.component Datei, aber das childVerzeichnis verweist!

Die child Verzeichnis index.ts Oberflächen diese Komponenten über die Exporte in index.ts. Dies kann für wie tief verschachtelt Ihre Komponenten sind.

Schließlich, wenn eine andere Komponente außerhalb von parent/ wollte etwas innerhalb von parent/ verbrauchen, könnte es leicht auf der obersten Ebene verwiesen werden.

import { ParentComponent, ChildComponent } from './parent'; 
Verwandte Themen