2015-09-10 7 views
6

При попытке заставить Angular (1.x) работать с systemjs я понял, что в настоящее время нет возможности (я знаю) автоматически вставлять $inject в угловые компоненты, что заставляет компоненты работать, даже когда аргументы функций искалечены майниром. Ручное создание аннотаций $inject является утомительным, подверженным ошибкам и нарушает принцип DRY.Могут ли плагины SystemJS изменять уже перенесенные файлы?

Существует зрелый модуль npm под названием ng-annotate, который решает эту проблему и используется во многих подобных ситуациях для комплектации. Поскольку я изучал SystemJS, я вижу, что есть плагиновая система, которая включает в себя возможность перевода исходного кода, что и делает то, что делает ng-annotate.

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

Другие стратегии, позволяющие использовать ng-annotate в конвейере погрузчика с системой SystemJS, также будут оценены.

+0

Почему вы не используете встроенную аннотацию массива? –

+0

Потому что стиль кода, который я пишу, не способствует этому. Я пишу в Typcript, где большинство моих сервисов заканчиваются как классы, и я регистрирую свои службы с модулем в отдельном файле, а не в том же файле, что и служба. Кроме того, как и с '$ injection', это нарушает * DRY *. Наконец, угловая не является основной темой вопроса. –

ответ

2

В конце концов я понял способ, но это чувствует себя очень неуклюжим. 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 в настоящее время являются тупиковыми (исходные карты TypScript по-прежнему разоряются), но, вероятно, вы также можете вернуть обещание.

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