Вышла новая версия языка Dart — 3.4. Появились обновления для WebAssembly и предварительная версия макроса JsonCodebale. Исправлено более 50% ошибок анализатора.
Читайте первый перевод официального релиза с комментариями от Юрия Петрова, Flutter Tech Lead в Friflex и автора тг-канала Мобильный разработчик с комментариями.
Коротко, что нового:
Обновление для WebAssembly;
макрос JsonCodebale в предварительной версии;
исправлено более 50% ошибок анализатора;
улучшено согласование анализа типов условных выражений;
из библиотеки dart:cli удалены неполные и противоречивые инструменты;
устранено несколько недостатков для улучшения новой библиотеки.dart:js_interop.
Обновления WebAssembly
Теперь для веб-приложений Flutter доступна полная поддержка WebAssembly (Wasm). Если вы следили за Dart, то видели этапы развития Wasm:
Стандартизация предложения WasmGC,
Добавление нового бэкэнда компилятора Dart для генерации кода WasmGC
Обновление наших предложений по взаимодействию с Интернетом и JavaScript для лучшей поддержки Wasm.
Команда продолжит развивать WebAssembly. В новых релизах появится полная поддержка Wasm в чистых приложениях Dart и недостающие функции (например, отложенная загрузка). Комплексный инструментарий для компиляции Wasm в Dart еще в разработке, но вы можете попробовать предварительную версию. В следующих релизах должна появиться поддержка Wasm в Dart за пределами JS-сред, например, в стандартных средах Wasm: wasmtime и Wasmer.
Юрий Петров, руководитель отдела разработки на Flutter
Как разработчик, я чрезвычайно рад видеть, что полная поддержка WebAssembly наконец-то доступна для веб-приложений Flutter. Это огромный шаг вперёд для улучшения производительности и гибкости наших приложений. Я надеюсь, что писать приложения для Web на Flutter станет обычным делом. Ну а мы обязательно попробуем внедрить и протестировать это в наших проектах.
Макросы Dart: повышение уровня абстракции разработки
Команда много лет разрабатывала систему макросов Dart. Чтобы улучшить процесс разработки на Dart, макросы предлагают такое решение метапрограммирования, как генерация кода. Это решение встроено в язык. Оно обеспечивает максимальную производительность, эффективность и продуктивность разработки.
Давней болью разработчиков Dart был тривиальный, но утомительный шаблон сериализации и десериализации данных JSON. Создание многоразового достаточно мощного инструмента — непростое решение для Dart: из-за производительности он не поддерживает отражение. В качестве альтернативы команда использовала решения для генерации кода, например, JsonSerializable. Они зависят от внешних инструментов, которые запускаются до самого кода. Это усложняет работу разработчика.
В релизе 3.4 появилась предварительная версия радикально нового подхода к сериализации и десериализации JSON — макрос JsonCodable.
Макрос — это тип кода, который генерирует дополнительный код путем анализа другого кода во время компиляции. Например, вот класс Vehicle с примененным новым макросом JsonCodable
:
@JsonCodable()
class Vehicle {
final String description;
final int wheels;
Vehicle(this.description, this.wheels);
}
void main() {
final jsonString = Vehicle('bicycle', 2).toJson();
print('Vehicle serialized: $jsonString');
}
Итак, как это работает? Откуда взялся toJson()
метод (и сопутствующий fromJson()
конструктор)?
Это экспериментальная реализация новой системы макросов, которая должна упростить работу разработчиков. Когда компилятор Dart видит @JsonCodable()аннотацию, он немедленно находит определение макроса JsonCodable в реальном времени и начинает его выполнять. Это приводит к тому, что макрос:
Создает новый "augmentation class"; новая языковая конструкция, позволяющая добавлять новые объявления к существующим классам.
Считывает определение класса, данное разработчиком,
Vehicle
, чтобы определить, что он имеет два поляdescription
иwheels
.Добавляет новую
toJson
сигнатуру метода в класс расширения.Заполняет тело метода
toJson
для обработки сериализации полейdescription
иwheels
.
Все это макрос делает моментально. Интегрированный интерфейс поддерживает существующие рабочие процессы, например, горячую перезагрузку. Пример на скринкасте:
Долгосрочные цели для Макросов
Конечная цель команды — дать сообществу Dart возможность создавать свои собственные макросы. Макросы повысят уровень абстракции программирования на Dart. Возьмем, например, классы данных, функцию языка Dart, которая получила наибольшее количество голосов.
Команда планировала добавить встроенную поддержку классов данных в Dart, но мнения в сообществе существенно разошлись. Что должна поддерживать такая конструкция, чтобы самостоятельно устанавливать стандарты? Может быть, поля immutable? Должна ли она поддерживать равенство? Как насчет hashCode? Или toString? В итоге команда решила использовать поддержку макросистемы. А сообщество сможет создавать свои собственные абстракции для более масштабных экспериментов.
Разработка и внедрение такой мощной макросистемы — это серьезная задача. Макросистема не должна негативно влиять на производительность основных сценариев использования, например, на завершение кода, анализ кода, горячую перезагрузку. Поэтому работа идет поэтапно:
В релизе 3.4 появилась предварительная версия одного макроса, JsonCodable,с которой пользователи могут ознакомиться.
Если развертывание макроса пройдет успешно, JSON перейдет в стабильную версию в будущих релизах.
Параллельно идет работа над завершением проектирования и реализации базовой макросистемы. Как только система будет готова, у разработчиков появится возможность создавать собственные макросы.
А пока вы можете познакомиться с документацией, чтобы узнать больше о системе макросов Dart и опробовать предварительную версию макроса JsonCodable.
Юрий Петров, руководитель отдела разработки на Flutter
Все мы ждем Макросы, я очень жду. Мне как и многим разработчикам со временем и опытом становится понятно, что генерация кода реализованная с помощью freezed или json_serializable мягко говоря не совсем оптимальная. Макросы должны решить эту проблему. Понятно, что многие ждали простых Data классов, как например в Kotlin. Но комментарии разработчиков по поводу этого довольно аргументированы. В принципе, если система макросов будет работать так как задумывалось разработчиками, то отдельные Data классы будут не нужны. Как только разработчики научатся и примут макросы, я уверен, что они будут очень классным инструментом. Макросы введены как экспериментальная функция, и требует версии языка 3.5.0-152 и выше. Надеюсь, с выходом стабильной версии языка 3.5, макросы будут введены как стандартный инструмент.
Другие улучшения
Как всегда, этот выпуск содержит все постоянные разработки, направленные на создание наилучшей версии Dart. В этом выпуске мы внесли следующие улучшения:
Исправлено более 50% ошибок завершения кода анализатора. (Пожалуйста, продолжайте сообщать о проблемах !)
Улучшено согласование анализа типов условных выражений, выражений
if-null
и выражений переключения со спецификацией языка (журнал изменений).Из библиотеки
dart:cli
удалены неполные и противоречивые инструменты для погашения технического долга в виртуальной машине Dart.Устранено несколько недостатков для улучшения новой библиотеки.
dart:js_interop
Чтобы узнать полную историю, ознакомьтесь с журналом изменений ! Не забудьте прочитать публикацию в блоге Dart и Flutter для этого выпуска, чтобы узнать полную историю наших совместных усилий!
P.S. Мы ведем дружелюбный канал про Flutter в Telegram. Присоединяйтесь!