🌏

【要約】Dart macros開発作業中止に関して

2025/01/30に公開

概要

🤯
https://medium.com/dartlang/an-update-on-dart-macros-data-serialization-06d3037d4f12
https://github.com/dart-lang/language/issues/1482#issuecomment-2622895490
https://dart.dev/language/macros

結論

作業中止の背景

  • macrosを提供することにより、ホットリロードの最適化を阻害することが判明
  • コンパイルコストが増大
    • ホットリロードの即効性を維持することが困難になった
  • macros以外にも優先すべき機能が複数存在している

macros以外に優先すべき投資事項

Dartのデータ処理強化

  • 最も要望の多い課題
  • マクロ導入もデータ処理やシリアル化向上が目的だった
  • 今後よりカスタマイズされた言語機能を実現するために議論していく

https://github.com/dart-lang/language/issues/314

ビルド時間とコード生成の改善

  • build_runnerの改善に取り組み、ビルド時間とコード生成の効率化を検討

https://github.com/dart-lang/build/issues/3800

  • マクロの一部として提供していたaugmentations機能を独立してリリース予定

https://github.com/dart-lang/language/issues/4154

期待

augmentations

https://github.com/dart-lang/language/blob/main/working/augmentation-libraries/feature-specification.md

要約

  • class / function / variablesなどを複数のファイルに分散・拡張することが可能になる
    例えば、以下のようにStatusという列挙型の値と、getter propertyを分散して記述することも可能になる(はず)

https://github.com/dart-lang/language/blob/main/working/augmentation-libraries/feature-specification.md#augmenting-enum-members

例(あくまで想像)
part 'status_augment.dart';

enum Status {
  initialized,
  loading,
  success,
  failure,
  completed,
  cancelled,
  error,
  timeout,
  unknown,
}

part of 'status.dart';

augment enum Status {
    bool get isSuccess => this == Status.success || this == Status.completed;
    bool get isFailure => this == Status.failure || this == Status.error || this == Status.timeout;
}

Riverpod / Freezed

  • Dart macros開発中止に伴いriverpod_generatorを今後どのようにアプローチするかを検討している模様(コード生成によるアプローチの見直し等)

https://x.com/remi_rousselet/status/1884717010749169810

まとめ

Dart macrosの開発中止は個人的には驚きましたが
よりDartという言語をよくしていこうと言う試みかと思うので
dart_langチームには感謝と称賛を送りたいです。
今後の追加機能に期待していきたいと思います🙌

株式会社ゆめみ

Discussion