Para que são utilizados todos os index.ts?


132

Eu estive analisando alguns projetos de sementes e todos os componentes parecem ter um index.ts que exporta * desse componente. Não consigo encontrar em nenhum lugar o que é realmente usado?

Por exemplo, https://github.com/mgechev/angular2-seed/tree/master/src/client/app/%2Bhome

obrigado


1
Relevante para esta discussão é esta questão no github. Você pode querer lê-lo antes de usar arquivos barril com seu projeto Angular
BeetleJuice

Respostas:


227

Na entrada do glossário arquivado do Angular.io v2 para Barrel* :

Um barril é uma maneira de acumular exportações de vários módulos em um único módulo de conveniência. O barril em si é um arquivo de módulo que reexporta exportações selecionadas de outros módulos.

Imagine três módulos em uma pasta de heróis:

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

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

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

Sem um barril, um consumidor precisaria de três declarações de importação:

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

Podemos adicionar um barril à pasta de heróis (chamada de índice por convenção) que exporta todos esses itens:

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

Agora, um consumidor pode importar o que precisa do barril.

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

Cada pacote com escopo Angular possui um barril chamado index.

Consulte também EXCEÇÃO: Não é possível resolver todos os parâmetros


* NOTA: Barrel foi removido das versões mais recentes do glossário Angular .

ATUALIZAÇÃO Nas versões mais recentes do Angular, o arquivo barril deve ser editado como abaixo,

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

5
Quando eu faço o equivalente a export * from './hero.model.ts', recebo uma mensagem como "'um caminho de importação não pode terminar com um' .ts ''". Então, apenas mudo para export * from './hero.model'. Também vale a pena repetir seu comentário sobre Angular, que não recomenda mais barris
The Red Pea

1
@TheRedPea obrigado pela dica. Não quero alterá-lo porque é uma citação de (uma versão anterior da) página vinculada
Günter Zöchbauer

Você sabe que existe alguma biblioteca ou comando auxiliar para gerar o index.js automaticamente?
precisa saber é o seguinte

1
@AlexanderAbakumov Como um componente, diretiva ou canal deve pertencer a um e apenas um módulo, depois de ter declarado qualquer um dos itens acima em um módulo, quando você importa esse módulo, basicamente obtém a mesma coisa ... assumindo que você também os exportou de o módulo.
Rism

2
@ Qwerty Tenho certeza de que isso funciona com a trepidação de árvores, mas o uso de barris foi removido das práticas sugeridas há muito tempo, acho que quando os módulos foram introduzidos pouco antes da versão 1.0.
Günter Zöchbauer 6/02/19

29

index.tsé semelhante index.jsno nodejs ou index.htmlé a hospedagem de sites.

Então, quando você diz import {} from 'directory_name'que ele procurará index.tsdentro do diretório especificado e importará o que for exportado para lá.

Por exemplo, se você tem calculator/index.tscomo

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

Você pode fazer

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

3
A exportação pelo @FlowerScape é particularmente útil ao criar bibliotecas ou códigos em nível de módulo, para que os usuários finais tenham importações menos detalhadas. Ele também oculta quaisquer detalhes de implementação desnecessários / confusos do código importado.
Quinn Turner

Reestruturação. Você pode alterar o código, ex. renomeie os arquivos, desde que você mantenha as exportações em index.ts iguais.
user77115 20/04

3

index.ts ajude-nos a manter tudo relacionado e não precisamos nos preocupar com o nome do arquivo de origem.

Podemos importar tudo usando o nome da pasta de origem.

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

Aqui util é o nome da pasta, não o nome do arquivo, que possui index.tsquais reexporta todos os quatro arquivos.

export * from './util1';
export * from './util2';
export * from './util3';
export * from './util4';
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.