Могут ли плагины SystemJS изменять уже переданные файлы?
Пытаясь заставить Angular (1.x) работать с systemjs, я понял, что в настоящее время нет возможности (о которой я знаю) автоматически вставлять $inject
в угловые компоненты, которые поддерживают работу компонентов, даже когда аргументы функций искажаются минификатором. Создание вручную $inject
аннотации утомительны, подвержены ошибкам и нарушают принцип DRY.
Существует зрелый модуль npm, который называется ng-annotate
которая решает эту проблему и используется во многих подобных ситуациях для комплектации. Когда я изучал SystemJS, я вижу, что существует система плагинов, которая включает в себя возможность переводить исходный код, и это именно то, что ng-annotate
делает.
Однако из того, что я вижу, SystemJS дает вам только возможность привязать конкретное расширение файла к одному загрузчику, и все примеры плагинов должны поддерживать новый тип файла. То, что я хотел бы сделать, - это постобработать вывод процесса переноса SystemJS, а не добавлять новый тип файла. Кажется, что SystemJS должен быть в состоянии сделать это, поскольку у него есть конвейер обработки, но я не могу понять, как правильно подключиться к нему. Прямо сейчас я использую Browserify для достижения того же эффекта, но у меня сложился довольно сложный набор задач по сборке, и я хотел бы упростить его с SystemJS, если это возможно.
Другие стратегии, чтобы иметь возможность использовать ng-annotate
в конвейере загрузчика с SystemJS тоже был бы признателен.
1 ответ
В конце концов я нашел способ, но это кажется неуклюжим. System.src
сам использует hook()
Функция для этого, но она не экспортируется для использования. Я был бы благодарен за любые способы улучшить это, и я надеюсь, что в конечном итоге станет доступен правильно поддерживаемый механизм для объединения функций загрузчика:
var System = require('systemjs');
var systemTranslate = System.translate;
System.translate = function(load) {
return systemTranslate.call(this, load).then(function (result) {
if (result) {
var processedResult = result; // Do your processing here.
load.source = processedResult;
}
return load.source;
});
}
Я не много экспериментировал с этим, поскольку мои конкретные варианты использования для сборки System.js в настоящее время тупиковые (исходные карты Typescript по-прежнему отключены), но, вероятно, вы также можете вернуть обещание.
Я оставлю этот ответ на некоторое время не выбранным, чтобы узнать, есть ли у кого-нибудь лучший совет.