我正在尝试找出将应用程序拆分为几个可供其他应用程序使用的CommonJS模块的最佳方法。
我有5个TS类,我想将它们捆绑为一个CommonJS模块。然后我打算将此模块发布到私有NPM仓库,因此可以被其他应用程序使用。理想情况下,我想用它打包相关的* .d.ts定义文件。
最好的方法是什么?我正在使用外部TS模块,但是这些模块为每个TS类生成一个单独的CommonJS模块。
答案 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