Исключение компилятора Dart2JS при использовании minify в пакете google_maps

Я создаю веб-приложение с Dart и AngularDart на Google Maps. Я заметил проблему с самого начала процесса, хотя я тестировал SDK Dart для разработки, а сегодня — последнюю версию SDK dart (версия 1.0.0.10_R30798) и все еще сталкиваюсь с проблемой.

Во-первых, я использую пакеты shadow_dom, google_maps и AngularDart.

Когда я создаю свое приложение с опцией --no-minify, оно отлично работает, даже во всех браузерах после того, как я возился с shadow_dom в течение недели (я должен добавить сценарий shadow_dom ДО того, как все остальное заработает должным образом).

Проблема в том, что когда я собираю нормально (минимизирую) или даже напрямую использую компилятор Dart2JS с параметром --minify, приложение не запускается, и я получаю исключение.

Неминифицированная версияМинифицированная версия

Выше вы можете увидеть два случая, когда в первом приложение правильно загружает карты Google, а на втором изображении карты Google не загружаются, и я получаю это исключение.

Что еще более важно, если я использую сторонний минификатор для минимизации исходного файла main.dart.js (неминифицированного), он работает отлично.

Спасибо


person Lambros Petrou    schedule 08.01.2014    source источник
comment
Какова версия вашего пакета google_maps?   -  person Alexandre Ardhuin    schedule 08.01.2014
comment
В пакетах внутри моей папки написано 2.0.3. Я установил паб, а затем уже обновил паб.   -  person Lambros Petrou    schedule 08.01.2014
comment
Длинный выстрел, но есть некоторые ресурсы, которые получают ошибку 404. Они связаны? Это какие-то файлы .js, необходимые для приложения дротика?   -  person MarioP    schedule 08.01.2014
comment
Нет, main.dart не найден, потому что я использую код JS вместо кода дротика в производстве.   -  person Lambros Petrou    schedule 08.01.2014
comment
Мы скоро выпустим новую версию SDK (надеюсь, в ближайшие несколько дней). Если вы по-прежнему сталкиваетесь с этой проблемой, отправьте сообщение об ошибке на dartbug.com (в идеале с оригинальным исходным кодом). Спасибо.   -  person Florian Loitsch    schedule 08.01.2014
comment
Хорошо, я попробую новую версию, как только она выйдет. Что касается исходного кода, это может быть сложно, так как это внутренний проект, но я предоставлю исходный код, демонстрирующий проблему.   -  person Lambros Petrou    schedule 09.01.2014


Ответы (2)


В 2.x версии пакета google_maps удалена зависимость от dart:mirrors и основан только на dart:js. Таким образом, проблема минимизации должна исходить из другой части вашего кода.

Кроме того, я только что протестировал пример простой карты с --minify, и это работает.

person Alexandre Ardhuin    schedule 08.01.2014
comment
Хм, дело в том, что перед загрузкой карты выполняется только Http GET-запрос, и, как видите, карта даже не отображается. Тогда я отлажу его более тщательно, если проблема где-то еще в AngularDart. - person Lambros Petrou; 08.01.2014

Обычно это можно решить с помощью аннотации @MirrorsUsed, если затрагивается сторонний код.
Проще использовать собственный код, где вам просто нужно добавить @reflectable к затронутым функциям/методам/полям, чтобы обеспечить их сохранение.

Может быть трудно найти, какие функции/методы/поля должны быть включены, когда имена минимизированы. Возможно, вы сможете получить некоторые знания, посмотрев на трассировку стека.

Минификация обычно отбрасывает код, на который нигде нет ссылок. В Polymer это связано с тем, что выражения полимера {{ expr }} в HTML еще не учитываются. Если вы вызываете части кода только путем отражения, это также не распознается.

У меня нет опыта работы с Angular и минификацией.
Это всего лишь общий совет о проблемах с минификацией через pub build.

person Günter Zöchbauer    schedule 08.01.2014
comment
Да, но проблема в том, что я уже добавил пакет google_maps, который использую, в цели @MirrorsUsed. В основном я добавил все пакеты, которыми пользуюсь, чтобы быть уверенным, что речь не о них. - person Lambros Petrou; 08.01.2014
comment
Я видел, что для Angular пакеты добавляются в @MirrorsUsed. Я не уверен, как именно это работает. Я предполагаю, что это уведомляет dart2JS о том, что весь код, на который не ссылаются, может быть удален для достижения лучших результатов с минификацией, потому что это обычно упоминается, когда размер полученного кода слишком велик. Чтобы сохранить код, который удаляется по умолчанию, вы должны явно указать функции/методы/поля, чтобы они были сохранены. Как уже упоминалось, я недостаточно знаю о влиянии добавления пакетов. - person Günter Zöchbauer; 08.01.2014
comment
Да, я знаю это, и я добавил много пакетов angular, но кажется, что нужно больше. Я начну с того, что добавлю все, а затем удалю по одному и посмотрю, как пойдет. Спасибо. На данный момент у меня есть: «angular», «angular.core», «angular.core.dom», «angular.core.parser», «angular.routing», NodeTreeSanitizer, «angular.filter», «angular. perf», «perf_api», «angular.directive», ) в качестве целей, если кто-то обнаружит проблему. - person Lambros Petrou; 08.01.2014