Anunciando Dart 3.4

¡Dart 3.4 ya está disponible! Esta versión muestra los esfuerzos conjuntos de Dart y Flutter juntos en el post de Flutter 3.22 / Dart 3.4 / IO24, por lo que…

Dart 3.4 ya está disponible. Este release muestra los esfuerzos conjuntos de Dart y Flutter en el post de Flutter 3.22 / Dart 3.4 / IO24 , así que asegúrate de leer todos los detalles ahí. Este post presenta nuestro soporte para WebAssembly, y luego detalla uno de los principales elementos de la hoja de ruta del lenguaje Dart de este año: macros.

Banner del release de Dart 3.4 con el logo de Dart y un ícono de diana.

Actualizaciones de WebAssembly

#

Hoy, nos complace anunciar que el soporte completo para WebAssembly (Wasm) está disponible para apps de Flutter Web con el último release estable de Flutter 3.22!

Esta ha sido una inversión de varios años en Dart y Flutter. Si has estado siguiendo los desarrollos, has visto nuestro progreso incremental:

  • Estandarizar la propuesta de WasmGC,

  • Añadir un nuevo backend del compilador de Dart para generar código WasmGC, y

  • Renovando nuestras ofertas de web y JavaScript interop para soportar mejor Wasm.

Continuaremos invirtiendo en WebAssembly. Nuestro próximo esfuerzo habilitará el soporte completo para Wasm en apps pure-Dart, y completará algunas funcionalidades faltantes (ej. deferred loading). El tooling end-to-end para la compilación de Wasm en Dart aún está en desarrollo, pero puedes probar la vista previa en stable ahora con algunos pasos temporales. Más adelante, también esperamos soportar Wasm en Dart fuera de entornos JS, como runtimes estándar de Wasm como wasmtime y wasmer.

Macros de Dart: Elevando el nivel de abstracción del desarrollo

#

Hemos invertido muchos años en diseñar el sistema de macros de Dart. Para mejorar la experiencia de desarrollo en Dart, las macros proporcionan una solución de metaprogramación, como code generation. Esta solución está integrada en el lenguaje Dart para dar a los desarrolladores máximo rendimiento, eficiencia y productividad. ¡Ahora estamos listos para ofrecer una vista previa de esta experiencia!

Un problema recurrente para los desarrolladores de Dart ha sido el patrón trivial pero tedioso de serializar y deserializar datos JSON. Crear una solución reutilizable y suficientemente potente es un desafío en Dart, ya que no soporta runtime reflection por razones de rendimiento. Como alternativa, hemos dependido de soluciones de code generation como JsonSerializable. Estas dependen de herramientas externas que se ejecutan antes que el propio código, complicando la experiencia del desarrollador.

Hoy, anunciamos una vista previa de un enfoque radicalmente nuevo para la serialización y deserialización de JSON: la macro JsonCodable.

Una macro es un tipo de código que genera más código mediante la introspección de otro código en tiempo de compilación. Por ejemplo, aquí hay una clase Dart Vehicle con la nueva macro JsonCodable aplicada:

dart
@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');
}

Entonces, ¿cómo funciona? ¿De dónde salió el método toJson() (y el constructor complementario fromJson() )? Esta es una implementación experimental de nuestro nuevo sistema de macros diseñado para simplificar la experiencia del desarrollador. Cuando el compilador de Dart ve la anotación @JsonCodable(), localiza inmediatamente la definición de la macro JsonCodable en tiempo real y comienza a ejecutarla. Esto hace que la macro:

  1. Cree una nueva "augmentation class"; una nueva construcción del lenguaje que permite añadir nuevas declaraciones a clases existentes.

  2. Lea la definición del desarrollador de la clase Vehicle para determinar que tiene dos fields, description y wheels.

  3. Añada una nueva firma del método toJson a la augmentation class.

  4. Rellene el cuerpo del método toJson para manejar la serialización de los fields description y wheels.

Todo esto ocurre sin demora. La experiencia integrada soporta nuestros flujos de trabajo de desarrollo existentes, como hot reload, como ilustra este screencast:

Usando la macro JsonCodable en Dart para auto-generar completion de código para un método toJson.
Screencast mostrando la experiencia de usar una macro: Inicialmente no existe completion de código toJson, pero después de añadir @JsonCodable a la clase, la completion de código toJson aparece inmediatamente.

Objetivos a largo plazo de las macros

#

El objetivo final es permitir a la comunidad crear sus propias macros. Esto eleva el nivel de abstracción de la programación en Dart. Tomemos las data classes, por ejemplo, la característica más votada del lenguaje Dart. Consideramos añadir soporte integrado para data classes en Dart, pero aprendimos que las opiniones variaban significativamente sobre qué debería soportar tal construcción para establecer un estándar nosotros mismos. ¿Los fields deberían ser inmutables? ¿Debería soportar equals? ¿Qué tal hashCode? ¿Quizás toString también? Concluimos que soportar un sistema de macros sería el mejor enfoque. La comunidad puede crear sus propios tipos de abstracciones, permitiendo una experimentación y variedad más escalables.

Diseñar e implementar un sistema de macros tan potente es una empresa considerable. Estamos decididos a hacerlo de una manera que no tenga un impacto negativo en el rendimiento de los casos de uso principales de los desarrolladores de Dart, como asistencia de código y completions, análisis de código, y hot reload. Con eso en mente, estamos tomando un enfoque por etapas:

  • En el release de hoy, estamos haciendo disponible una vista previa de una sola macro, JsonCodable, para que los usuarios puedan empezar a familiarizarse con la experiencia de desarrollador de usar una macro.

  • Si el rollout de esta macro va bien, entonces esperamos graduar la macro JSON a stable en un release posterior.

  • Paralelamente, estamos trabajando en completar el diseño e implementación del sistema de macros subyacente. Una vez que nos sintamos seguros de su rendimiento y estabilidad, el objetivo final será permitir a la comunidad de desarrolladores de Dart definir sus propias macros.

Queda mucho trabajo para completar estas etapas. Mientras tanto, puedes leer la documentación para aprender más sobre el sistema de macros de Dart, y probar una vista previa de la macro JsonCodable hoy.

Otras mejoras

#

Como siempre, este release contiene todos los desarrollos continuos que se realizan para ofrecer la mejor versión posible de Dart. En este release, hicimos las siguientes mejoras:

  • Resuelto más del 50% de los bugs de code completion del analyzer. (¡Por favor, sigue reportando issues!)

  • Mejorada la alineación del análisis de tipos de expresiones condicionales, expresiones if-null, y expresiones switch con la especificación del lenguaje (changelog).

  • Eliminado tooling incompleto e inconsistente de la librería dart:cli para reducir la deuda técnica en la Dart VM.

  • Abordadas algunas deficiencias para mejorar la nueva librería **dart:js_interop.

¡Consulta el Changelog para la historia completa! No olvides leer el post conjunto de Dart y Flutter de este release para conocer todos los detalles de nuestros esfuerzos conjuntos!

Más de Dart