Для чого використовуються всі index.ts?


132

Я переглянув кілька насіннєвих проектів, і всі компоненти, схоже, мають index.ts, який експортує * з цього компонента. Я ніде не можу знайти, для чого він насправді використовується?

Наприклад, https://github.com/mgechev/angular2-seed/tree/master/src/client/app/%2Bhome

Дякую


1
Актуальною для цього обговорення є це питання про github. Ви можете прочитати його, перш ніж використовувати файли бочок у своєму
кутовому

Відповіді:


227

З архіву словника словника Angular.io v2 для Barrel* :

Барель - це спосіб згорнути експорт з декількох модулів в єдиний модуль зручності. Сама бочка - це файл модуля, який реекспортує вибраний експорт інших модулів.

Уявіть три модулі в папці героїв:

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

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

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

Без бочки споживачеві потрібні три заяви про імпорт:

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

Ми можемо додати бочку до папки героїв (називається індексом за умовами), яка експортує всі ці елементи:

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

Тепер споживач може імпортувати те, що йому потрібно з бочки.

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

Кожен пакет з кутовим діапазоном має бочку з ім'ям.

Дивіться також ВИХІД: Не вдається вирішити всі параметри


* ПРИМІТКА: Barrel видалено з останніх версій кутового словника .

ОНОВЛЕННЯ Останніми версіями кутового файлу слід редагувати як нижче,

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

5
Коли я роблю еквівалент export * from './hero.model.ts', я отримую повідомлення на зразок "" шлях імпорту не може закінчитися ".ts" "" Тому я просто переходжу на export * from './hero.model'. Також варто повторити ваш коментар щодо кутових більше не рекомендують бочок
The Red Pea

1
@TheRedPea дякую за підказку. Я не хочу його змінювати, тому що це цитата з (більш ранньої версії) пов’язаної сторінки
Günter Zöchbauer

Чи знаєте ви, чи є бібліотека-помічник або команда для автоматичного створення index.js?
tom10271

1
@AlexanderAbakumov Оскільки компонент, директива або труба повинні належати одному і лише одному модулю, то, оголосивши будь-яке з перерахованих вище в модулі, при імпорті цього модуля ви, по суті, досягаєте того ж самого, припускаючи, що ви також експортували їх з модуль.
rism

2
@Qwerty Я впевнений, що це працює з тремтінням дерев, але використання бочок було видалено з запропонованих практик давно, я думаю, коли модулі там впроваджені трохи раніше, ніж 1.0.
Günter Zöchbauer

29

index.tsподібний index.jsу nodejs або index.htmlце хостинг веб-сайтів.

Тож, коли ви скажете, import {} from 'directory_name'він буде шукати index.tsвсередині вказаного каталогу та імпортувати все, що там експортується.

Наприклад , якщо у вас є , calculator/index.tsяк

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

Ви можете зробити

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

3
@FlowerScape Експорт через індекс особливо корисний при створенні бібліотек або коду рівня модуля, щоб кінцеві користувачі мали менший багатослівний імпорт. Він також приховує непотрібні / заплутані деталі реалізації імпортованого коду.
Квінн Тернер

Рефакторинг. Ви можете змінити код, напр. перейменуйте файли, якщо експорт у index.ts збігається.
користувач77115

3

index.ts допоможіть нам зберегти всі пов'язані речі разом, і нам не потрібно турбуватися про назву вихідного файлу.

Ми можемо імпортувати все, використовуючи ім'я вихідної папки.

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

Тут утиль - це ім'я папки, а не ім'я файлу, index.tsяке повторно експортує всі чотири файли.

export * from './util1';
export * from './util2';
export * from './util3';
export * from './util4';
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.