すべてのindex.tsは何に使用されますか?


132

私はいくつかのシードプロジェクトを見てきましたが、すべてのコンポーネントには、そのコンポーネントから*をエクスポートするindex.tsがあるようです。実際に使用されている場所がどこにもありませんか?

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

ありがとう


1
この議論に関連するのは、github上のこの問題です。Angularプロジェクトでバレルファイルを使用する前に、この
ドキュメント

回答:


227

Angular.io V2のアーカイブされた用語集のエントリBarrel*

バレルは、複数のモジュールからのエクスポートを1つの便利なモジュールにロールアップする方法です。バレル自体は、他のモジュールの選択したエクスポートを再エクスポートするモジュールファイルです。

heroesフォルダーに3つのモジュールがあるとします。

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

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

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

バレルがなければ、消費者は3つのインポートステートメントを必要とします。

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

これらのすべてのアイテムをエクスポートするバレルをheroesフォルダー(慣例ではインデックスと呼ばれます)に追加できます。

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

Angularスコープのパッケージにはそれぞれ、indexという名前のバレルがあります。

例外も参照:すべてのパラメーターを解決できない


* 注: Angular用語集の最近のバージョンBarrelから削除されました。

更新 Angularの最新バージョンでは、バレルファイルを以下のように編集する必要があります、

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'ます。また、Angularがバレルを推奨しない
The Red Pea

1
ヒントをありがとう@TheRedPea。それはリンク先のページ(以前のバージョン)からの引用ですので、私はそれを変更したくない
ギュンターZöchbauer

index.jsを自動的に生成するヘルパーライブラリまたはコマンドがあることを知っていますか?
tom10271 2017年

1
@AlexanderAbakumovコンポーネント、ディレクティブ、またはパイプは1つだけのモジュールに属している必要があるため、モジュールで上記のいずれかを宣言することにより、そのモジュールをインポートすると、基本的に同じことを達成します...モジュール。
rism

2
@Qwerty私はこれがツリーシェイキングで動作すると確信していますが、バレルの使用はずっと以前に推奨されたプラクティスから削除されました。モジュールが1.0の直前に導入されたときだと思います。
ギュンターZöchbauer

29

index.tsindex.jsnodejs で類似しているかindex.html、Webサイトのホスティングです。

したがって、指定したディレクトリ内import {} from 'directory_name'を検索しindex.ts、そこにエクスポートされているものをすべてインポートすると言います。

たとえばcalculator/index.ts

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

できるよ

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

3
@FlowerScapeインデックスを介したエクスポートは、ライブラリまたはモジュールレベルのコードを作成するときに特に役立ちます。これにより、エンドユーザーのインポートが冗長になります。また、インポートされたコードの不必要で混乱を招く実装の詳細を隠します。
クインターナー

リファクタリング。たとえば、コードを変更できます。index.tsのエクスポートを同じに保つ限り、ファイルの名前を変更します。
user77115

3

index.ts 関連するすべてのものをまとめておくのに役立ちます。ソースファイル名を気にする必要はありません。

ソースフォルダー名を使用して、すべてのものをインポートできます。

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

ここで、utilはindex.ts、4つのファイルすべてを再エクスポートするファイル名ではなく、フォルダー名です。

export * from './util1';
export * from './util2';
export * from './util3';
export * from './util4';
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.