从几个TypeScript类创build一个CommonJS模块
我试图找出将我的应用程序分割成几个可供其他应用程序使用的CommonJS模块的最佳方法。
我有5个TS类,我想把它们作为一个CommonJS模块捆绑在一起。 然后我打算把这个模块发布到一个私有的NPM库,这样它可以被其他应用程序使用。 理想情况下,我想打包相关的* .d.ts定义文件。
什么是最好的方法来做到这一点? 我正在使用外部TS模块,但是这些模块为每个TS类生成一个单独的CommonJS模块。
据我所知打字稿不支持组合外部模块呢。 从codeplex上的wiki:
TypeScript在外部模块源文件和它们发射的JS文件之间具有一对一的对应关系。 其中一个影响就是无法使用–out编译器开关将多个外部模块源文件连接成一个JavaScript文件。
不过,你可以通过在打字稿中使用内部模块来实现,因为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命令将所有东西编译成一个名为“validationmodule.js”的文件:
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"));
为每个文件分配一个CommonJS模块是完全合适的。 在TypeScript中所有require
调用都将转换为JavaScript中的CommonJS require
请求调用,并且.d.ts
文件将在过程中被拾取。 (如果你正在做一些愚蠢的事情,比如require
源代码目录之外的类… stop。)
如果您打算在其他应用程序中使用此NPM软件包,则只需考虑一个打包步骤,在这种情况下可以查看Browserify
- Babel + Typescript + NPM模块+ Webpack
- 设置validation的默认值
- 如何使用express和angular 2(打字稿)在待办事项列表中编辑标题
- 在使用Webpack构buildAurelia应用程序期间,找不到名称空间“Webpack”
- 如何configuration使用从PureScript编译的JavaScript模块的TypeScript项目?
- 如何使用npm将PDF.JS导入到Typescript中
- 如何查看从node.js发送到服务器的请求?
- 无法在typescript / angular2环境中设置持久会话,在后端设置nodejs
- 如何在源代码(用于自定义日志logging)在TypeScript中获取实际的行号