在TypeScript中开发requirejs导出的库

时间:2013-11-22 09:00:29

标签: typescript

道歉,如果这个问题有点不专心/漫无目的,但我在这里真正拥有的是几个相互关联的问题,我想立刻问一下。

假设我正在开发一个名为foo的库,其中包含文件foo.tsbar.tsbaz.tsfoo.ts是库的根,即它依赖于其他两个并导出依赖应用程序可能需要的所有功能。假设我想将此库作为可加载AMD的模块提供。

在TypeScript中构造此代码的正确方法是什么?以下是我可以想到的方法:

  1. 在整个文件中使用/// <reference path="..."/>,然后使用--out combined.js将它们合并为一个大型库。但是,如果我这样做,我不知道如何将组合输出作为AMD模块提供给下游。如果我向export模块添加foo语句,它对组合文件没有影响,只生成foo.js的requirejs包装版本。因此,似乎通过--out combined.js组合内部模块,然后通过export使组合结果的某些部分可用并不简单。我是否应该使用其他工具将连接结果包装在AMD样板中,避开TypeScript的import / export功能?

  2. 制作foo.tsbar.tsbaz.ts所有外部模块,让它们相互依赖,例如import bar = require('./bar');,并foo.ts导出一个模块,该模块仅包含属于图书馆公共API的barbaz部分。如果我走这条路线,那么默认情况下,由于我们使用的是AMD模块,所有文件都会单独下载,即使它们是高度相互依赖的,这似乎不太理想。但我可以使用requirejs优化器将生成的单个模块组合成一个大模块。但是,如果使用该库的应用程序也是用TypeScript编写的并且想要使用它的声明,那么它应该在哪里?当使用(1)中的--out combined.js选项时,也可以为库获得组合.d.ts,但是当使用外部模块时,我看不到如何执行此操作。下游应用程序代码是否应该进入源目录并获取单个声明文件,即foo.d.tsbar.d.tsbaz.d.ts?我应该手动创建一个引用所有自动生成的单例.d.ts的主声明文件吗?

2 个答案:

答案 0 :(得分:1)

这是我要做的。使用--out lib.js --declaration标记除foo.ts之外的所有文件。然后使用声明创建foo.ts,例如假设:

bar.ts

module Foo{
   export class Bar{
   }
}

baz.ts

module Foo{
   export class Baz{
   }
}

您将获得的声明文件(由于--declaration标志):

module Foo{
  export class Bar{
   }
  export class Baz{
   }
}

因此,您可以将Foo.ts创建为:

/// <reference path="lib.d.ts"/>
declare module "Foo"{
  export = Foo;
}

然后硬编码lib.dist.js以加载--out js文件并导出到amd:

define([require,'lib'],function(){
    return Foo;
});

<强>更新 如果您需要依赖第三方lib,请使用<amd-depenedency中的Foo.ts,并在其他部分使用Foo.ts

答案 1 :(得分:1)

新方式!忘记引用,只需将tsconfig.json文件放在项目的根目录下,所有文件都不会发生冲突。