Заменить 'require' в связке Typescript

У меня есть основной файл TypeScript с импортом в другой файл, например так:

import './app.run';

Я использую tsproject для компиляции моих файлов ts в один пакет, а затем использую System JS на моей html-странице следующим образом:

System.import('app/app.module');

Но в моем пакете все импорты файлов заменены на операторы commonjs require, например:

require('./app.run');

Пока нет больше app.run файл присутствует, потому что все в комплекте. Как правильно связать ts без импорта внешних файлов?

1 ответ

Решение

В самой последней версии TypeScript ( которая на момент написания статьи составляла 1.5) вы должны использовать стиль импорта модулей ES6:

import * as Alias from "./app.run";

И скомпилировать с SystemJS вид модуля.

tsc --module systemjs app.ts

Это должен быть самый простой путь к тому, что вы хотите. Поддержка SystemJS является новой для 1.5.

Замечания о внутренних / внешних модулях...

Было много путаницы по поводу внутренних и внешних модулей, но мой (сильный) совет по этому вопросу заключается в том, что вы не должны смешивать внутренние и внешние модули.

Идея, лежащая в основе внутренних модулей, заключалась в том, чтобы имитировать общий шаблон, используемый при написании JavaScript, чтобы скрыть информацию, а не помещать ее в глобальную область. Дуг Крокфорд распространил слово об этом. По сути, если у вас есть этот JavaScript:

var name = 'Nicky';
function sayHello() {
    return 'Hello ' + name;
}

Вы могли бы взять name а также sayHello выйдите из глобальной области видимости и сократите свое присутствие до одной переменной:

var myNamespace = (function() {
    var name = 'Nicky';
    return {
        sayHello: function () {
            return 'Hello ' + name;
        }
    };
}());

Это замечательно, потому что есть шанс, что другая библиотека определит name или же sayHello и тот, который загружен последним, победит.

С внешними модулями файл является модулем. На самом деле это лучше, чем в примере с пространством имен, приведенным выше, потому что в глобальной области видимости ничего не заканчивается Когда вы загружаете модуль, вы называете его локальным именем, и загрязнение отсутствует. По этой причине вам не нужно организовывать ваши внешние модули во внутренние модули или пространства имен. Фактически, попытка сделать это делает ваш код хуже, а не лучше.

Команда TypeScript переименовывает внутренние модули в "пространства имен" - см. Примечание в разделе "Упрощение модулей" в заметках о выпуске TypeScript 1.5. Хотя это разрешит путаницу между тем, что подразумевается под "внутренним" или "внешним", я не думаю, что это полностью решит путаницу в отношении объединения двух шаблонов.

Учитывая вашу репутацию Стив, я убежден

Никто не имеет репутации, которая означает, что их слово должно быть безупречным - поэтому используйте свой собственный опыт, чтобы принять окончательное решение. В этом случае вы должны почувствовать, что комбинация внутренних и внешних модулей создает неудобный код без каких-либо дополнительных преимуществ; но я могу ошибаться

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