Spec-Zone.ru › Kotlin 2

Настройка проекта Kotlin/JS

В проектах Kotlin/JS в качестве системы сборки используется Gradle. Чтобы разработчикам было проще управлять проектами Kotlin/JS, мы предлагаем плагин Gradle kotlin.multiplatform, который предоставляет инструменты для настройки проекта, а также вспомогательные задачи для автоматизации рутинных операций, характерных для разработки на JavaScript.

Плагин загружает зависимости npm в фоновом режиме с помощью менеджеров пакетов npm или Yarn и собирает пакет JavaScript из проекта Kotlin с помощью webpack. Управлять зависимостями и настраивать параметры во многом можно непосредственно из файла сборки Gradle, при этом автоматически сгенерированные конфигурации можно переопределить для полного контроля.

Плагин org.jetbrains.kotlin.multiplatform можно вручную применить к проекту Gradle в файле build.gradle(.kts):

plugins {
    kotlin("multiplatform") version "2.4.20"
}
plugins {
    id 'org.jetbrains.kotlin.multiplatform' version '2.4.20'
}

Плагин Gradle для Kotlin Multiplatform позволяет управлять различными аспектами проекта в блоке kotlin {} скрипта сборки:

kotlin {
    // ...
}

В блоке kotlin {} можно управлять следующими аспектами:

  • Целевая среда выполнения: браузер или Node.js

  • Поддержка возможностей ES2015: классов, модулей и генераторов

  • Настройка степени детализации выходных файлов

  • Создание файлов объявлений TypeScript

  • Зависимости проекта: Maven и npm

  • Конфигурация запуска

  • Конфигурация тестирования

  • Сборка пакетов и поддержка CSS для браузерных проектов

  • Целевая директория и имя модуля

  • Файл package.json проекта

Среды выполнения

Проекты Kotlin/JS могут предназначаться для двух разных сред выполнения:

  • Браузер — для клиентских скриптов в браузерах

  • Node.js — для выполнения кода JavaScript вне браузера, например, для серверных скриптов.

Чтобы определить целевую среду выполнения для проекта Kotlin/JS, добавьте блок js {} с browser {} или nodejs {} внутри:

kotlin {
    js {
        browser {
        }
        binaries.executable()
    }
}

Инструкция binaries.executable() явно указывает компилятору Kotlin создавать исполняемые файлы .js. Если опустить binaries.executable(), компилятор будет создавать только внутренние для Kotlin файлы библиотек, которые можно использовать в других проектах, но нельзя запускать отдельно.

Как правило, создание таких файлов выполняется быстрее; это может стать способом оптимизации при работе с модулями проекта, не являющимися конечными.

Плагин Kotlin Multiplatform автоматически настраивает задачи для работы с выбранной средой. Это включает загрузку и установку среды и зависимостей, необходимых для запуска и тестирования приложения. Благодаря этому разработчики могут собирать, запускать и тестировать простые проекты без дополнительной настройки. Также можно использовать уже существующую установку. Узнайте, как использовать предварительно установленный Node.js.

Поддержка возможностей ES2015

Kotlin поддерживает возможности ES2015, в том числе:

  • Модули, которые упрощают кодовую базу и повышают удобство её сопровождения.

  • Классы, позволяющие применять принципы ООП и писать более чистый и понятный код.

  • Генераторы для компиляции приостанавливаемых функций, которые уменьшают итоговый размер пакета и упрощают отладку.

  • Встраивание кода JavaScript.

Можно включить сразу все поддерживаемые возможности ES2015, добавив цель компиляции es2015 в файл build.gradle(.kts):

tasks.withType<KotlinJsCompile>().configureEach {
    compilerOptions {
        target = "es2015"
    }
}

Подробнее об ES2015 (ECMAScript 2015, ES6) см. в официальной документации.

Настройка степени детализации выходных файлов

Можно выбрать, как компилятор будет создавать файлы .js в проекте:

  • Один на модуль. По умолчанию компилятор JS создает отдельные файлы .js для каждого модуля проекта в результате компиляции.

  • Один на проект. Можно скомпилировать весь проект в один файл .js, добавив следующую строку в файл gradle.properties:

    kotlin.js.ir.output.granularity=whole-program // 'per-module' is the default
    
  • Один на файл. Можно настроить более детализированный вывод, при котором для каждого файла Kotlin создается один (или два, если файл содержит экспортируемые объявления) файл JavaScript. Чтобы включить режим компиляции по файлам:

    1. Укажите es2015 в качестве цели компиляции, чтобы поддерживать возможности ES2015 в проекте.

    2. Добавьте следующую строку в файл gradle.properties:

      kotlin.js.ir.output.granularity=per-file // 'per-module' is the default
      

Создание файлов объявлений TypeScript (d.ts)

Компилятор Kotlin/JS может создавать определения TypeScript на основе кода Kotlin. Эти определения могут использоваться инструментами и IDE для JavaScript при работе с гибридными приложениями, чтобы:

  • Предоставлять автодополнение

  • Поддерживать статические анализаторы

  • Упрощать добавление кода Kotlin в проекты JavaScript и TypeScript

Создание определений TypeScript особенно полезно для сценариев совместного использования бизнес-логики.

Компилятор собирает все объявления верхнего уровня, помеченные аннотацией @JsExport, и автоматически создает определения TypeScript в файле .d.ts.

Чтобы создавать определения TypeScript, явно настройте эту возможность в файле сборки Gradle. Добавьте функцию generateTypeScriptDefinitions() в файл build.gradle.kts внутри блока js {}:

kotlin {
    js {
        binaries.executable()
        browser {
        }
        generateTypeScriptDefinitions()
    }
}

Определения можно найти в директории build/js/packages/<package_name>/kotlin рядом с соответствующим кодом JavaScript, не упакованным с помощью webpack.

Зависимости

Чтобы объявить зависимость, используйте блок dependencies {} в исходном наборе jsMain в файле build.gradle(.kts):

kotlin {
    sourceSets {
        jsMain {
            dependencies {
                implementation("org.example.myproject:1.1.0")
            }
        }
    }
}
kotlin {
    sourceSets {
        jsMain {
            dependencies {
                implementation 'org.example.myproject:1.1.0'
            }
        }
    }
}

В качестве зависимостей можно использовать только библиотеки, содержащие артефакты для Kotlin/JS. Чтобы разрешать зависимости, укажите репозитории, в которых Gradle должен искать их, в блоке repositories {} файла build.gradle(.kts). Например:

repositories {
    mavenCentral()
}

Если добавляемая библиотека зависит от пакетов из npm, Gradle автоматически разрешает и эти транзитивные зависимости.

Стандартные библиотеки Kotlin

Зависимости от стандартной библиотеки добавляются автоматически. Версия стандартной библиотеки совпадает с версией плагина Kotlin Multiplatform.

Для многоплатформенных тестов доступен API kotlin.test. При создании многоплатформенного проекта можно добавить зависимости для тестирования во все исходные наборы с помощью одной зависимости в commonTest:

kotlin {
    sourceSets {
        commonTest.dependencies {
            implementation(kotlin("test")) // Brings all the platform dependencies automatically
        }
    }
}
kotlin {
    sourceSets {
        commonTest {
            dependencies {
                implementation kotlin("test") // Brings all the platform dependencies automatically
            }
        }
    }
}

Зависимости npm

В мире JavaScript наиболее распространенный способ управления зависимостями — это npm. В нем находится крупнейший общедоступный репозиторий модулей JavaScript.

Плагин Gradle для Kotlin Multiplatform позволяет объявлять зависимости npm в скрипте сборки Gradle так же, как и любые другие зависимости.

Чтобы объявить зависимость npm, передайте ее имя и версию функции npm() внутри объявления зависимости. Также можно указать один или несколько диапазонов версий, используя синтаксис semver в npm.

kotlin {
    sourceSets {
        jsMain {
            dependencies {
                implementation(npm("core-js", "^3.38.1"))
            }
        }
    }
}
kotlin {
    sourceSets {
        jsMain {
            dependencies {
                implementation npm('core-js', '^3.38.1')
            }
        }
    }
}

По умолчанию плагин использует отдельный экземпляр менеджера пакетов Yarn для загрузки и установки зависимостей npm. Он работает без дополнительной настройки, но его можно настроить под конкретные задачи.

Кроме того, вместо этого можно напрямую работать с зависимостями npm с помощью менеджера пакетов npm. Чтобы использовать npm в качестве менеджера пакетов, задайте в файле gradle.properties следующее свойство:

kotlin.js.yarn=false

Помимо обычных зависимостей, из DSL Gradle можно использовать еще три типа зависимостей. Подробнее о том, когда лучше использовать каждый из типов, см. в официальной документации npm:

  • devDependencies — с помощью devNpm(...),

  • optionalDependencies — с помощью optionalNpm(...) и

  • peerDependencies — с помощью peerNpm(...).

После установки зависимости npm ее API можно использовать в коде, как описано в разделе Вызов JS из Kotlin.

Задача run

Плагин Gradle для Kotlin Multiplatform предоставляет задачу jsBrowserDevelopmentRun, позволяющую запускать чистые проекты Kotlin/JS без дополнительной настройки.

Для запуска проектов Kotlin/JS в браузере эта задача является псевдонимом задачи browserDevelopmentRun (которая также доступна в многоплатформенных проектах Kotlin). Для предоставления артефактов JavaScript используется webpack-dev-server. Чтобы настроить конфигурацию, используемую webpack-dev-server, например изменить порт сервера, используйте файл конфигурации webpack.

Для запуска проектов Kotlin/JS, предназначенных для Node.js, используйте задачу jsNodeDevelopmentRun, которая является псевдонимом задачи nodeRun.

Чтобы запустить проект, выполните стандартную задачу жизненного цикла jsBrowserDevelopmentRun или соответствующую ей задачу-псевдоним:

./gradlew jsBrowserDevelopmentRun

Чтобы автоматически пересобирать приложение после изменений в исходных файлах, используйте функцию непрерывной сборки Gradle:

./gradlew jsBrowserDevelopmentRun --continuous

или

./gradlew jsBrowserDevelopmentRun -t

После успешной сборки проекта webpack-dev-server автоматически обновит страницу браузера.

Задача test

Плагин Gradle для Kotlin Multiplatform автоматически настраивает инфраструктуру тестирования проектов. Он загружает и устанавливает необходимые средства запуска тестов и другие зависимости.

Для браузерных проектов можно выбрать средство запуска тестов Karma или новый DSL для тестирования в браузере. Для проектов Node.js доступен фреймворк тестирования Mocha.

Плагин также предоставляет полезные возможности для тестирования, например:

  • Создание карт кода

  • Создание отчетов о тестировании

  • Отображение результатов тестирования в консоли

Karma

Проект Karma считается устаревшим. Новые возможности и исправления ошибок не планируются. Для тестирования в браузере попробуйте новый DSL для тестирования в браузере.

Чтобы настроить средство запуска тестов Karma, добавьте блок useKarma {} внутрь testTask браузера в файле build.gradle(.kts). Например, чтобы запускать тесты в определенных браузерах, используйте:

kotlin {
    js {
        browser {
            testTask {
                useKarma {
                    useIe()
                    useSafari()
                    useFirefox()
                    useChrome()
                    useChromeCanary()
                    useChromeHeadless()
                    usePhantomJS()
                    useOpera()
                }
            }
        }
        binaries.executable()
        // ...
    }
}

В качестве альтернативы можно добавить цели браузеров для тестирования в файл gradle.properties:

kotlin.js.browser.karma.browsers=firefox,safari

Это позволяет определить список браузеров для всех модулей, а затем добавить отдельные браузеры в файлы сборки конкретных модулей.

Плагин Gradle для Kotlin Multiplatform автоматически создает файл конфигурации Karma в build/js/packages/projectName-test/karma.conf.js во время сборки. Файл содержит настройки, заданные в блоке useKarma {} файла сборки.

Также можно поместить дополнительные файлы конфигурации в директорию karma.config.d в корне проекта. Все файлы конфигурации .js в этой директории будут обнаружены и автоматически объединены с файлом karma.conf.js, создаваемым во время сборки.

Подробнее о конфигурации Karma см. в документации Karma.

DSL для тестирования в браузере

Kotlin предлагает экспериментальный DSL для запуска тестов Kotlin/JS в браузере. Он разработан независимо от конкретных технологий. В текущей реализации используются следующие инструменты:

  • Playwright служит драйвером браузера и менеджером дистрибутивов, поддерживающим движки браузеров Chromium, Firefox и WebKit (Safari).

  • Mocha служит средством запуска тестов.

  • webpack служит сборщиком пакетов (в будущих выпусках его заменит Vite).

Чтобы попробовать новый DSL для тестирования в браузере, добавьте блок test {} для целевого объекта Kotlin/JS внутрь browser {}:

import org.jetbrains.kotlin.gradle.ExperimentalJsTestDsl
import kotlin.time.Duration.Companion.seconds

kotlin {
    js {
        browser {
            @OptIn(ExperimentalJsTestDsl::class)
            test {
                // Configures the default timeout for all runners with kotlin.Duration
                timeout = 30.seconds
                // Configures headless mode using Gradle providers
                headless = providers
                    .environmentVariable("IS_IN_CI")
                    .map { it.toBoolean() }
                    .orElse(false)
                // Enables and configures a custom Chromium runner
                chromium("chromium-no-webgl2") {
                    // Overrides the default timeout for this runner
                    timeout = 10.seconds

                    // Chromium-specific extra launch argument
                    launchArgs.add("--disable-webgl2")
                }
                // Enables the Firefox runner
                firefox()
                // Enable WebKit (Safari) test runner
                webkit()
                // Enables and configures a custom WebKit runner
                webkit("headful") {
                    headless = false
                }
            }
        }
    }
}

Подробнее о настройке нового DSL для тестирования в браузере см. в разделе Запуск тестов в Kotlin/JS.

Node.js

Для проектов Node.js плагин Gradle для Kotlin Multiplatform автоматически настраивает фреймворк тестирования Mocha.

Чтобы указать переменные среды, используемые средствами запуска тестов Node.js (например, чтобы передать тестам внешнюю информацию или настроить разрешение пакетов), используйте функцию environment() с парой «ключ-значение» внутри блока testTask {} в файле сборки:

kotlin {
    js {
        nodejs {
            testTask {
                environment("key", "value")
            }
        }
    }
}

Запуск тестов

По умолчанию плагин Gradle для Kotlin Multiplatform использует Headless Chrome для запуска браузерных тестов. Плагин не включает браузеры в свой состав; средства запуска тестов по-разному обрабатывают отсутствие браузеров:

  • При использовании Karma любой другой браузер должен быть установлен на вашем компьютере, чтобы плагин мог использовать его для запуска тестов. Если вы запускаете тесты Kotlin/JS на сервере непрерывной интеграции, убедитесь, что нужные браузеры установлены и там.

  • При использовании нового DSL для тестирования в браузере плагин при первом запуске устанавливает необходимые браузеры с помощью команды playwright install. Playwright управляет расположением этих браузеров и не использует браузеры, установленные локально.

Чтобы запустить тесты, выполните стандартную задачу жизненного цикла check:

./gradlew check

Чтобы пропустить тесты, отключите их в блоке testTask {} файла сборки:

kotlin {
    js {
        browser {
            testTask {
                enabled.set(false)
            }
        }
        binaries.executable()
        // ...
    }
}

Сборка с помощью webpack

Для браузерных целевых платформ плагин Gradle для Kotlin Multiplatform использует широко известный сборщик модулей webpack.

Задача webpack

Наиболее распространенные настройки webpack можно задать непосредственно в блоке конфигурации kotlin.js.browser.webpackTask {} файла сборки Gradle:

  • mainOutputFileName − имя выходного файла webpack. Он будет создан в <projectDir>/build/kotlin-webpack/<targetName>/<binaryName> после выполнения задачи webpack. По умолчанию используется имя проекта.

  • output.libraryTarget − система модулей для выходных файлов webpack. Подробнее о доступных системах модулей для проектов Kotlin/JS. По умолчанию используется значение umd.

webpackTask {
    mainOutputFileName = "mycustomfilename.js"
    output.libraryTarget = "commonjs2"
}

Также можно настроить общие параметры webpack, используемые задачами сборки пакетов, запуска и тестирования, в блоке commonWebpackConfig {}.

Файл конфигурации webpack

Плагин Gradle для Kotlin Multiplatform автоматически создает стандартный файл конфигурации webpack во время сборки. Он находится в build/js/packages/projectName/webpack.config.js.

Чтобы дополнительно настроить webpack, поместите файлы конфигурации в директорию webpack.config.d в корне проекта. При сборке проекта все файлы конфигурации .js будут автоматически объединены в файл build/js/packages/projectName/webpack.config.js. Например, чтобы добавить новый загрузчик webpack, добавьте следующий код в файл .js в директории webpack.config.d:

В данном случае объект конфигурации — это глобальный объект config. Его нужно изменить в скрипте.

config.module.rules.push({
    test: /\.extension$/,
    loader: 'loader-name'
});

Все возможности настройки webpack подробно описаны в его документации.

Сборка исполняемых файлов

Для создания исполняемых артефактов JavaScript с помощью webpack плагин Gradle для Kotlin Multiplatform предоставляет задачи Gradle jsBrowserDevelopmentWebpack и jsBrowserProductionWebpack.

  • jsBrowserDevelopmentWebpack создает артефакты для разработки: они больше по размеру, но создаются быстро. Поэтому используйте задачи jsBrowserDevelopmentWebpack во время активной разработки.

  • jsBrowserProductionWebpack применяет удаление неиспользуемого кода к созданным артефактам и минифицирует итоговый файл JavaScript. Это занимает больше времени, но позволяет получить исполняемые файлы меньшего размера. Поэтому используйте задачу jsBrowserProductionWebpack при подготовке проекта к эксплуатации.

Выполните одну из этих задач, чтобы получить соответствующие артефакты для разработки или эксплуатации. Созданные файлы будут доступны в build/kotlin-webpack, если не указано иное.

./gradlew jsBrowserProductionWebpack

Обратите внимание: эти задачи доступны только в том случае, если целевой объект настроен на создание исполняемых файлов (с помощью binaries.executable()).

Чтобы создать дистрибутив в директории build/dist/<targetName>/<binaryName>, выполните вместо этого задачу jsBrowserDistribution:

./gradlew jsBrowserDistribution

Эта задача создает готовый к использованию дистрибутив, включающий ресурсы проекта.

CSS

Плагин Kotlin Multiplatform Gradle также поддерживает загрузчики CSS и style для webpack. Хотя все параметры можно изменить, напрямую отредактировав файлы конфигурации webpack, используемые для сборки проекта, наиболее часто используемые настройки доступны непосредственно из файла build.gradle(.kts).

Чтобы включить поддержку CSS в проекте, задайте параметр cssSupport.enabled в файле сборки Gradle в блоке commonWebpackConfig {}. Эта конфигурация также включена по умолчанию при создании нового проекта с помощью мастера.

browser {
    commonWebpackConfig {
        cssSupport {
            enabled.set(true)
        }
    }
}
browser {
    commonWebpackConfig {
        cssSupport {
            it.enabled = true
        }
    }
}

Кроме того, поддержку CSS можно добавить отдельно для webpackTask {}, runTask {} и testTask {}:

browser {
    webpackTask {
        cssSupport {
            enabled.set(true)
        }
    }
    runTask {
        cssSupport {
            enabled.set(true)
        }
    }
    testTask {
        useKarma {
            // ...
            webpackConfig.cssSupport {
                enabled.set(true)
            }
        }
    }
}
browser {
    webpackTask {
        cssSupport {
            it.enabled = true
        }
    }
    runTask {
        cssSupport {
            it.enabled = true
        }
    }
    testTask {
        useKarma {
            // ...
            webpackConfig.cssSupport {
                it.enabled = true
            }
        }
    }
}

Включение поддержки CSS в проекте помогает предотвратить распространённые ошибки, возникающие при попытке использовать таблицы стилей в проекте без соответствующей конфигурации, например Module parse failed: Unexpected character '@' (14:0).

С помощью cssSupport.mode можно указать, как следует обрабатывать обнаруженный CSS. Доступны следующие значения:

  • "inline" (по умолчанию): стили добавляются в глобальный тег <style>.

  • "extract": стили извлекаются в отдельный файл. Затем его можно подключить на HTML-странице.

  • "import": стили обрабатываются как строки. Это может быть полезно, если вам нужен доступ к CSS из кода (например, val styles = require("main.css")).

Чтобы использовать разные режимы в одном проекте, используйте cssSupport.rules. Здесь можно указать список KotlinWebpackCssRules, каждый элемент которого задаёт режим, а также шаблоны include и exclude.

Node.js

Для проектов Kotlin/JS, предназначенных для Node.js, плагин автоматически загружает и устанавливает среду Node.js на хост-компьютер. Если у вас уже есть экземпляр Node.js, можно использовать его.

Настройки Node.js можно задать для каждого подпроекта отдельно или для проекта в целом.

Изменение версии Node.js

В настоящее время версия Node.js по умолчанию — 24.16.0, но для конкретного подпроекта можно использовать другую версию. Добавьте следующие строки в файл build.gradle(.kts) подпроекта. Например:

project.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsPlugin> {
    project.the<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsEnvSpec>().version = "26.2.0"
}
project.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsPlugin) {
    project.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsEnvSpec).version = "26.2.0"
}

Чтобы задать версию для всего проекта, включая все подпроекты, добавьте тот же код в блок allprojects {}. Например:

allprojects {
    project.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsPlugin> {
        project.the<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsEnvSpec>().version = "26.2.0"
    }
}
allprojects {
    project.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsPlugin) {
        project.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsEnvSpec).version = "26.2.0"
    }
}

Использование предварительно установленного Node.js

Если Node.js уже установлен на хост-компьютере, на котором вы собираете проекты Kotlin/JS, можно настроить плагин Kotlin Multiplatform Gradle так, чтобы он использовал эту версию Node.js, а не устанавливал собственную.

Чтобы использовать предварительно установленный экземпляр Node.js, добавьте следующие строки в файл build.gradle(.kts):

project.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsPlugin> {
    // Set to `true` for default behavior
    project.the<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsEnvSpec>().download = false
}
project.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsPlugin) {
    // Set to `true` for default behavior
    project.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsEnvSpec).download = false
}

Yarn

По умолчанию плагин управляет собственным экземпляром пакетного менеджера Yarn, чтобы загружать и устанавливать объявленные зависимости во время сборки. Он работает сразу после установки без дополнительной настройки, однако вы можете изменить его параметры или использовать Yarn, уже установленный на хост-компьютере.

Дополнительные возможности Yarn: .yarnrc

Чтобы настроить дополнительные возможности Yarn, поместите файл .yarnrc в корневой каталог проекта. Во время сборки он будет автоматически обнаружен.

Например, чтобы использовать пользовательский реестр пакетов npm, добавьте следующую строку в файл с именем .yarnrc в корневом каталоге проекта:

registry "http://my.registry/api/npm/"

Подробнее о .yarnrc см. в официальной документации Yarn.

Использование предварительно установленного Yarn

Если Yarn уже установлен на хост-компьютере, на котором вы собираете проекты Kotlin/JS, можно настроить плагин Kotlin Multiplatform Gradle так, чтобы он использовал эту версию Yarn, а не устанавливал собственную.

Чтобы использовать предварительно установленный экземпляр Yarn, добавьте следующие строки в build.gradle(.kts):

rootProject.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin> {
    rootProject.the<org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootEnvSpec>().download = false
    // "true" for default behavior
}
rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin) {
    rootProject.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootEnvSpec).download = false
}
 

Фиксация версий с помощью kotlin-js-store

Каталог kotlin-js-store в корневом каталоге проекта автоматически создаётся плагином Kotlin Multiplatform Gradle для хранения файла yarn.lock, необходимого для фиксации версий. Файлом блокировки полностью управляет плагин Yarn; он обновляется при выполнении задачи Gradle kotlinNpmInstall.

В соответствии с рекомендуемой практикой добавьте kotlin-js-store и его содержимое в систему контроля версий. Это гарантирует, что приложение будет собираться с одним и тем же деревом зависимостей на всех компьютерах.

При необходимости можно изменить имя каталога и файла блокировки в build.gradle(.kts):

rootProject.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin> {
    rootProject.the<org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension>().lockFileDirectory =
        project.rootDir.resolve("my-kotlin-js-store")
    rootProject.the<org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension>().lockFileName = "my-yarn.lock"
}
rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin) {
    rootProject.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension).lockFileDirectory =
        file("my-kotlin-js-store")
    rootProject.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension).lockFileName = 'my-yarn.lock'
}

Изменение имени файла блокировки может привести к тому, что инструменты проверки зависимостей перестанут обнаруживать этот файл.

Подробнее о yarn.lock см. в официальной документации Yarn.

Уведомление об обновлении yarn.lock

Kotlin/JS предоставляет настройки Gradle, которые могут уведомить вас об изменении файла yarn.lock. Эти настройки можно использовать, если вы хотите получать уведомления о незаметном изменении yarn.lock во время сборки CI:

  • YarnLockMismatchReport определяет, как сообщать об изменениях файла yarn.lock. Можно использовать одно из следующих значений:

    • FAIL приводит к сбою соответствующей задачи Gradle. Это значение используется по умолчанию.

    • WARNING записывает сведения об изменениях в журнал предупреждений.

    • NONE отключает уведомления.

  • reportNewYarnLock явно сообщает о недавно созданном файле yarn.lock. По умолчанию этот параметр отключён: обычно новый файл yarn.lock создаётся при первом запуске. Этот параметр можно использовать, чтобы убедиться, что файл добавлен в репозиторий.

  • yarnLockAutoReplace автоматически заменяет yarn.lock при каждом запуске задачи Gradle.

Чтобы использовать эти параметры, обновите build.gradle(.kts) следующим образом:

import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockMismatchReport
import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension

rootProject.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin> {
    rootProject.the<YarnRootExtension>().yarnLockMismatchReport =
        YarnLockMismatchReport.WARNING // NONE | FAIL
    rootProject.the<YarnRootExtension>().reportNewYarnLock = false // true
    rootProject.the<YarnRootExtension>().yarnLockAutoReplace = false // true
}
import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockMismatchReport
import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension

rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin) {
    rootProject.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension).yarnLockMismatchReport =
        YarnLockMismatchReport.WARNING // NONE | FAIL
    rootProject.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension).reportNewYarnLock = false // true
    rootProject.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension).yarnLockAutoReplace = false // true
}

Установка зависимостей npm с параметром --ignore-scripts по умолчанию

Чтобы снизить вероятность выполнения вредоносного кода из скомпрометированных пакетов npm, плагин Kotlin Multiplatform Gradle по умолчанию запрещает выполнение сценариев жизненного цикла при установке зависимостей npm.

Чтобы явно разрешить выполнение сценариев жизненного цикла, добавьте следующие строки в build.gradle(.kts):

rootProject.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin> { 
    rootProject.the<org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension>().ignoreScripts = false
}
rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin) {
    rootProject.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension).ignoreScripts = false
}

Каталог назначения дистрибутива

По умолчанию результаты сборки проекта Kotlin/JS находятся в каталоге /build/dist/<targetName>/<binaryName> в корневом каталоге проекта.

Чтобы задать другое расположение файлов дистрибутива проекта, добавьте блок distribution {} в скрипт сборки внутри блока browser {} и присвойте значение свойству outputDirectory с помощью метода set(). После запуска задачи сборки проекта Gradle сохранит выходной пакет в этом каталоге вместе с ресурсами проекта.

kotlin {
    js {
        browser {
            distribution {
                outputDirectory.set(projectDir.resolve("output"))
            }
        }
        binaries.executable()
        // ...
    }
}
kotlin {
    js {
        browser {
            distribution {
                outputDirectory = file("$projectDir/output")
            }
        }
        binaries.executable()
        // ...
    }
}

Имя модуля

Чтобы изменить имя JavaScript-модуля (который создаётся в build/js/packages/myModuleName), включая соответствующие файлы .js и .d.ts, используйте параметр outputModuleName:

kotlin {
    js {
        outputModuleName = "myModuleName"
    }
}

Обратите внимание, что это не влияет на выходные данные webpack в build/dist.

Настройка package.json

Файл package.json содержит метаданные пакета JavaScript. Популярные реестры пакетов, такие как npm, требуют наличия такого файла у всех публикуемых пакетов. Они используют его для отслеживания публикаций пакетов и управления ими.

Плагин Kotlin Multiplatform Gradle автоматически создаёт файл package.json для проектов Kotlin/JS во время сборки. По умолчанию файл содержит основные данные: имя, версию, лицензию, зависимости и некоторые другие атрибуты пакета.

Помимо основных атрибутов пакета, package.json может задавать поведение проекта JavaScript, например определять доступные для запуска скрипты.

Пользовательские записи можно добавить в package.json проекта с помощью DSL Gradle. Чтобы добавить пользовательские поля в package.json, используйте функцию customField() в блоке packageJson компиляций:

kotlin {
    js {
        compilations["main"].packageJson {
            customField("hello", mapOf("one" to 1, "two" to 2))
        }
    }
}

При сборке проекта этот код добавляет следующий блок в файл package.json:

"hello": {
    "one": 1,
    "two": 2
}

Подробнее о создании файлов package.json для реестра npm см. в документации npm.

04 сентября 2026
Начало работы с Kotlin/JSЗапуск Kotlin/JS

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/js-project-setup.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API