Что нового в Kotlin 1.4.20
Kotlin 1.4.20 предлагает ряд новых экспериментальных функций и предоставляет исправления и улучшения для существующих функций, включая те, что были добавлены в 1.4.0.
Вы также можете узнать о новых функциях с дополнительными примерами в этой статье блога.
Kotlin/JVM
Улучшения Kotlin/JVM предназначены для того, чтобы он соответствовал возможностям современных версий Java:
Целевая платформа Java 15
Теперь Java 15 доступна в качестве целевой платформы Kotlin/JVM.
Конкатенация строк с помощью invokedynamic
Kotlin 1.4.20 может компилировать конкатенацию строк в динамические вызовы на целевых платформах JVM 9+, что улучшает производительность.
В настоящее время эта функция экспериментальна и охватывает следующие случаи:
String.plusв операторной (a + b), явной (a.plus(b)) и ссылочной ((a::plus)(b)) форме.toStringв инлайновых и данных классах.Шаблоны строк, за исключением тех, которые имеют один неконстантный аргумент (см. KT-42457).
Для включения invokedynamic конкатенации строк, добавьте -Xstring-concat опцию компилятора с одним из следующих значений:
indy-with-constantsдля выполненияinvokedynamicконкатенации строк с помощью StringConcatFactory.makeConcatWithConstants().indyдля выполненияinvokedynamicконкатенации строк с помощью StringConcatFactory.makeConcat().inlineдля возврата к классической конкатенации черезStringBuilder.append().
Kotlin/JS
Kotlin/JS быстро развивается, и в версии 1.4.20 вы найдете множество экспериментальных функций и улучшений:
Изменения в Gradle DSL
Gradle DSL для Kotlin/JS получает ряд обновлений, которые упрощают настройку и кастомизацию проекта. Это включает в себя корректировки конфигурации webpack, изменения в автоматически сгенерированном package.json файле и улучшенный контроль над транзитными зависимостями.
Единая точка для конфигурации webpack
Доступен новый блок конфигурации commonWebpackConfig, для целевой среды браузера. Внутри него вы можете настроить общие параметры в одном месте, вместо того, чтобы дублировать конфигурации для webpackTask, runTask, и testTask.
Чтобы включить поддержку CSS по умолчанию для всех трёх задач, добавьте следующий фрагмент в build.gradle(.kts) вашего проекта:
browser {
commonWebpackConfig {
cssSupport.enabled = true
}
binaries.executable()
}
Подробнее о настройке связывания webpack.
Настройка package.json из Gradle
Для большего контроля над управлением пакетами и распространением Kotlin/JS, вы теперь можете добавлять свойства в файл проекта package.json через Gradle DSL.
Чтобы добавить пользовательские поля в ваш package.json, используйте функцию customField в блоке packageJson компиляции:
kotlin {
js(BOTH) {
compilations["main"].packageJson {
customField("hello", mapOf("one" to 1, "two" to 2))
}
}
}
Подробнее о package.json настройке.
Селективные разрешения зависимостей Yarn
Kotlin 1.4.20 предоставляет способ настройки селективных разрешений зависимостей Yarn - механизм переопределения зависимостей пакетов, от которых вы зависите.
Вы можете использовать его через YarnRootExtension внутри YarnPlugin в Gradle. Чтобы повлиять на разрешенную версию пакета для вашего проекта, используйте функцию resolution и передайте в неё селектор имени пакета (как указано в Yarn) и версию, на которую он должен разрешиться.
rootProject.plugins.withType<YarnPlugin> {
rootProject.the<YarnRootExtension>().apply {
resolution("react", "16.0.0")
resolution("processor/decamelize", "3.0.0")
}
}
Здесь, все ваши npm-зависимости, которые требуют react, получат версию 16.0.0, а processor получит свою зависимость decamelize в качестве версии 3.0.0.
Отключение гранулярных рабочих пространств
Для ускорения времени сборки, плагин Kotlin/JS Gradle устанавливает только зависимости, необходимые для конкретной задачи Gradle. Например, пакет webpack-dev-server устанавливается только при выполнении одной из задач *Run, а не при выполнении задачи assemble. Такое поведение может потенциально создавать проблемы при одновременном выполнении нескольких процессов Gradle.
Для решения этой проблемы, Kotlin 1.4.20 включает возможность отключения этих так называемых гранулярных рабочих пространств. Эта функция доступна через YarnRootExtension внутри YarnPlugin в Gradle. Чтобы использовать её, добавьте следующий фрагмент в ваш build.gradle.kts файл:
rootProject.plugins.withType<YarnPlugin> {
rootProject.the<YarnRootExtension>().disableGranularWorkspaces()
}
Новые шаблоны мастера
Для предоставления более удобных способов кастомизации проекта во время создания, мастер проектов Kotlin поставляется с новыми шаблонами для приложений Kotlin/JS:
Приложение для браузера - минимальный проект Kotlin/JS Gradle, работающий в браузере.
Приложение React - приложение React, использующее соответствующие
kotlin-wrappers. Оно предоставляет варианты включения интеграции для таблиц стилей, компонентов навигации или контейнеров состояния.Приложение Node.js - минимальный проект для работы в среде выполнения Node.js. Он поставляется с возможностью прямого включения экспериментального пакета
kotlinx-nodejs.
Игнорирование ошибок компиляции с помощью компилятора IR
Компилятор IR для Kotlin/JS поставляется с новым экспериментальным режимом - компиляцией с ошибками. В этом режиме вы можете запустить код, даже если он содержит ошибки, например, если вы хотите попробовать что-то, когда всё приложение ещё не готово.
Для этого режима существуют две политики толерантности:
SEMANTIC: компилятор примет код, который синтаксически корректен, но не имеет смысла семантически, например,val x: String = 3.SYNTAX: компилятор примет любой код, даже если он содержит синтаксические ошибки.
Для разрешения компиляции с ошибками, добавьте опцию компилятора -Xerror-tolerance-policy= с одним из указанных выше значений.
Подробнее о игнорировании ошибок компиляции с помощью компилятора Kotlin/JS IR.
Kotlin/Native
Приоритетами Kotlin/Native в версии 1.4.20 являются производительность и доработка существующих функций. Вот заметные улучшения:
Анализ утечек
Kotlin/Native получает прототип нового механизма анализа утечек. Он улучшает производительность времени выполнения, распределяя определённые объекты в стеке вместо кучи. Этот механизм демонстрирует среднее повышение производительности на 10% в наших тестах, и мы продолжаем его улучшать, чтобы ускорить программу ещё больше.
Анализ утечек выполняется на отдельной стадии компиляции для релизных билдов (с параметром компилятора -opt).
Если вы хотите отключить фазу анализа утечек, используйте параметр компилятора -Xdisable-phases=EscapeAnalysis.
Улучшения производительности и исправление ошибок
Kotlin/Native получает улучшения производительности и исправления ошибок в различных компонентах, включая те, что были добавлены в 1.4.0, например, механизм обмена кодом между платформами.
Включение обертки исключений Objective-C
Kotlin/Native теперь может обрабатывать исключения, брошенные из кода Objective-C во время выполнения, чтобы избежать аварий программы.
Вы можете включить обертывание NSException в Kotlin-исключения типа ForeignException. Они содержат ссылки на оригинальные NSException. Это позволяет получить информацию о первопричине и обработать её должным образом.
Для включения обертки исключений Objective-C, укажите параметр -Xforeign-exception-mode objc-wrap в вызове cinterop или добавьте свойство 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
DSL для добавления зависимостей CocoaPods в ваш Kotlin-проект получает новые возможности.
В дополнение к локальным Pods и Pods из репозитория CocoaPods, вы можете добавить зависимости следующих типов библиотек:
Библиотека из пользовательского репозитория спецификаций.
Удаленная библиотека из репозитория Git.
Библиотека из архива (также доступна по произвольному HTTP адресу).
Статическая библиотека.
Библиотека с пользовательскими параметрами cinterop.
Узнайте больше о добавлении зависимостей CocoaPods в Kotlin-проекты. Найдите примеры в примере Kotlin с CocoaPods.
Обновлённая интеграция с Xcode
Для корректной работы с Xcode Kotlin требует некоторых изменений в Podfile:
Если ваш Kotlin Pod имеет зависимость Git, HTTP или specRepo Pod, вы также должны указать её в Podfile.
При добавлении библиотеки из пользовательского спецификатора, вы также должны указать местоположение спецификаций в начале вашего Podfile.
Теперь ошибки интеграции содержат подробное описание в IDEA. Так что если у вас возникли проблемы с Podfile, вы сразу узнаете, как их исправить.
Узнайте больше о создании Kotlin-pods.
Поддержка библиотек Xcode 12
Мы добавили поддержку новых библиотек, поставляемых с Xcode 12. Теперь вы можете использовать их из Kotlin-кода.
Kotlin Multiplatform
Обновлённая структура публикаций многоплатформенной библиотеки
Начиная с Kotlin 1.4.20, отдельной публикации метаданных больше нет. Метаданные теперь включены в публикацию корня, которая представляет всю библиотеку, и автоматически разрешается к соответствующим платформенно-специфическим артефактам при добавлении в качестве зависимости к общему набору исходных кодов.
Узнайте больше о публикации многоплатформенной библиотеки.
Совместимость с предыдущими версиями
Это изменение структуры нарушает совместимость между проектами с иерархической структурой проекта. Если многоплатформенный проект и библиотека, от которой он зависит, оба имеют иерархическую структуру проекта, вам необходимо обновить их до Kotlin 1.4.20 или выше одновременно. Библиотеки, опубликованные с Kotlin 1.4.20, недоступны для использования из проектов, опубликованных с предыдущими версиями.
Проекты и библиотеки без иерархической структуры проекта остаются совместимыми.
Стандартная библиотека
Стандартная библиотека Kotlin 1.4.20 предлагает новые расширения для работы с файлами и улучшенную производительность.
Расширения для java.nio.file.Path
Теперь стандартная библиотека предоставляет экспериментальные расширения для java.nio.file.Path. Работа с современной JVM-API файлов идиоматичным способом Kotlin теперь аналогична работе с расширениями java.io.File из пакета kotlin.io.
// construct path with the div (/) operator
val baseDir = Path("/base")
val subDir = baseDir / "subdirectory"
// list files in a directory
val kotlinFiles: List<Path> = Path("/home/user").listDirectoryEntries("*.kt")
Расширения доступны в пакете kotlin.io.path в модуле kotlin-stdlib-jdk7. Для использования расширений, включите экспериментальную аннотацию @ExperimentalPathApi.
Улучшенная производительность функции String.replace
Новая реализация String.replace() ускоряет выполнение функции. Чувствительная к регистру версия использует цикл замены вручную, основанный на indexOf, в то время как нечувствительная к регистру — использует сопоставление с регулярными выражениями.
Kotlin Android Extensions
В 1.4.20 плагин Kotlin Android Extensions устарел, и генератор реализации Parcelable переместился в отдельный плагин.
Устаревание синтетических представлений
Синтетические представления были представлены в плагине Kotlin Android Extensions некоторое время назад для упрощения взаимодействия с элементами пользовательского интерфейса и сокращения избыточного кода. Теперь Google предлагает родной механизм, выполняющий ту же функцию — привязки представлений Android Jetpack's view bindings, и мы устареваем синтетические представления в пользу этих.
Мы вынесли генератор реализации Parcelable из kotlin-android-extensions и начали процесс устаревания остальной части — синтетических представлений. Пока что они будут продолжать работать с предупреждением об устаревании. В будущем вам потребуется переключить свой проект на другое решение. Вот руководство, которое поможет вам мигрировать свой проект Android со синтетических представлений на привязки представлений.
Новый плагин для генератора реализации Parcelable
Генератор реализации Parcelable теперь доступен в новом плагине kotlin-parcelize. Используйте этот плагин вместо kotlin-android-extensions.
Аннотация @Parcelize перемещена в пакет kotlinx.parcelize.
Узнайте больше о генераторе реализации Parcelable в документации Android.
© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/whatsnew1420.html