[Перевод] Вышел Dart 3.4
Dart 3.4 вышел сегодня! Это выпуск, демонстрирующий совместные усилия команд Dart и Flutter в посте Flutter 3.22 / Dart 3.4 / IO24, так что не забудьте ознакомиться с полной информацией там. В этом посте мы представляем нашу поддержку WebAssembly, а затем подробно расскажем об одной из основных задач для языка Dart в этом году: макросы.
Коротко, что нового:
Обновление для WebAssembly;
макрос JsonCodebale в предварительной версии;
исправлено более 50% ошибок анализатора;
улучшено согласование анализа типов условных выражений;
из библиотеки dart: cli удалены неполные и противоречивые инструменты;
устранено несколько недостатков для улучшения новой библиотеки.dart: js_interop.
Обновления WebAssembly
Сегодня мы рады объявить, что полная поддержка WebAssembly (Wasm) доступна для веб-приложений Flutter в последней стабильной версии Flutter 3.22!
Это были многолетние инвестиции в Dart & Flutter. Если вы следили за развитием событий, вы видели наши постепенные разработки:
Стандартизация предложения WasmGC,
Добавление нового бэкэнда компилятора Dart для генерации кода WasmGC
Обновление наших предложений по взаимодействию с Интернетом и JavaScript для лучшей поддержки Wasm.
Мы продолжим инвестировать в WebAssembly. Наше следующее усилие обеспечит полную поддержку Wasm в чистых приложениях Dart и дополнит несколько недостающих функций (например, отложенную загрузку). Комплексный инструментарий для компиляции Wasm в Dart все еще находится в стадии разработки, но вы можете попробовать предварительную версию в стабильной версии уже сейчас, выполнив некоторые временные шаги. Позже мы также надеемся поддержать Wasm в Dart за пределами JS-сред, например, в стандартных средах выполнения Wasm, таких, как wasmtime и Wasmer.
Как разработчик, я чрезвычайно рад видеть, что полная поддержка WebAssembly наконец-то доступна для веб-приложений Flutter. Это огромный шаг вперёд для улучшения производительности и гибкости наших приложений. Я надеюсь, что писать приложения для Web на Flutter станет обычным делом. Ну, а мы обязательно попробуем внедрить и протестировать это в наших проектах.
Макросы Dart: повышение уровня абстракции разработки
Мы вложили много лет в разработку системы макросов Dart. Чтобы улучшить процесс разработки в Dart, макросы предоставляют решение метапрограммирования, такое, как генерация кода. Это решение встроено в язык Dart, чтобы обеспечить разработчикам максимальную производительность, эффективность и продуктивность разработки. Теперь мы готовы предложить предварительный обзор этого опыта!
Давней болью для разработчиков Dart был тривиальный, но утомительный шаблон сериализации и десериализации данных JSON. Создание многоразового, достаточно мощного решения является непростой задачей в Dart, поскольку Dart не поддерживает отражение во время выполнения из соображений производительности. В качестве альтернативы мы использовали решения для генерации кода, такие как JsonSerializable. Они зависят от внешних инструментов, которые запускаются до самого кода, что усложняет работу разработчика.
Сегодня мы объявляем о предварительной версии радикально нового подхода к сериализации и десериализации 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, но узнали, что мнения существенно разошлись относительно того, что должна поддерживать такая конструкция, чтобы самим устанавливать стандарты. Должны ли быть поля immutable
? Должен ли он поддерживать равенство? Как насчет hashCode
? Может быть, toString
тоже? Мы пришли к выводу, что поддержка макросистемы будет лучшим подходом. Сообщество может создавать свои собственные абстракции, обеспечивая более масштабируемые эксперименты и разнообразие.
Разработка и внедрение такой мощной макросистемы — это серьезная задача. Мы полны решимости сделать это таким образом, чтобы не оказывать негативного влияния на производительность основных сценариев использования Dart-разработчиками, таких, как помощь и завершение кода, анализ кода и горячая перезагрузка. Имея это в виду, мы применяем поэтапный подход:
В сегодняшнем выпуске мы делаем предварительную версию одного макроса,
JsonCodable
чтобы пользователи могли начать знакомиться с опытом использования макроса разработчиками.Если развертывание этого макроса пройдет успешно, мы надеемся перевести макрос JSON в стабильную версию в более позднем выпуске.
Параллельно мы работаем над завершением проектирования и реализации базовой макросистемы. Как только мы почувствуем уверенность в его производительности и стабильности, конечной целью станет предоставление сообществу разработчиков Dart возможности определять свои собственные макросы.
Для завершения этих этапов предстоит еще много работы. А пока вы можете прочитать документацию, чтобы узнать больше о системе макросов Dart, и опробовать предварительную версию макроса JsonCodable уже сегодня.
Все мы ждем Макросы, я очень жду. Мне как и многим разработчикам со временем и опытом становится понятно, что генерация кода реализованная с помощью freezed или json_serializable мягко говоря не совсем оптимальная. Макросы должны решить эту проблему. Понятно, что многие ждали простых Data классов, как например в Kotlin. Но комментарии разработчиков по поводу этого довольно аргументированы. В принципе, если система макросов будет работать так как задумывалось разработчиками, то отдельные Data классы будут не нужны. Как только разработчики научатся и примут макросы, я уверен, что они будут очень классным инструментом. Макросы введены как экспериментальная функция, и требует версии языка 3.5.0–152 и выше. Надеюсь, с выходом стабильной версии языка 3.5, макросы будут введены как стандартный инструмент.
Другие улучшения
Как всегда, этот выпуск содержит все постоянные разработки, направленные на создание наилучшей версии Dart. В этом выпуске мы внесли следующие улучшения:
Исправлено более 50% ошибок завершения кода анализатора. (Пожалуйста, продолжайте сообщать о проблемах !)
Улучшено согласование анализа типов условных выражений, выражений
if-null
и выражений переключения со спецификацией языка (журнал изменений).Из библиотеки
dart:cli
удалены неполные и противоречивые инструменты для погашения технического долга в виртуальной машине Dart.Устранено несколько недостатков для улучшения новой библиотеки.
dart:js_interop
Чтобы узнать полную историю, ознакомьтесь с журналом изменений ! Не забудьте прочитать совместную публикацию в блоге Dart и Flutter для этого выпуска, чтобы узнать полную историю наших совместных усилий!