UglifyJS2 прерывает внедрение зависимостей в приложении Angular.js

У меня есть приложение Angular.js, которое я хочу минимизировать.

Прежде всего, я настроил определенный конвейер gulp для автоматической обработки аннотаций и минимизации.

Чтобы проверить, насколько хорошо работают неявные аннотации, я добавил аннотации, используя ngAnnotate, а затем запустил приложение с параметрами strict-di, чтобы поймать все пропущенные аннотации. Затем я добавил подсказки для комментариев ко всем отсутствующим аннотациям, которые я нашел. После этого все отлично работает, ngAnnotate автоматически аннотирует мой код, а strict-di больше не выдает предупреждений.

Однако, когда я на самом деле минимизирую свой код с помощью UglifyJS2, приложение не запускается, говоря, что какая-то служба не работает. т найти.

Вот фактическое сообщение об ошибке:

Ошибка изменения состояния Ошибка: [$injector:unpr] Неизвестный поставщик: tProvider ‹- t

Если я добавлю параметр mangle: false к UglifyJS2, он будет работать нормально.

— Так вот вопрос, как найти виновника и почему strict-di его не ловит?


person Slava Fomin II    schedule 31.03.2016    source источник
comment
Я отвечаю на эту проблему здесь: stackoverflow.com/a/36309546/4775223   -  person Wilmer SH    schedule 31.03.2016
comment
Спасибо @WilmerS, но ваш ответ не отвечает на мой конкретный вопрос. Я знаю, как работает DI, и я уже использую ngAnnotate. Проблема в том, что он не обрабатывает все случаи, и по какой-то причине strict-di не улавливает и эти случаи.   -  person Slava Fomin II    schedule 31.03.2016
comment
Я понимаю. Кажется, вы пробовали то же, что и я. Однако, с технической точки зрения, если вы явно вводите зависимости, удаление ngAnnotate из вашего канала не должно иметь значения. Такая же ошибка должна появиться. если нет, то ngAnnotate может иметь к этому какое-то отношение.   -  person Wilmer SH    schedule 31.03.2016
comment
Если вы явно не внедряете зависимости, я предлагаю вам это сделать. Я использую ngAnnotate в качестве защиты. Не как утилита для аннотаций.   -  person Wilmer SH    schedule 31.03.2016
comment
Хорошо, спасибо, но я собираюсь исследовать дальше. Явные аннотации делают код уродливым, а не СУХИМ. Я скорее пропущу эту практику, это не должны делать люди.   -  person Slava Fomin II    schedule 31.03.2016
comment
Хорошая точка зрения. Должен с вами согласиться, но гоняться за ошибками в минимизированном коде невозможно, а расследовать каждый раз, когда это происходит, требуется много времени. Если это произойдет дважды, это достаточная причина, чтобы изменить философию, пока не будет найдено лучшее решение.   -  person Wilmer SH    schedule 31.03.2016
comment
Единственная проблема заключается в том, что я конвертирую довольно большую существующую кодовую базу. В случае инкрементной разработки это не должно быть проблемой. Я уже давно использую такую ​​стратегию, и она отлично работает.   -  person Slava Fomin II    schedule 31.03.2016


Ответы (1)


Хорошо! Наконец-то мне удалось разобраться с этим вопросом.

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

Стратегия

У меня была довольно большая база кода, все было в одном файле JavaScript. Все зависимости, как сторонние, так и локальные, были прописаны в нем и в комплекте с плагином gulp.

Первое, что я сделал, это разбил код на два файла: vendor.js и application.js. Я переместил все сторонние зависимости в первый файл и оставил все локальные зависимости во втором. После этого я попытался запустить свое приложение с application.js минифицированным и vendor.js неминифицированным. Этот простой прием помог мне определить, что проблема была на самом деле в стороннем коде, а не в моем приложении.

На тот момент у меня было указано 34 внешних зависимости, поэтому я снова создал два файла vendor.js и vendor-cleared.js и начал перемещать зависимости из первого во второй (пополам). На этот раз я скомпилировал второй и оставил первый неминифицированным. После пары итераций я нашел проблемную стороннюю библиотеку, которая не была должным образом аннотирована.

Я исправил это и снова собрал все вместе в моем application.js. После этого мое приложение стало работать без нареканий.


Я надеюсь, что эта простая идея поможет вам преобразовать большую базу кода в правильно аннотированную и, наконец, минимизировать ее!

После этого просто проверьте, правильно ли работает минификация при добавлении новых зависимостей. И не забывайте всегда использовать strict-di. Работает не постоянно, но довольно хорошо.

person Slava Fomin II    schedule 31.03.2016