Могут ли плагины 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 по-прежнему отключены), но, вероятно, вы также можете вернуть обещание.

Я оставлю этот ответ на некоторое время не выбранным, чтобы узнать, есть ли у кого-нибудь лучший совет.

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