Должно ли трансформированное приложение Dart быть одним файлом?

Допустим, я делаю приложение, в котором мне нужно регулярно отправлять обновления на клиентскую сторону. Теперь большинство этих обновлений будут влиять только на мой собственный код, а не на библиотеки, которые формируют мои зависимости. Насколько мне известно, преобразователь, который я буду использовать при вызове pub build, возьмет все мои библиотеки, зависимости и все остальное и скомпилирует их вместе в один файл web/main.dart.js. Это чем-то напоминает мне статическое связывание, как в таких языках, как C++.

По понятным причинам такая компиляция — это то, что вам нужно делать только при окончательном развертывании приложения. Для большинства людей достаточно просто использовать dartium и напрямую работать с иерархией .dart. Однако что, если бы я тестировал в браузере javascript, например, пробовал код dart:js. Я бы не хотел перекомпилировать все angular и друзей, когда они остаются совершенно нетронутыми. Мой конкретный случай — это желание использовать службы CDN для статических файлов в моем приложении.

AngularDart, как мой пример, вносит массивные 22 000 строк в мой скомпилированный javascript, и если я изменю одну мелочь в своем собственном приложении, я могу поцеловать 304 NOT MODIFIED до свидания, не говоря уже об экономии CDN, за эту большую часть нетронутый угловой.

При всем при этом есть ли способ разъединить зависимости в трансформированном приложении дротика? Могу ли я «динамически связать» свои библиотеки dart? И, кроме того, могу ли я гипотетически распространять свои библиотеки dart как dart.js для использования в другом преобразованном коде?


person TERMtm    schedule 06.03.2015    source источник
comment
Чтобы сократить время загрузки, вы можете разделить на несколько файлов, используя отложенную загрузку. Также ведется работа по инкрементной компиляции в dart2js, так что перекомпилировать нужно только измененный код. Это сокращает время компиляции во время тестирования. Невозможно динамически связать библиотеки dart таким образом, чтобы решить ваш вариант использования CDN.   -  person Greg Lowe    schedule 06.03.2015


Ответы (1)


Нет, это так не работает. Это могло бы сработать, если бы развертываемый файл содержал все зависимости, но это не так.
Сборка pub включает только тот код, который фактически используется в вашем приложении (сотрясение дерева), и обычно это лишь небольшая часть зависимости. Изменение одного символа в вашем коде может потребовать включения кода, отличного от ваших зависимостей. Я думаю, что Treeshaking имеет гораздо больший эффект, чем кэширование.

person Günter Zöchbauer    schedule 06.03.2015
comment
Понятно, однако я чувствую, что некоторые библиотеки могут иметь больше живого кода, чем мертвого; в любом случае это общий идеал. На данный момент библиотеки могут внести огромный вклад в приложение, поэтому я и спрашиваю. Даже простой hello-world в конечном итоге становится огромным, и вы можете подумать, что в нем много мертвого кода. Я понимаю ваше мнение, но лично я не согласен с тем, что тряска деревьев на данный момент не более чем несущественна. Это особенно верно, когда скомпилированное приложение hello-world angular больше, чем его аналоги JS вместе взятые... - person TERMtm; 10.03.2015
comment
Tree-shaking обычно работает довольно хорошо. Когда ваши выходные данные сборки слишком велики, возможно, что-то не так с вашим процессом сборки или с вашим кодом или кодом в зависимостях (использование зеркал). Насколько я знаю, hello world становится около 200k (без Angular, не помню с Angular). Если это огромно для вашего Dart, вероятно, это не правильный инструмент для вашего проекта. Если ваш вывод намного больше, вероятно, что-то не так с тем, как вы строите. Обычно от этого начального размера размер не увеличивается быстро за счет добавления пользовательского кода. - person Günter Zöchbauer; 10.03.2015