2015-12-19 8 views
10

L'importazione di un modulo che non si trova all'interno o intorno alla stessa cartella è piuttosto fastidioso. Devi continuare a contare il '../'. Come nell'esempio seguente:Importazione di moduli da strutture di directory profondamente annidate

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

Modificando il mio System.config al seguente esempio, posso andare in giro con tutti questi '../' e il codice funziona perfettamente sul browser.

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

Riduce la dichiarazione di importazione al comando gestibile di seguito.

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

Ma il problema con questo approccio è che perdo Intellisense in Visual Studio Code. Non sono sicuro che si tratti di un problema di dattiloscritto, di un problema di codice dello studio visivo o di qualcos'altro.

Qualcuno sa come farlo funzionare senza perdere intellisense?

+0

Perché hai una struttura di directory così incredibilmente profonda? Mantieni l'intero albero di 2-3 livelli in profondità. –

risposta

4

Visual Studio è in grado di risolvere solo percorsi e moduli relativi situati in node_modules come angular2/* o rxjs/*.

È il modulo predefinito TypeResolution (nodo) .. è possibile modificarlo in tsconfig.json con 'classic' .. ma VS Code non riconoscerà più i moduli nodo.

Il problema è discusso in questo biglietto https://github.com/Microsoft/TypeScript/issues/5039

Ci sono molte proposte .. ma nulla è stato ancora implementato.

+0

Per l'OP, forse la soluzione è di impacchettare le risorse dell'app in un repository privato con i metadati richiesti in npm in modo che l'app sia installata nell'ambiente di sviluppo con npm? – RibaldEddie

+0

è possibile impacchettare alcune parti della propria applicazione (connettori supportati ad esempio) in un modulo npm separato e creare un file .d.ts che esporti i moduli. Ma non è pratico. Ho controllato il codice sorgente di Angular2. Non usano la risoluzione del percorso '../ ..'. Nel file tsconfig.json hanno "moduleResolution": "classic" (il valore predefinito è "node") L'ho provato .. funziona ... ma i moduli nodo non sono più riconosciuti. :( –

+0

Grazie ragazzi per la risposta, suppongo che dovremo aspettare che questo problema venga affrontato in futuro.Imballaggio delle parti dell'applicazione in un rappresentante privato non sembra fattibile per il mio progetto attuale. per mantenere una directory di componenti flat per ora e refactoring l'applicazione in futuro una volta risolto questo problema Grazie per l'aiuto! – Zorthgo

5

È possibile copiare un modello che viene implementato dal angular-cli esportando tutti i componenti che si desidera disponibili altrove attraverso un index.ts a livello di directory. In questo modo puoi esporre componenti nidificati a un livello superiore.

Ecco un esempio:

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

All'interno child/index.ts semplicemente esportare componenti rilevanti.

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

Quindi parent/index.ts può continuare la catena di esportazione.

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

NOTA: Si noti come quanto sopra non fa riferimento a file child.component, ma il childdirectory invece!

child l'indice index.ts visualizza queste componenti tramite le esportazioni in index.ts. Questo può essere fatto per quanto profondamente nidificati sono i tuoi componenti.

Infine, se un altro componente esterno a parent/ volesse consumare qualcosa all'interno di parent/, è possibile fare riferimento facilmente al livello più alto.

import { ParentComponent, ChildComponent } from './parent'; 
Problemi correlati