从多个TypeScript类创建单个CommonJS模块

时间:2014-10-29 11:36:40

标签: node.js typescript commonjs grunt-ts

我正在尝试找出将应用程序拆分为几个可供其他应用程序使用的CommonJS模块的最佳方法。

我有5个TS类,我想将它们捆绑为一个CommonJS模块。然后我打算将此模块发布到私有NPM仓库,因此可以被其他应用程序使用。理想情况下,我想用它打包相关的* .d.ts定义文件。

最好的方法是什么?我正在使用外部TS模块,但是这些模块为每个TS类生成一个单独的CommonJS模块。

2 个答案:

答案 0 :(得分:15)

据我所知,打字稿并不支持组合外部模块。来自他们在codeplex上的wiki:

  

TypeScript在外部模块源文件与其发出的JS文件之间具有一对一的对应关系。这样做的一个影响是,不可能使用--out编译器开关将多个外部模块源文件连接成一个JavaScript文件。

但是,你可以通过在typescript中使用内部模块来做一个技巧,因为tsc编译器能够将它们编译成单个文件,然后你可以再添加一个文件整个命名空间的module.exports指令使其成为CommonJS模块。

这是一步一步的例子。我们假设您将以下内部模块拆分为三个文件:

<强> Validation.ts

module Validation {
    export interface StringValidator {
        isAcceptable(s: string): boolean;
    }
}

<强> ZipCodeValidator.ts

/// <reference path="Validation.ts" />
module Validation {
    var numberRegexp = /^[0-9]+$/;
    export class ZipCodeValidator implements StringValidator {
        isAcceptable(s: string) {
            return s.length === 5 && numberRegexp.test(s);
        }
    }
}

<强> LettersOnlyValidator.ts

/// <reference path="Validation.ts" />
module Validation {
    var lettersRegexp = /^[A-Za-z]+$/;
    export class LettersOnlyValidator implements StringValidator {
        isAcceptable(s: string) {
            return lettersRegexp.test(s);
        }
    }
}

如果使用tsc compiler中的--out参数编译它们,则可以将它们组合到一个文件中。但是,这并不能使它们成为CommonJS模块。要导出它们,您可以使用一个技巧来添加一个名为 ValidationExport.ts 的ts文件,其中包含命名空间的导出指令:

var module: any = <any>module;
module.exports = Validation;

然后你可以运行tsc命令将所有内容编译成一个名为&#34; validationmodule.js&#34;的单个文件:

tsc --out validationmodule.js Validation.ts ZipCodeValidator.ts LettersOnlyValidator.ts ValidationExport.ts

输出是您可以在Node.js中使用的CommonJS模块:

var Validation = require("./validationmodule");

var zipCodeValidator = new Validation.ZipCodeValidator();
var lettersOnylValidator = new Validation.LettersOnlyValidator();

console.log(zipCodeValidator.isAcceptable("16211"));
console.log(lettersOnylValidator.isAcceptable("5555"));

答案 1 :(得分:1)

每个文件都有一个单独的CommonJS模块是完全合适的。 TypeScript中的所有require调用都将转换为JavaScript中的CommonJS require调用,并且将在此过程中拾取.d.ts个文件。 (如果您正在做一些愚蠢的事情,比如require源目录之外的类......停止。)

如果您打算在其他应用程序中使用此NPM程序包,则只需要考虑打包步骤,在这种情况下请查看Browserify