Представляем Dart 2.8!

Перевод статьи Announcing Dart 2.8

Сегодня мы представляем вам новую версию Dart SDK — 2.8! Сообщество Dart растет, и миллионы разработчиков Flutter используют Dart как язык для создания приложений на любой платформе. Мы продолжаем работать над завершением новой функциональности обеспечения null-безопасности (null safety), чтобы сделать Dart еще более оптимизированным языком для создания быстрых и стабильных пользовательских интерфейсов, но также у нас есть и новый функционал, направленный на продуктивность при управлении зависимостями.

Платформа Dart обладает встроенной поддержкой управления пакетами с помощью пользовательского инструмента и хранилища пакетов pub.dev, которое увеличилось на 200% за последний год и сейчас содержит примерно 10000 пакетов. Частью улучшения системы Dart являются два изменения пользовательского инструмента pub: улучшенная производительность pub get и новый инструмент для обеспечения актуальности зависимостей ваших пакетов.

Также изменения в Dart 2.8 коснулись языка и библиотек, они заложили основу для первой версии null-безопасности.

Представляем Dart 2.8

Основные изменения на пути к null-безопасности (null safety)

Распространенным источником сбоев работы приложений является код, который пытается использовать переменную с null значением. Сэр Тони Хоар (Sir Tony Hoare), который ввел нулевые ссылки на языке программирования ALGOL в 1965 году, назвал их «ошибкой в миллиард долларов» в своем выступлении на QCon в 2009 году. В некоторых случаях null значения могут быть полезны, однако определить эти случаи сложно. Весь прошлый год мы создавали всеобъемлющее решение для null-безопасности в Dart. Эта поддержка расширит типовую систему для выражения переменных, которые никогда не равны null (non-nullable), но, кроме того, Dart компиляторы и runtime выполнение смогут доверять этим типам и смогут создавать оптимизированный код, при котором система типов гарантирует, что переменная не равна null.

Понятно, что это большая задумка, имеющая множество нюансов. Чтобы гарантировать null- безопасность с чистой семантикой, мы решили внести небольшие изменения в язык и библиотеки Dart, которые обеспечат удобство использования и производительность, связанные с null значением. Мы надеемся, что влияние этих изменений, которые были представлены в списке объявлений Dart, будет минимальным для обычного кода приложения. Если у вас возникли какие-либо проблемы с Dart 2.8, мы рекомендуем ознакомиться с основными изменениями, их описанием и шагами по переходу. Если проблема не решится, пожалуйста, отправьте нам отчет о ней. Для предварительного просмотра функционала null-безопасности в DartPad перейдите по ссылке.

null-безопасности в DartPad
Скриншот дополнен к оригинальной статье

Улучшенная экосистема пакетов

Менеджер пакетов и сайт pub.dev поддерживают постоянно растущую экосистему для Dart и Flutter. Около 10000 пакетов доступно на pub.dev; нашей основной задачей было помочь авторам создавать качественные и интересные пакеты, а разработчикам приложений — найти их. Например, мы добавили улучшенный поиск на pub.dev, проверенных издателей и избранное Flutter.

Сегодня мы можем заявить о гораздо лучшей производительности при извлечении пакетов из репозитория pub.dev и о новом инструменте, который поможет обновлять зависимости пакетов. Учитывая сложность современных приложений, ваше приложение, вероятно, зависит от десятков пакетов. Но как обновлять их до последней версии, чтобы получить самые последние зависимости со всеми исправленными ошибками и улучшениями производительности? В Dart 2.8 вы можете использовать pub outdated — новый инструмент для автоматического определения, какие из ваших зависимостей должны быть обновлены до последних версий.

Улучшение производительности инструмента pub в Dart 2.8

Мы улучшили производительность инструмента pub, добавив поддержку параллельной выборки пакетов при запуске pub get и отложив предварительную компиляцию pub.
В тестовом запуске flutter pub get для нового проекта, созданного с помощью flutter create, общее время выполнения уменьшилось с примерно 6.5 секунд во Flutter 1.12 (который использует Dart 2.7) до 2.5 секунд во Flutter 1.17 с Dart 2.8. А в более крупном приложении, Flutter gallery, время уменьшается с 15 до 3 секунд!

Управление зависимостями с pub outdated


Зависимости в коде Dart фиксируются в файле pubspec. При извлечении пакетов из pub.dev с помощью команды pub get средство определения версии pub (использующее алгоритм PubGrub) запускает процесс для определения последнего возможного набора версий всех зависимостей, который удовлетворял бы ограничениям, указанные в вашем pubspec. Обратите внимание, что pub использует схему одной версии, где каждый пакет включен в приложение только с одной версией; это обеспечивает минимальный размер приложения.

Лучшая практика – это использование последних, стабильных версий пакетов, что может быть трудоемким делом. Dart поддерживает обновление до последних версий, которые семантически совместимы, используя pub upgrade, но включать новые основные версии пакетов без обновления pubspec — невозможно. Команда pub outdated помогает понять, если доступны как основные, так и второстепенные версии, сравнивая используемые в настоящее время версии с последними доступными на pub.dev.

Давайте рассмотрим конкретный пример. Представьте, что вы создаете приложение, и его pubspec.yaml содержит:

Вы запускаете pub get, и он создает файл pubspec.lock со следующими версиями:

Проходит несколько месяцев, и в pub.dev появились новые версии foo (1.3.1) и bar (2.1.0 и 3.0.3).
Как вы узнали, что эти новые версии стали доступны?
Для второстепенных обновлений версий (foo 1.4.0 и bar 2.1.0) можно запустить обновление ** pub upgrade**, но это не даст bar 3.0.0. Чтобы обнаружить эту новую версию, вам нужно просмотреть каждый пакет на pub.dev и посмотреть его последнюю версию. В качестве альтернативы можно использовать, например, проверку версий Паулины Шклярской или помощника pubspec Йерона Мейера.

Теперь же Dart SDK поддерживает обнаружение новых версий с помощью pub outdated. Если вы используете IDE с поддержкой Dart или Flutter, используйте pub outdated, который отображается, когда файл pubspec.yaml открыт. Или же вы можете запустить pub outdated из терминала:

Вывод в терминале говорит нам, что мы можем автоматически обновиться до foo версии 1.3.1 с pub upgrade, что даст нам последнюю доступную версию foo. Но это также говорит нам о том, что, хоть мы и можем автоматически обновиться до версии 2.1.0, также есть доступная версия 3.0.3. Поскольку обновление до версии 3.0.3 является основным обновлением, мы должны дать согласие на это обновление, отредактировав файл pubspec.yaml:

После того, как мы это сделаем и запустим pub upgrade, pub outdated сообщит нам, что все зависимости обновлены до последних версий:

Вот и все! Поскольку мы только что подобрали новые версии, в том числе и основную, мы должны проанализировать любые потенциальные критические изменения в этих версиях и запустить тестирование, чтобы убедиться, что приложение по-прежнему работает должным образом.

Последующие задачи

Улучшение производительности, критическое изменение и новая команда pub outdated уже доступны в новом Dart 2.8 SDK и во Flutter 1.17 SDK. Попробуйте запустить pub outdated уже сегодня и проверьте состояние ваших зависимостей!

При обнаружении проблем, сообщите о них в систему отслеживания ошибок в pub или в систему отслеживания ошибок SDK. Отзывы о работе pub outdated можно оставить комментарием по ссылке или отправив твит @dart_lang.

Подборка заметок