Создание одного модуля CommonJS из нескольких классов TypeScript
Я пытаюсь найти лучший способ разделить мое приложение на несколько модулей CommonJS, которые могут использоваться другими приложениями.
У меня есть 5 классов TS, и я хотел бы объединить их в один модуль CommonJS. Затем я собираюсь опубликовать этот модуль в частном репозитории NPM, чтобы его могли использовать другие приложения. В идеале я хотел бы упаковать в него соответствующие файлы определений *.d.ts.
Какой лучший способ сделать это? Я использую внешние модули TS, но они создают отдельный модуль CommonJS для каждого класса TS.
2 ответа
Насколько я знаю, машинопись еще не поддерживает объединение внешних модулей. Из их вики на codeplex:
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);
}
}
}
Если вы скомпилируете их с параметром --out в tsc compiler
Вы можете объединить их в один файл. Однако это не делает их модулем CommonJS. Чтобы экспортировать их, вы используете трюк для добавления еще одного файла TS с именем ValidationExport.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 на файл совершенно уместно. Все require
вызовы в TypeScript переведут на CommonJS require
звонки в JavaScript, а .d.ts
файлы будут подобраны в процессе. (Если вы делаете что-то глупое, как require
классы вне вашей исходной директории... стоп.)
Вам нужно будет рассмотреть этап упаковки, только если вы намеревались использовать этот пакет NPM в других приложениях, и в этом случае посмотрите на Browserify.