A cosa servono tutti gli index.ts?


132

Ho esaminato alcuni progetti seed e tutti i componenti sembrano avere un index.ts che esporta * da quel componente. Non riesco a trovare da nessuna parte a cosa serve effettivamente?

Ad esempio https://github.com/mgechev/angular2-seed/tree/master/src/client/app/%2Bhome

Grazie


1
Rilevante per questa discussione è questo problema su Github. Potresti voler leggere tutto prima di usare i file barrel con il tuo progetto Angular
BeetleJuice

Risposte:


227

Dalla voce di glossario archiviata di Angular.io v2 per Barrel* :

Un barile è un modo per raggruppare le esportazioni da più moduli in un singolo modulo di convenienza. Il barilotto stesso è un file di modulo che riesporta le esportazioni selezionate di altri moduli.

Immagina tre moduli in una cartella di eroi:

// heroes/hero.component.ts
export class HeroComponent {}

// heroes/hero.model.ts
export class Hero {}

// heroes/hero.service.ts
export class HeroService {}

Senza una canna, un consumatore avrebbe bisogno di tre dichiarazioni di importazione:

import { HeroComponent } from '../heroes/hero.component.ts';
import { Hero }          from '../heroes/hero.model.ts';
import { HeroService }   from '../heroes/hero.service.ts';

Possiamo aggiungere un barile alla cartella degli eroi (chiamata indice per convenzione) che esporta tutti questi elementi:

export * from './hero.model.ts';   // re-export all of its exports
export * from './hero.service.ts'; // re-export all of its exports
export { HeroComponent } from './hero.component.ts'; // re-export the named thing

Ora un consumatore può importare ciò di cui ha bisogno dalla canna.

import { Hero, HeroService } from '../heroes'; // index is implied

I pacchetti con ambito angolare hanno ciascuno un indice denominato barile.

Vedi anche ECCEZIONE: impossibile risolvere tutti i parametri


* NOTA: Barrel è stato rimosso dalle versioni più recenti del glossario angolare .

AGGIORNAMENTO Con le ultime versioni di Angular, il file barrel deve essere modificato come di seguito,

export { HeroModel } from './hero.model';  
export { HeroService } from './hero.service'; 
export { HeroComponent } from './hero.component';

5
Quando faccio l'equivalente di export * from './hero.model.ts', ricevo un messaggio del tipo "'un percorso di importazione non può terminare con un' .ts ''" Quindi cambio semplicemente a export * from './hero.model'. Vale anche la pena ripetere il tuo commento su Angular che non consiglia più botti
The Red Pea,

1
@TheRedPea grazie per il suggerimento. Non voglio cambiarlo perché è una citazione da (una versione precedente della) pagina collegata
Günter Zöchbauer

Sai c'è qualche libreria o comando helper per generare automaticamente index.js?
tom10271,

1
@AlexanderAbakumov Dato che un componente, direttiva o pipe deve appartenere a un solo modulo, quindi dopo aver dichiarato uno dei precedenti in un modulo, quando si importa quel modulo si ottiene sostanzialmente la stessa cosa ... supponendo che sia stato anche esportato da il modulo.
rism

2
@Qwerty Sono abbastanza sicuro che funzioni con lo scuotimento degli alberi, ma l'uso dei barili è stato rimosso dalle pratiche suggerite molto tempo fa, penso che quando i moduli sono stati introdotti poco prima della 1.0.
Günter Zöchbauer,

29

index.tsè simile index.jsin nodejs o index.htmlè l'hosting di siti Web.

Quindi quando dici import {} from 'directory_name'che cercherà index.tsall'interno della directory specificata e importerà tutto ciò che viene esportato lì.

Ad esempio se hai calculator/index.tscome

export function add() {...}
export function multiply() {...}

Tu puoi fare

import { add, multiply } from './calculator';

3
@FlowerScape L'esportazione tramite l'indice è particolarmente utile durante la creazione di librerie o codice a livello di modulo, in modo che gli utenti finali abbiano importazioni meno dettagliate. Inoltre nasconde eventuali dettagli di implementazione non necessari / confusi del codice importato.
Quinn Turner,

Refactoring. Puoi modificare il codice, ad es. rinominare i file, purché si mantengano uguali le esportazioni in index.ts.
user77115

3

index.ts ci aiuta a tenere insieme tutte le cose correlate e non dobbiamo preoccuparci del nome del file di origine.

Possiamo importare tutto usando il nome della cartella di origine.

import { getName, getAnyThing } from './util';

Qui util è il nome della cartella e non il nome del file che ha la index.tsriesportazione di tutti e quattro i file.

export * from './util1';
export * from './util2';
export * from './util3';
export * from './util4';
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.