Что нового в Kotlin 1.4.20
Дата выпуска: 23 ноября 2020 года
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. При конфликте требований зависимостей два установленных npm пакета могут вызвать ошибки.
Для решения этой проблемы 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.
Узнайте, как создать приложения Kotlin/JS из шаблонов.
Игнорирование ошибок компиляции с помощью компилятора 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-проекты. Примеры вы найдете в примере Koltin с CocoaPods.
Обновленная интеграция с Xcode
Для корректной работы с Xcode, Kotlin требует некоторых изменений в Podfile:
Если у вашего Kotlin Pod есть Git, HTTP или specRepo зависимость, вы должны указать её в 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. Работа с современным API файлов JVM в стиле 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, и мы устареваем синтетические представления в пользу их.
Мы вынесли генератор реализаций Parcelable из kotlin-android-extensions и начали цикл устаревания для остальной части — синтетических представлений. Пока они будут работать с предупреждением об устаревании. В будущем вам нужно будет переключить свой проект на другое решение. Вот руководство, которое поможет вам мигрировать свой Android-проект от синтетики к связыванию представлений.
Новый плагин для генератора реализации Parcelable
Генератор реализации Parcelable теперь доступен в новом плагине kotlin-parcelize. Используйте этот плагин вместо kotlin-android-extensions.
Аннотация @Parcelize перемещена в пакет kotlinx.parcelize.
Узнайте больше о генераторе реализаций Parcelable в документации Android.
© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/whatsnew1420.html