index.ts ทั้งหมดใช้ทำอะไร?


136

ฉันได้ดูโครงการเมล็ดพันธุ์สองสามโครงการและส่วนประกอบทั้งหมดดูเหมือนจะมี index.ts ที่ส่งออก * จากส่วนประกอบนั้น ฉันไม่พบสิ่งที่ใช้จริง?

เช่นhttps://github.com/mgechev/angular2-seed/tree/master/src/client/app/%2Bhome

ขอบคุณ


1
ที่เกี่ยวข้องกับการสนทนานี้คือปัญหานี้ใน github คุณอาจต้องการอ่านก่อนใช้ไฟล์บาร์เรลกับโครงการ Angular ของคุณ
BeetleJuice

คำตอบ:


230

จากรายการอภิธานศัพท์ที่เก็บถาวรของ 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

แพ็คเกจที่กำหนดขอบเขตเชิงมุมแต่ละชุดมีดัชนีชื่อถัง

ดูเพิ่มเติมที่EXCEPTION: ไม่สามารถแก้ไขพารามิเตอร์ทั้งหมด


* หมายเหตุ: Barrelถูกลบออกจากรุ่นล่าสุดของคำศัพท์เชิงมุม

อัปเดต ด้วย Angular เวอร์ชันล่าสุดไฟล์บาร์เรลควรได้รับการแก้ไขดังต่อไปนี้

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

6
เมื่อฉันเทียบเท่าexport * from './hero.model.ts'ฉันได้รับข้อความเช่น "'เส้นทางการนำเข้าไม่สามารถลงท้ายด้วย" .ts "" "ดังนั้นฉันจึงเปลี่ยนเป็นexport * from './hero.model'. ควรทำซ้ำความคิดเห็นของคุณเกี่ยวกับAngular ไม่แนะนำให้ใช้ถังอีกต่อไป
The Red Pea

1
@TheRedPea ขอบคุณสำหรับคำใบ้ ฉันไม่ต้องการเปลี่ยนแปลงเพราะเป็นคำพูดจาก (เวอร์ชันก่อนหน้าของหน้า) ที่เชื่อมโยง
GünterZöchbauer

คุณรู้หรือไม่ว่ามีไลบรารีตัวช่วยหรือคำสั่งใด ๆ ในการสร้าง index.js โดยอัตโนมัติ?
tom10271

1
@AlexanderAbakumov เนื่องจากส่วนประกอบคำสั่งหรือท่อต้องเป็นของโมดูลเดียวและเพียงโมดูลเดียวจากนั้นเมื่อคุณนำเข้าโมดูลนั้นคุณจะได้สิ่งเดียวกันเป็นหลัก ... สมมติว่าคุณส่งออกจาก โมดูล
rism

2
@Qwerty ฉันค่อนข้างแน่ใจว่าสิ่งนี้ใช้ได้กับการเขย่าต้นไม้ แต่การใช้ถังถูกลบออกจากแนวทางปฏิบัติที่แนะนำเมื่อนานมาแล้วฉันคิดว่าเมื่อโมดูลที่แนะนำก่อน 1.0
GünterZöchbauer

31

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 การส่งออกผ่านดัชนีมีประโยชน์อย่างยิ่งเมื่อสร้างไลบรารีหรือโค้ดระดับโมดูลเพื่อให้ผู้ใช้ปลายทางมีการนำเข้า verbose น้อยลง นอกจากนี้ยังซ่อนรายละเอียดการใช้งานที่ไม่จำเป็น / สับสนของโค้ดที่นำเข้า
Quinn Turner

Refactoring. คุณสามารถเปลี่ยนรหัสได้เช่น เปลี่ยนชื่อไฟล์ตราบเท่าที่คุณยังคงส่งออกในดัชนีมันเหมือนเดิม
user77115

3

index.ts ช่วยให้เรารวบรวมสิ่งที่เกี่ยวข้องทั้งหมดไว้ด้วยกันและเราไม่จำเป็นต้องกังวลเกี่ยวกับชื่อไฟล์ต้นฉบับ

เราสามารถนำเข้าทุกสิ่งโดยใช้ชื่อโฟลเดอร์ต้นทาง

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

ที่นี่ util คือชื่อโฟลเดอร์ไม่ใช่ชื่อไฟล์ซึ่งมีindex.tsการส่งออกไฟล์ทั้งสี่ใหม่อีกครั้ง

export * from './util1';
export * from './util2';
export * from './util3';
export * from './util4';
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.