有没有办法重新排列TypeScript编译器生成的JavaScript模块?

时间:2017-01-10 03:03:36

标签: javascript typescript webpack systemjs commonjs

我有一个TypeScript项目,项目结构的组织方式与典型的Maven Java项目不同。下面或多或少是项目结构的样子。

.
├── gulpfile.js
├── index.html
├── package.json
├── src
│   ├── entity
│   │   ├── car.ts
│   │   ├── animal.ts
│   └── sevice
│       ├── dao
│       │   ├── cardao.ts
│       │   ├── animaldao.ts
│       └── validator
│           ├── carvalidator.ts
│           └── animalvalidator.ts
├── test
│   ├── entity
│   │   ├── car.spec.ts
│   │   ├── animal.spec.ts
│   └── service
│       └── dao
│           ├── carvalidator.spec.ts
│           └── animalvalidator.spec.ts
├── tsconfig.json
└── webpack.config.js

我能够为commonjs / webpack,system和amd生成一个*.js文件。

  • 对于commonjs / webpack,我使用tsc + tsconfig.json然后使用webpack + webpack.config.js生成单个文件 bundle.js
  • 对于系统,我只需使用gulp-typescript任务将模块设置为system来生成单个文件 lib-system.js
  • 对于amd,我再次使用gulp-typescript将模块设置为amd来生成单个文件 lib-amd.js

然而,在我将这些单*.js个文件加载到浏览器后(使用webpack我只使用<script>标签,而另一个我使用SystemJS),我注意到我必须实例化我的对象如下。

var c = new car.Car('chevy', 'traverse', 2017);
var a = new animal.Animal('cat');

我不喜欢我在代码car.Caranimal.Animal中重复自己的事实。是否有办法使我能够执行以下而不更改项目结构?

var c = new entity.Car('chevy', 'traverse', 2017);
var a = new entity.Animal('cat');

当然,我可以创建一个文件entity.ts,并在该文件中定义CarAnimal(或者有很多实体)。但是,对于我来说,拥有一个包含大量类的长文件只是为了将逻辑上的模块组合在一起,这似乎相当愚蠢。

我冒昧地将所有*.ts个文件合并到一个超级ts文件中,但这并不是真的有效,因为

  • 那里有很多进口产品,你必须将它们删除(我不知道gulp-concat是否可以执行此操作,或者我是否需要另一个包裹进入该流程这样做)
  • 子类必须在超类之后定义(因为gulp-concat在连接文件时不关心此规则)。

所以我的问题是,是否可以逻辑地将我的类(通过函数,例如实体,dao,验证器等)分组到模块而不是默认分组(通过文件,一个文件实际上是一个模块,我相信)?

我希望有一些工具可以实现这一目标,还没有找到任何解决方案。

1 个答案:

答案 0 :(得分:1)

确实有一个解决方案是创建一个模块,用于对其进行分组,src/entity.tsre-export类:

export { Car } from './entity/car';
export { Animal } from './entity/animal';

另一种可能性是使用rollup.js,它似乎能够将几个已编译的模块组合成一个,但它只适用于javascript,我没有任何使用经验。