0%

【文章翻譯】Announcing Dart 3.4

【文章內容使用 Gemini 2.0 自動翻譯產生】

宣佈 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 編譯的端到端工具仍在開發中,但您現在可以透過一些臨時步驟在穩定版中 試用預覽版。之後,我們還希望在 JS 環境之外的 Dart 中支援 Wasm(例如 wasmtime 和 wasmer 等標準 Wasm runtime),如 dart-lang/sdk/issues/53884 中所述。

Dart 巨集:提升開發抽象層級

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

長期以來,Dart 開發人員的一個痛點是序列化和反序列化 JSON 資料的瑣碎但繁瑣的模式。製作一個可重複使用、功能足夠強大的解決方案在 Dart 中是一項挑戰,因為由於效能原因,它不支援 runtime reflection。作為替代方案,我們一直依賴於程式碼產生解決方案,例如 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 欄位的序列化。

所有這些都立即發生。整合的體驗支援我們現有的開發人員工作流程,例如熱重新載入,如下面的螢幕錄影所示:

螢幕錄影顯示了使用巨集的體驗:最初沒有 toJson 程式碼完成,但在將 @JsonCodable 加入到類別後,toJson 程式碼完成會立即顯示。

長期巨集目標

最終目標是讓社群能夠建立自己的巨集。這提高了 Dart 程式設計的抽象層級。以資料類別為例,這是 得票最高 的 Dart 語言功能。我們研究了在 Dart 中加入對資料類別的內建支援,但了解到對於這樣的結構應該支援什麼以設定我們自己的標準,意見差異很大。欄位應該是不可變的嗎?它應該支援 equals 嗎?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 最初發佈於 Medium 上的 Dart,人們在那裡透過醒目顯示和回應這個故事來繼續討論。