0%

【文章翻譯】Announcing Dart 2.14

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

宣佈 Dart 2.14

今天,我們發佈了 Dart SDK 的 2.14 版本,這是我們持續努力的最新成果,旨在透過獨特的可移植性、生產力和穩健性組合,打造構建應用程式的最佳平台。這次,我們對 Apple Silicon 提供了更好的支援,並進行了許多生產力增強,例如用於在您編寫程式碼時透過程式碼樣式分析來捕捉錯誤的標準 lints、更快的 pub 工具、使用 cascades 更好地格式化程式碼,以及一些小型語言功能。

An illustration with text that summarizes the new 2.14 features

Dart SDK 中的 Apple Silicon 支援

自從 Apple 在 2020 年底宣佈了他們新的 Apple Silicon 處理器以來,我們一直致力於更新 Dart SDK,以增加對在新處理器上原生執行的支援。所需的變更已在開發頻道中提供了一段時間,在過去一個月中在測試頻道中提供,而從 Dart 2.14.1 開始,現在已在 Dart 穩定頻道中提供。當您 下載 macOS SDK 時,請務必選擇 ARM64 選項。請注意,Flutter SDK 中捆綁的 Dart SDK 尚未包含這些改進。

該支援包括在 Apple Silicon 上運行 SDK/Dart VM 本身,以及支援編譯在 Apple Silicon 上運行的可執行檔(使用 dart compile)。Dart 命令列工具現在啟動速度更快,因為它們使用了原生 Apple Silicon 支援。

為 Dart 和 Flutter 共享的標準 lints

開發人員通常更喜歡他們的程式碼遵循某種樣式。這些規則中的許多規則不僅僅是樣式偏好(例如眾所周知的 tab 與空格的討論),還涵蓋了可能導致錯誤或引入錯誤的編碼樣式。例如,Dart 樣式指南要求對所有控制流程結構(例如 if-else 陳述式)使用大括號。這可以防止經典的 懸空 else 問題,其中對如何解釋多個巢狀 if-else 陳述式存在歧義。另一個例子是類型推斷。雖然在使用初始值宣告變數時使用類型推斷是可以的,但在 宣告未初始化的變數 時指定類型很重要,以確保類型安全。

強制執行良好程式碼樣式的一個選項是透過某種形式的人工強制執行,通常是透過程式碼審查。但是,通常透過在您編寫程式碼時運行的靜態分析來強制執行規則會更有效。

在 Dart 中,這種靜態分析是高度 可配置的,我們有 數百條樣式規則(也稱為 lints)。有了這麼多的選項,選擇要啟用哪些規則可能會有點讓人不知所措。Dart 團隊維護著一份 Dart 樣式指南,其中描述了我們認為編寫和設定 Dart 程式碼樣式的最佳方式,但從歷史上看,我們沒有一套與樣式指南相對應的官方 linter 規則集。

許多開發人員——以及 pub.dev 網站 評分 引擎——都使用了 pedantic linter 規則集。然而,pedantic 起源於 Google 內部的 Dart 樣式指南,由於歷史原因,它與一般的 Dart 樣式指南不同。此外,Flutter 架構從未使用過 pedantic 規則集,而是有自己的一套規範規則。

這聽起來可能有點混亂,確實如此。但隨著今天的發佈,我們很高興地宣佈,我們現在有一套全新的 linter 集合,它們實作了樣式指南,並且 Dart 和 Flutter SDK 已更新,預設為新專案使用這些規則集。規則集如下:

  • package:lints/core.yaml: Dart 樣式指南中的主要規則,我們認為所有 Dart 程式碼都應該遵循。pub.dev 評分引擎已更新為使用這些規則而不是 pedantic。
  • package:lints/recommended.yaml: 核心規則,以及其他建議的規則。建議所有通用 Dart 程式碼都使用此集。
  • package:flutter_lints/flutter.yaml: 核心和建議的規則,以及其他 Flutter 特定的建議規則。建議所有 Flutter 程式碼都使用此集。

如果您有現有專案,我們強烈建議您升級到這些新的規則集。從 pedantic 升級 只需幾個步驟

Dart 格式化工具和 cascades

我們對 Dart 格式化工具如何使用 cascades 格式化程式碼進行了多項優化。以前,格式化工具在某些情況下會產生令人困惑的格式。例如,在此範例中,doIt() 是在什麼上調用的?

1
var result = errorState ? foo : bad..doIt();

它看起來像是總是在 bad 上調用的,但實際上 cascade 適用於整個 ? 表達式,因此 cascade 是在該表達式的結果上調用的,而不僅僅是在 false 子句上。新的格式化工具使這一點更加清晰:

1
2
var result = errorState ? foo : bad
..doIt();

其他變更與包含多個 cascades 的行的格式化方式以及 cascades 通常縮排的程度有關。我們還大大提高了格式化包含 cascades 的程式碼的速度;在為 protocol buffers 生成的 Dart 程式碼中,我們看到格式化速度提高了 10 倍。

有關所有詳細資訊,請參閱 追蹤議題

Pub 支援忽略檔案

目前,當您將套件 發佈pub.dev 社群儲存庫時,pub 會抓取該資料夾中的所有檔案,但有一些例外,會跳過隱藏檔案(以點開頭的檔案:.)和 .gitignore 中列出的檔案。一些開發人員要求能夠控制在 .gitignore 列表之外忽略哪些檔案。例如,您可能在 tool/ 資料夾中有一些用於 維護 套件的內部開發工具,但這些工具與 使用 套件的人無關。

Dart 2.14 中更新的 pub 命令支援新的 .pubignore 檔案,您可以在其中列出不想上傳到 pub.dev 的檔案。此檔案使用與 .gitignore 檔案相同的格式。有關詳細資訊,請參閱 套件發佈文件

Pub 和 dart test 效能

雖然 pub 可能最常用於管理程式碼相依關係,但它還有第二個重要的用途:支援工具。一個這樣的例子是 Dart 測試工具,透過 dart test 命令公開。此命令實際上只是 pub run test:test 命令的包裝器,它在 package:test 中運行測試入口點。在調用該入口點之前,pub 首先將其編譯為可以更快運行的原生程式碼。

在 Dart 2.14 之前,對 pubspec 的任何變更(包括與 package:test 無關的變更)都會使此測試的構建失效,您會看到一堆如下所示的輸出,其中包含“正在預編譯可執行檔”:

1
2
3
4
$ dart test
正在預編譯可執行檔... (11.6s)
預編譯 test:test。
00:01 +1: 所有測試都通過了!

在 Dart 2.14 中,pub 對何時使構建步驟失效更加智慧,因此只有在版本變更時才會進行構建。此外,我們改進了使用平行化執行構建步驟的方式,因此步驟本身完成得更快。我們在測試的一些套件中看到它花費的時間減少了一半。

新的語言功能

Dart 2.14 還包含許多小型語言功能。這次,我們專注於更具體的改進,這些改進的用途可能更狹窄,但可以啟用以前不支援的更專門的用例。

首先,我們加入了一個新的 三重移位 運算子(>>>)。這與現有的移位運算子(>>)類似,但 >> 執行算術移位,而 >>> 執行邏輯或無符號移位,其中零位元被移位到最高有效位元,無論被移位的數字是正數還是負數。

我們還移除了一個對類型引數的舊限制,該限制不允許使用泛型函數類型作為類型引數。以下所有內容在 2.14 之前都是無效的,但現在允許:

1
2
3
late List<T Function<T>(T)> idFunctions;
var callback = [<T>(T value) => value];
late S Function<S extends T Function<T>(T)>(S) f;

最後,我們對註釋類型進行了一些小調整。(註釋,例如 @Deprecated,通常用於 Dart 程式碼中以捕捉中繼資料。)以前,註釋不能傳遞類型引數,因此 @TypeHelper<int>(42, "The meaning") 之類的程式碼是不允許的。此限制現已移除。

套件和核心函式庫變更

我們對核心 Dart 套件和函式庫進行了許多增強,包括:

  • dart:core:在 Object 類中加入了靜態方法 hashhashAllhashAllUnordered。這些方法可以用於以一致的方式組合多個物件的雜湊碼(hashAll 範例)。
  • dart:core:原生的 DateTime 類現在可以更好地處理夏令時變更前後的本地時間,這些變更不精確為一小時——例如,澳大利亞的豪勳爵島,它使用 30 分鐘的偏移量。
  • package:ffi:增加了使用 arena 分配器管理記憶體的支援(範例)。Arenas 是一種基於區域的記憶體管理形式,其中資源會在 arena/區域退出後自動釋放。
  • package:ffigen:現在支援從 C 類型定義生成 Dart 類型定義。

重大變更

Dart 2.14 還包含一些較小的、先前已宣佈的 重大變更。預計這些變更只會影響一些專門的用例。

#46545:移除對 ECMAScript5 的支援

所有現代瀏覽器 都支援最新的 ECMAScript 版本,因此兩年前我們 宣佈 了棄用 ECMAScript 5 (ES5) 支援的計劃。這使我們能夠利用最新 ECMAScript 中的改進並生成更小的輸出。在 Dart 2.14 中,這項工作已完成,Dart Web 編譯器不再支援 ES5。因此,不再支援舊版瀏覽器——例如 IE11。

#46100:棄用 stagehand、dartfmt 和 dart2native

在 2020 年 10 月的 Dart 2.10 部落格文章 中,我們宣佈了將所有 Dart CLI 開發人員工具合併到一個單一的、組合的 dart 工具(類似於 flutter 工具)中的工作。作為該演進的一部分,Dart 2.14 棄用了以前的 dartfmtdart2native 命令,並停止了 stagehand。這些工具在 統一的 dart 工具 中都有等效的替代品。

#45451:棄用 VM 原生擴展

我們棄用了 Dart VM 的原生擴展,這是我們從 Dart 程式碼調用原生程式碼的舊機制。Dart FFI(外部函數介面)是我們目前用於此用例的機制,我們正在積極地 發展 它,使其更加強大和易於使用。

Null safety 更新

我們在 3 月的 Dart 2.12 版本中推出了健全的 null safety。Null safety 是 Dart 的最新主要生產力功能,旨在幫助您避免 null 錯誤——這是一類通常難以發現的錯誤。

自從我們的上次更新以來,我們在將現有套件和應用程式遷移到啟用 null safety 的健全檢查優點方面取得了巨大進展。對於 pub.dev 上的套件,前 250 個套件中的 100% 現在支援 null safety,前 1000 個套件中的 94% 支援它。這意味著更多開發人員可以以完全 健全的 null safety 運行他們的應用程式。分析顯示,56% 的 flutter run 會話以完全健全的方式執行。感謝生態系統中的所有開發人員的遷移工作!

2.14 的可用性和持續的發展勢頭

包含上述變更的增強型 Dart SDK 現在已在 Dart 2.14.1 和 Flutter 2.5 SDK 中提供。我們希望您會喜歡新的增強功能和特性。

此外,我們也想藉此機會感謝出色的 Dart 社群。正如在最近對程式語言調查的多次更新中所見,Dart 的發展勢頭強勁。備受尊敬的 RedMonk 排名 提到了“Dart 的顯著上升”,並首次將 Dart 排在前 20 名。StackOverflow 全面的 2021 年開發人員調查 同樣令人高興:據報導,Dart 是開發人員第七喜歡的程式語言。我們真的很高興看到 Dart 平台持續增長和發展勢頭。


宣佈 Dart 2.14 最初發佈於 Medium 上的 Dart,人們在那裡透過醒目顯示和回應這個故事來繼續對話。