LJW*_*LJW 10 commonjs node.js typescript grunt-ts
我正在尝试找出将应用程序拆分为几个可供其他应用程序使用的CommonJS模块的最佳方法.
我有5个TS类,我想将它们捆绑为一个CommonJS模块.然后我打算将此模块发布到私有NPM仓库,因此可以被其他应用程序使用.理想情况下,我想用它打包相关的*.d.ts定义文件.
最好的方法是什么?我正在使用外部TS模块,但是这些模块为每个TS类生成一个单独的CommonJS模块.
Far*_*ina 15
据我所知,typescript不支持组合外部模块.从他们在codeplex上的wiki:
TypeScript在外部模块源文件与其发出的JS文件之间具有一对一的对应关系.这样做的一个影响是不可能使用--out编译器开关将多个外部模块源文件连接成一个JavaScript文件.
但是,你可以通过在typescript中使用内部模块来做一个技巧,因为tsc编译器能够将它们编译成单个文件,然后你可以添加一个带有module.exports整个命名空间的指令的文件,使它成为一个CommonJS模块.
这是一个循序渐进的例子.假设您将以下内部模块拆分为三个文件:
验证.ts:
module Validation {
export interface StringValidator {
isAcceptable(s: string): boolean;
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果使用--out参数编译它们,则tsc compiler可以将它们组合成单个文件.但是,这并不能使它们成为CommonJS模块.要导出它们,您可以使用一个技巧来添加一个名为ValidationExport.ts的 ts文件,其中包含命名空间的export指令:
var module: any = <any>module;
module.exports = Validation;
Run Code Online (Sandbox Code Playgroud)
然后你可以运行tsc命令将所有内容编译成一个名为"validationmodule.js"的文件:
tsc --out validationmodule.js Validation.ts ZipCodeValidator.ts LettersOnlyValidator.ts ValidationExport.ts
Run Code Online (Sandbox Code Playgroud)
输出是您可以在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"));
Run Code Online (Sandbox Code Playgroud)