Node.js 从几个TypeScript类创建单个CommonJS模块
我正试图找出将我的应用程序拆分为几个可供其他应用程序使用的通用JS模块的最佳方法 我有5个TS类,我想将它们打包为一个CommonJS模块。然后,我打算将此模块发布到一个私有NPM repo,以便其他应用程序可以使用它。理想情况下,我想用它打包相关的*.d.ts定义文件Node.js 从几个TypeScript类创建单个CommonJS模块,node.js,typescript,commonjs,grunt-ts,Node.js,Typescript,Commonjs,Grunt Ts,我正试图找出将我的应用程序拆分为几个可供其他应用程序使用的通用JS模块的最佳方法 我有5个TS类,我想将它们打包为一个CommonJS模块。然后,我打算将此模块发布到一个私有NPM repo,以便其他应用程序可以使用它。理想情况下,我想用它打包相关的*.d.ts定义文件 最好的方法是什么?我正在使用外部TS模块,但这些模块会为每个TS类生成一个单独的CommonJS模块。据我所知,typescript还不支持组合外部模块。从他们在codeplex上的wiki: TypeScript在外部模块源文
最好的方法是什么?我正在使用外部TS模块,但这些模块会为每个TS类生成一个单独的CommonJS模块。据我所知,typescript还不支持组合外部模块。从他们在codeplex上的wiki: TypeScript在外部模块源文件和它们发出的JS文件之间有一对一的对应关系。这样做的一个效果是不可能使用--out编译器开关将多个外部模块源文件连接到单个JavaScript文件中 但是,您可以通过在typescript中使用内部模块来实现一个技巧,因为tsc编译器能够将它们编译成一个文件,然后您只需为整个命名空间添加一个带有
模块.exports
指令的文件,使其成为一个CommonJS模块
下面是一个逐步的例子。假设您将以下内部模块分为三个文件:
验证。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);
}
}
}
/// <reference path="Validation.ts" />
module Validation {
var lettersRegexp = /^[A-Za-z]+$/;
export class LettersOnlyValidator implements StringValidator {
isAcceptable(s: string) {
return lettersRegexp.test(s);
}
}
}
然后可以运行tsc命令将所有内容编译为一个名为“validationmodule.js”的文件:
输出是可以在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"));
每个文件有一个单独的CommonJS模块是完全合适的。TypeScript中的所有
require
调用都将转换为JavaScript中的CommonJSrequire
调用,并且在此过程中将拾取.d.ts
文件。(如果你正在做一些愚蠢的事情,比如要求
在你的源代码目录之外创建类……停止。)
<>你只需要考虑一个打包步骤,如果你打算在其他应用程序中使用这个NPM包,在这种情况下查看谢谢,非常好的响应。我想这就引出了一个问题:使用内部模块的缺点是什么?我不久前就停止使用它们了,因为管理脚本依赖关系是一件差事。内部模块只是名称空间。它们不应该对代码造成任何限制。在我上面的示例中,您有脚本依赖项,并且工作正常。如果您有一个更复杂的依赖项场景无法工作,您可以将其作为问题发布;)我在实施此解决方案时遇到问题。具体来说,当我运行行
tsc--out validationmodule.js Validation.ts[…]ValidationExport.ts
时,tsc在尝试处理ValidationExport.ts
时会引发错误TS2304:找不到名称“module”。
!我正要发布一个类似的修复程序,使用这个声明declarevar模块但是你比我快了几秒钟…先生,你这篇文章让我很开心。我一直在尝试只能部分解决我的问题的解决方案,但这个想法已经100%解决了。谢谢*
tsc --out validationmodule.js Validation.ts ZipCodeValidator.ts LettersOnlyValidator.ts ValidationExport.ts
var Validation = require("./validationmodule");
var zipCodeValidator = new Validation.ZipCodeValidator();
var lettersOnylValidator = new Validation.LettersOnlyValidator();
console.log(zipCodeValidator.isAcceptable("16211"));
console.log(lettersOnylValidator.isAcceptable("5555"));