Создание одного модуля 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.

Другие вопросы по тегам