Kotlin 1.4.20 的新功能
Kotlin 1.4.20 提供了許多新的實驗性功能,並對現有功能(包括在 1.4.0 中新增的功能)進行了修正與改進。
您也可以在這篇部落格文章中瞭解更多關於新功能的範例。
Kotlin/JVM
Kotlin/JVM 的改進旨在與現代 Java 版本的特性保持同步:
Java 15 目標
現在 Java 15 可作為 Kotlin/JVM 的目標版本。
invokedynamic 字串串接
DANGER
invokedynamic
字串串接是實驗性功能。它可能隨時被移除或變更。需要選擇加入 (Opt-in) (詳情請見下方)。僅供評估之用。我們非常感謝您在 YouTrack 上提供相關回饋。
Kotlin 1.4.20 可以將字串串接編譯為針對 JVM 9+ 目標的動態呼叫,從而提升效能。
目前,此功能為實驗性,涵蓋以下情況:
- 運算子 (
a + b
)、顯式 (a.plus(b)
) 和參照 ((a::plus)(b)
) 形式的String.plus
。 - 內聯 (inline) 類別與資料類別 (data class) 上的
toString
。 - 字串模板,但具單一非常數引數的除外 (請參見 KT-42457)。
若要啟用 invokedynamic
字串串接,請新增 -Xstring-concat
編譯器選項,並搭配以下其中一個值:
indy-with-constants
,以使用 StringConcatFactory.makeConcatWithConstants() 對字串執行invokedynamic
串接。indy
,以使用 StringConcatFactory.makeConcat() 對字串執行invokedynamic
串接。inline
,以切換回透過StringBuilder.append()
的傳統串接方式。
Kotlin/JS
Kotlin/JS 持續快速發展,在 1.4.20 中您可以找到多項實驗性功能和改進:
Gradle DSL 變更
Kotlin/JS 的 Gradle DSL 獲得多項更新,以簡化專案設定和客製化。這包括 webpack 配置調整、對自動生成的 package.json
檔案的修改,以及改進了對傳輸性依賴項 (transitive dependencies) 的控制。
webpack 配置的單一入口點
瀏覽器目標 (browser target) 提供了一個新的配置區塊 commonWebpackConfig
。在其中,您可以從單一入口點調整通用設定,而不必為 webpackTask
、runTask
和 testTask
重複配置。
若要預設為所有這三個任務啟用 CSS 支援,請在您專案的 build.gradle(.kts)
中新增以下程式碼片段:
browser {
commonWebpackConfig {
cssSupport.enabled = true
}
binaries.executable()
}
瞭解更多關於配置 webpack 捆綁 (bundling)。
從 Gradle 客製化 package.json
為了更精確地控制 Kotlin/JS 套件管理和分發,您現在可以透過 Gradle DSL 將屬性新增至專案檔案 package.json
。
若要將自訂欄位新增至您的 package.json
,請在編譯的 packageJson
區塊中使用 customField
函數:
kotlin {
js(BOTH) {
compilations["main"].packageJson {
customField("hello", mapOf("one" to 1, "two" to 2))
}
}
}
瞭解更多關於package.json
客製化。
Yarn 選擇性依賴項解析
Kotlin 1.4.20 提供了一種配置 Yarn 選擇性依賴項解析 的方式—這是一種用於覆寫您所依賴套件的依賴項的機制。
您可以透過 Gradle 中的 YarnPlugin
內的 YarnRootExtension
來使用它。若要影響專案中套件的解析版本,請使用 resolution
函數,傳入套件名稱選擇器 (由 Yarn 指定) 和應解析到的版本。
rootProject.plugins.withType<YarnPlugin> {
rootProject.the<YarnRootExtension>().apply {
resolution("react", "16.0.0")
resolution("processor/decamelize", "3.0.0")
}
}
在此,您所有需要 react
的 npm 依賴項將會收到版本 16.0.0
,而 processor
將會收到其依賴項 decamelize
版本 3.0.0
。
禁用粒度工作區
為加快建置時間,Kotlin/JS Gradle 外掛程式只安裝特定 Gradle 任務所需的依賴項。例如,webpack-dev-server
套件只在您執行其中一個 *Run
任務時安裝,而不是在您執行 assemble 任務時安裝。當您平行執行多個 Gradle 處理程序時,這種行為可能會帶來問題。當依賴項要求發生衝突時,兩個 npm 套件的安裝可能會導致錯誤。
為了解決此問題,Kotlin 1.4.20 包含一個禁用這些所謂_粒度工作區_的選項。此功能目前可透過 Gradle 中的 YarnPlugin
內的 YarnRootExtension
獲得。若要使用它,請將以下程式碼片段新增到您的 build.gradle.kts
檔案:
rootProject.plugins.withType<YarnPlugin> {
rootProject.the<YarnRootExtension>().disableGranularWorkspaces()
}
新版精靈範本
為了在專案建立期間提供更便捷的客製化方式,Kotlin 的專案精靈附帶了適用於 Kotlin/JS 應用程式的新範本:
- 瀏覽器應用程式 (Browser Application) - 一個在瀏覽器中執行的最小 Kotlin/JS Gradle 專案。
- React 應用程式 (React Application) - 一個使用適當
kotlin-wrappers
的 React 應用程式。它提供選項以啟用與樣式表、導航元件或狀態容器的整合。 - Node.js 應用程式 (Node.js Application) - 一個用於在 Node.js 執行時環境中執行的最小專案。它附帶直接包含實驗性
kotlinx-nodejs
套件的選項。
使用 IR 編譯器忽略編譯錯誤
Kotlin/JS 的 IR 編譯器 帶有新的實驗性模式 — 帶錯誤編譯。在此模式下,即使程式碼包含錯誤,您也能執行它,例如,當整個應用程式尚未準備好時,您想嘗試某些功能。
此模式有兩種容忍策略:
SEMANTIC
:編譯器將接受語法正確但在語義上不合理的程式碼,例如val x: String = 3
。SYNTAX
:編譯器將接受任何程式碼,即使它包含語法錯誤。
若要允許帶錯誤編譯,請新增 -Xerror-tolerance-policy=
編譯器選項,並搭配上面列出的其中一個值。
Kotlin/Native
Kotlin/Native 在 1.4.20 的優先事項是效能和完善現有功能。以下是顯著的改進:
逃逸分析
Kotlin/Native 接收了新的逃逸分析機制原型。它透過將某些物件分配在堆疊 (stack) 上而不是堆 (heap) 上,提高了執行時效能。此機制在我們的基準測試中顯示平均效能提升 10%,我們並持續改進它,使其進一步加速程式的執行。
逃逸分析在發行版本建置 (使用 -opt
編譯器選項) 的獨立編譯階段執行。
如果您想禁用逃逸分析階段,請使用 -Xdisable-phases=EscapeAnalysis
編譯器選項。
效能改進與錯誤修正
Kotlin/Native 在各個元件中獲得了效能改進和錯誤修正,包括 1.4.0 中新增的元件,例如程式碼共享機制。
選擇加入 Objective-C 異常包裝
DANGER
Objective-C 異常包裝機制是實驗性功能。它可能隨時被移除或變更。需要選擇加入 (Opt-in) (詳情請見下方)。僅供評估之用。我們非常感謝您在 YouTrack 上提供相關回饋。
Kotlin/Native 現在可以在執行時處理從 Objective-C 程式碼拋出的異常,以避免程式崩潰。
您可以選擇加入以將 NSException
包裝成 ForeignException
類型的 Kotlin 異常。它們保留對原始 NSException
的參照。這讓您可以取得根本原因的資訊並妥善處理。
若要啟用 Objective-C 異常包裝,請在 cinterop
呼叫中指定 -Xforeign-exception-mode objc-wrap
選項,或將 foreignExceptionMode = objc-wrap
屬性新增至 .def
檔案。如果您使用 CocoaPods 整合,請在依賴項的 pod {}
建置指令碼區塊中指定該選項,如下所示:
pod("foo") {
extraOpts = listOf("-Xforeign-exception-mode", "objc-wrap")
}
預設行為保持不變:當從 Objective-C 程式碼拋出異常時,程式將終止。
CocoaPods 外掛程式改進
Kotlin 1.4.20 持續在 CocoaPods 整合方面進行一系列改進。具體來說,您可以嘗試以下新功能:
改進的任務執行
CocoaPods 外掛程式獲得了改進的任務執行流程。例如,如果您新增一個新的 CocoaPods 依賴項,現有的依賴項不會被重建。新增一個額外的目標也不會影響現有依賴項的重建。
擴展的 DSL
將 CocoaPods 依賴項新增到 Kotlin 專案的 DSL 獲得了新的功能。
除了本地 Pods 和來自 CocoaPods 儲存庫的 Pods 之外,您還可以新增以下類型函式庫的依賴項:
- 來自自訂 spec 儲存庫的函式庫。
- 來自 Git 儲存庫的遠端函式庫。
- 來自壓縮檔的函式庫 (也可透過任意 HTTP 位址獲得)。
- 靜態函式庫。
- 帶有自訂 cinterop 選項的函式庫。
瞭解更多關於在 Kotlin 專案中新增 CocoaPods 依賴項。在 Kotlin 與 CocoaPods 範例 中查找範例。
更新與 Xcode 的整合
為了與 Xcode 正確配合使用,Kotlin 需要對 Podfile 進行一些變更:
- 如果您的 Kotlin Pod 具有任何 Git、HTTP 或 specRepo Pod 依賴項,您也應該在 Podfile 中指定它。
- 當您從自訂 spec 新增函式庫時,您也應該在 Podfile 的開頭指定 specs 的位置。
現在整合錯誤在 IDEA 中有詳細的描述。因此如果您的 Podfile 有問題,您將立即知道如何修正它們。
瞭解更多關於建立 Kotlin Pods。
支援 Xcode 12 函式庫
我們新增了對隨 Xcode 12 提供的函式庫的支援。現在您可以從 Kotlin 程式碼中使用它們。
Kotlin Multiplatform
多平台函式庫發佈的更新結構
從 Kotlin 1.4.20 開始,不再有單獨的元資料發佈。元資料 Artifact 現在包含在 根 (root) 發佈中,它代表整個函式庫,並且當作為依賴項新增到通用原始碼集時,會自動解析為相應的特定平台 Artifact。
瞭解更多關於發佈多平台函式庫。
與早期版本的相容性
這種結構變更破壞了具有分層專案結構的專案之間的相容性。如果一個多平台專案和它所依賴的函式庫都具有分層專案結構,那麼您需要同時將它們更新到 Kotlin 1.4.20 或更高版本。使用 Kotlin 1.4.20 發佈的函式庫不能被早期版本發佈的專案使用。
不具分層專案結構的專案和函式庫保持相容。
標準函式庫
Kotlin 1.4.20 的標準函式庫提供了用於檔案操作的新擴展和更好的效能。
java.nio.file.Path 的擴展
DANGER
java.nio.file.Path
的擴展是實驗性功能。它們可能隨時被移除或變更。需要選擇加入 (Opt-in) (詳情請見下方)。僅供評估之用。我們非常感謝您在 YouTrack 上提供相關回饋。
現在標準函式庫提供了 java.nio.file.Path
的實驗性擴展。以慣用的 Kotlin 方式使用現代 JVM 檔案 API,現在類似於使用 kotlin.io
套件中的 java.io.File
擴展。
// 使用除法 (/) 運算子建構路徑
val baseDir = Path("/base")
val subDir = baseDir / "subdirectory"
// 列出目錄中的檔案
val kotlinFiles: List<Path> = Path("/home/user").listDirectoryEntries("*.kt")
這些擴展在 kotlin-stdlib-jdk7
模組的 kotlin.io.path
套件中可用。若要使用這些擴展,請選擇加入實驗性註解 @ExperimentalPathApi
。
String.replace 函數的效能改進
String.replace()
的新實作加快了函數執行速度。區分大小寫的版本使用基於 indexOf
的手動替換迴圈,而不區分大小寫的版本則使用正規表達式匹配。
Kotlin Android Extensions
在 1.4.20 中,Kotlin Android Extensions 外掛程式已被棄用,而 Parcelable
實作生成器則移至單獨的外掛程式。
合成視圖 (synthetic views) 的棄用
合成視圖 (synthetic views) 不久前在 Kotlin Android Extensions 外掛程式中推出,旨在簡化與 UI 元素的互動並減少樣板程式碼。現在 Google 提供一個原生機制,做同樣的事情—Android Jetpack 的視圖綁定 (view bindings),我們正在棄用合成視圖,轉而支持它們。
我們從 kotlin-android-extensions
中提取 Parcelable
實作生成器,並開始其餘部分(即合成視圖)的棄用週期。目前,它們將繼續運作並發出棄用警告。未來,您需要將您的專案切換到其他解決方案。以下是將幫助您將 Android 專案從合成視圖遷移到視圖綁定 (view bindings) 的指南。
適用於 Parcelable 實作生成器的新外掛程式
Parcelable
實作生成器現在在新 kotlin-parcelize
外掛程式中可用。請套用此外掛程式,而不是 kotlin-android-extensions
。
NOTE
kotlin-parcelize
和 kotlin-android-extensions
不能在一個模組中同時套用。
@Parcelize
註解已移至 kotlinx.parcelize
套件。
在 Android 文件 中瞭解更多關於 Parcelable
實作生成器。