我正在尝试找出将我的应用程序拆分为几个CommonJS模块的最佳方法,以便其他应用程序可以使用。
我有5个TS类,希望将它们捆绑成一个单独的CommonJS模块。然后,我打算将此模块发布到私有NPM仓库中,以便其他应用程序可以使用。理想情况下,我希望将相关的*.d.ts定义文件与其捆绑在一起。
怎么做才是最佳方法?我正在使用外部TS模块,但这些会针对每个TS类生成一个单独的CommonJS模块。
我正在尝试找出将我的应用程序拆分为几个CommonJS模块的最佳方法,以便其他应用程序可以使用。
我有5个TS类,希望将它们捆绑成一个单独的CommonJS模块。然后,我打算将此模块发布到私有NPM仓库中,以便其他应用程序可以使用。理想情况下,我希望将相关的*.d.ts定义文件与其捆绑在一起。
怎么做才是最佳方法?我正在使用外部TS模块,但这些会针对每个TS类生成一个单独的CommonJS模块。
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编译器
并带上--out参数编译这些文件,你可以将它们合并为一个文件。但是,这样并不会使它们成为CommonJS模块。为了导出它们,你需要使用一个技巧,添加一个名为ValidationExport.ts的ts文件,并在其中添加命名空间的导出指令:
var module: any = <any>module;
module.exports = Validation;
然后你可以运行tsc命令将所有内容编译为一个名为"validationmodule.js"的单独文件:
tsc --out validationmodule.js Validation.ts ZipCodeValidator.ts LettersOnlyValidator.ts ValidationExport.ts
输出结果是一个 CommonJS 模块,您可以在 Node.js 中使用:
var Validation = require("./validationmodule");
var zipCodeValidator = new Validation.ZipCodeValidator();
var lettersOnylValidator = new Validation.LettersOnlyValidator();
console.log(zipCodeValidator.isAcceptable("16211"));
console.log(lettersOnylValidator.isAcceptable("5555"));
每个文件都有一个单独的CommonJS模块是完全合适的。在TypeScript中的所有require
调用将转换为JavaScript中的CommonJS require
调用,并且.d.ts
文件将在此过程中被捕获。(如果您正在做一些愚蠢的事情,比如在源目录外require
类...请停止。)
只有在打算在其他应用程序中使用此NPM包时才需要考虑打包步骤,在这种情况下,请查看Browserify。
declare var module;
但你比我快了几秒钟... - Jthorpevar module: any = <any>module || {};
,似乎可以在任何地方正常工作。 - Dan Marshall