0%

【文章翻譯】Announcing Dart 3.4

【文章內容使用 Gemini 1.5 Pro 自動產生】

宣布 Dart 3.4

Dart 3.4 今天正式發布!此版本展示了 Dart 和 Flutter 在 Flutter 3.22 / Dart 3.4 / IO24 文章中的共同努力,因此請務必在那裏獲得完整的資訊。這篇文章介紹了我們對 WebAssembly 的支援,並詳細說明了今年 Dart 語言的幾個主要路線圖項目之一:_宏_。

WebAssembly 更新

今天,我們很興奮地宣布,在最新的 Flutter 3.22 穩定版本中,Flutter Web 應用 已經完全支援 WebAssembly (Wasm)!

這項投資橫跨 Dart 和 Flutter 多年。如果您一直在關注這些發展,您會看到我們的漸進式改進:

  • WasmGC 提案標準化,
  • 加入了一個全新的 Dart 編譯器後端,用於生成 WasmGC 程式碼,以及
  • 重新設計 我們的 Web 和 JavaScript 互操作產品,以最佳支援 Wasm。

我們將繼續投資 WebAssembly。我們的下一個努力將在純粹的 Dart 應用程式中啟用對 Wasm 的完全支援,並完成一些缺失的功能(例如延遲載入)。Dart 中 Wasm 編譯的端到端工具仍在開發中,但您可以 嘗試預覽 在 stable 版本中使用一些臨時步驟。之後,我們還希望在 JS 環境之外 的 Dart 中支援 Wasm,例如標準 Wasm 執行時間,例如 wasmtime 和 wasmer。

Dart 宏:提升開發抽象層級

我們投入了多年時間設計 Dart 宏系統。為了改善 Dart 的開發體驗,宏提供了元程式設計解決方案,例如程式碼生成。此解決方案內建到 Dart 語言中,為開發人員提供最大的效能、效率和生產力。現在,我們準備提供此體驗的預覽!

Dart 開發人員長期以來的一個痛點是,JSON 資料的序列化和反序列化既瑣碎又乏味。在 Dart 中,製作一個可重複使用且功能強大的解決方案是一個挑戰,因為它出於效能原因不支持運行時反射。作為替代方案,我們依賴於程式碼生成解決方案,例如 JsonSerializable。這些依賴於在程式碼本身之前運行的外部工具,使開發人員的體驗變得複雜。

今天,我們宣布了一種用於 JSON 序列化和反序列化的全新方法的預覽:JsonCodable 宏。

宏是一種透過在編譯時內省其他程式碼來生成更多程式碼的程式碼類型。例如,以下是一個帶有新的 JsonCodable 宏的 Dart 類別 Vehicle:

1
2
3
4
5
6
7
8
9
10
11
@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 宏的定義,並開始執行它。這會導致宏:

  1. 建立一個新的「增強類別 」;一種新的語言結構,允許為現有類別新增新的宣告。
  2. 讀取開發人員對 Vehicle 類別的定義,以確定它具有兩個欄位,descriptionwheels
  3. 在增強類別中新增一個新的 toJson 方法簽章。
  4. 填寫 toJson 方法的主體,以處理 descriptionwheels 欄位的序列化。

所有這些都在沒有延遲的情況下完成。整合的體驗支援我們現有的開發人員工作流程,例如熱重載,正如此螢幕錄影所示:

Screencast showing the experience of using a macro: Initially no toJson code completion exists, but after adding @JsonCodable to the class, the toJson code completion shows up immediately.

長期宏目標

最終目標是讓社群能夠建立自己的宏。這提高了 Dart 程式設計的抽象層級。以資料類別為例,這是 投票數最高 的 Dart 語言功能。我們考慮過在 Dart 中新增對資料類別的內建支援,但了解到人們對此類結構應該支援哪些內容意見分歧很大,以至於我們無法自己設定標準。欄位是否應該不可變?它是否應該支援相等?那 hashCode 呢?也許還有 toString ?我們得出結論,支援宏系統會是更好的方法。社群可以建立自己的抽象類型,允許更多可擴展的實驗和多樣性。

設計和實作如此強大的宏系統是一項艱鉅的任務。我們決心以一種不會對核心 Dart 開發人員用例(例如程式碼輔助和完成、程式碼分析和熱重載)產生不利效能影響的方式來進行。考慮到這一點,我們採取了分階段的方法:

  • 在今天的版本中,我們提供了一個單一宏 JsonCodable 的預覽,以便使用者可以開始熟悉使用宏的開發體驗。
  • 如果這個宏的推出順利,我們希望在後續版本中將 JSON 宏升級到穩定版本。
  • 與此同時,我們正在努力完成底層宏系統的設計和實作。一旦我們對其效能和穩定性有信心,最終的目標將是讓 Dart 開發人員社群能夠定義自己的宏。

完成這些階段還有很多工作要做。同時,您可以閱讀文件以了解更多關於 Dart 宏系統 的資訊,並立即嘗試 JsonCodable 宏 的預覽。

其他改進

與往常一樣,此版本包含所有用於提供最佳 Dart 版本的持續開發。在此版本中,我們做出了以下改進:

  • 解決了超過 50% 的分析器程式碼完成錯誤。(請繼續提交 議題!)
  • 改進了條件運算式、if-null 運算式和 switch 運運算式的類型分析與語言規範的對齊(變更日誌)。
  • dart:cli 函式庫中移除不完整且不一致的工具,以償還 Dart VM 中的技术债务。
  • 解决了几个不足之处,以改进新的 dart:js_interop 函式庫。

查看 變更日誌 以獲取完整的故事!不要忘記閱讀此版本中關於我們共同努力的 Dart 和 Flutter 聯合部落格文章 以獲取完整的故事!


宣布 Dart 3.4 最初發佈在 Dart 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。

undefined