所有 index.ts 的用途是啥?

Posted

技术标签:

【中文标题】所有 index.ts 的用途是啥?【英文标题】:What are all the index.ts used for?所有 index.ts 的用途是什么? 【发布时间】:2016-09-30 14:23:48 【问题描述】:

我一直在查看一些种子项目,所有组件似乎都有一个 index.ts 可以从该组件导出 *。我在任何地方都找不到它的实际用途?

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

谢谢

【问题讨论】:

与本次讨论相关的是github上的this issue。在将桶文件用于 Angular 项目之前,您可能需要通读它 【参考方案1】:

来自Barrel的Angular.io v2's archived glossary条目*

桶是一种将多个模块的导出汇总为单个模块的方法 便利模块。桶本身是一个模块文件,可以重新导出 其他模块的选定导出。

想象一个英雄文件夹中的三个模块:

// 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';

我们可以在 heros 文件夹中添加一个桶(按约定称为索引) 导出所有这些项目:

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 的桶。

另见EXCEPTION: Can't resolve all parameters


*注意:Barrel 已从 more recent versions of the Angular glossary 中删除。

更新 使用最新版本的 Angular,桶文件应编辑如下,

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

【讨论】:

当我执行相当于export * from './hero.model.ts' 的操作时,我会收到类似“'导入路径不能以'.ts''结尾”的消息,所以我只需更改为export * from './hero.model'。同样值得重复您对Angular not recommending barrels anymore的评论 @TheRedPea 感谢您的提示。我不想更改它,因为它是来自链接页面(早期版本)的引用 你知道有没有帮助库或命令自动生成index.js? @AlexanderAbakumov 由于组件、指令或管道必须属于一个且仅属于一个模块,因此通过在模块中声明上述任何内容,当您导入该模块时,您基本上可以实现相同的目标。 .. 假设您还从模块中导出了它们。 @Qwerty 我很确定这适用于 tree-shaking,但是很久以前建议的做法中删除了使用桶,我认为当模块在 1.0 之前引入时。【参考方案2】:

index.ts 类似于 nodejs 中的 index.jsindex.html 是网站托管。

所以当你说import from 'directory_name' 时,它会在指定目录中查找index.ts 并导入那里导出的任何内容。

例如,如果您有calculator/index.ts

export function add() ...
export function multiply() ...

你可以的

import  add, multiply  from './calculator';

【讨论】:

@FlowerScape 在创建库或模块级代码时,通过索引导出特别有用,这样最终用户的导入就不那么冗长了。它还隐藏了导入代码的任何不必要/令人困惑的实现细节。 重构。您可以更改代码,例如。重命名文件,只要保持 index.ts 中的导出相同。【参考方案3】:

index.ts 帮助我们将所有相关的东西放在一起,我们不需要担心源文件名。

我们可以使用源文件夹名称导入所有东西。

import  getName, getAnyThing  from './util';

这里的 util 是文件夹名而不是文件名,它有 index.ts 重新导出所有四个文件。

export * from './util1';
export * from './util2';
export * from './util3';
export * from './util4';

【讨论】:

以上是关于所有 index.ts 的用途是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Android 活动生命周期 - 所有这些方法的用途是啥?

OAuth 2.0 中资源所有者密码凭据授予类型的用途是啥?

如何开玩笑地模拟文件夹中的所有文件

事务日志的用途是啥

会话数据的用途是啥?

jenkins 用户文件夹的用途是啥,这些配置文件是啥?