Заменить '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. Хотя это разрешит путаницу между тем, что подразумевается под "внутренним" или "внешним", я не думаю, что это полностью решит путаницу в отношении объединения двух шаблонов.
Учитывая вашу репутацию Стив, я убежден
Никто не имеет репутации, которая означает, что их слово должно быть безупречным - поэтому используйте свой собственный опыт, чтобы принять окончательное решение. В этом случае вы должны почувствовать, что комбинация внутренних и внешних модулей создает неудобный код без каких-либо дополнительных преимуществ; но я могу ошибаться