Spec-Zone.ru › Kotlin 1.6

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

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

Чтобы создать проект Kotlin/JS в IntelliJ IDEA, перейдите в Файл | Новый | Проект. Затем выберите Kotlin и выберите целевой Kotlin/JS, который вам подходит. Не забудьте выбрать язык для скрипта сборки: Groovy или Kotlin.

New project wizard

В качестве альтернативы вы можете вручную применить плагин к проекту Gradle в файле Gradle (build.gradle или build.gradle.kts).

plugins {
     kotlin("js") version "1.6.20"
}
plugins {
    id 'org.jetbrains.kotlin.js' version '1.6.20'
}

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

kotlin {
    //...
}

Внутри раздела kotlin, вы можете управлять следующими аспектами:

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

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

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

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

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

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

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

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

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

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

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

Для определения целевой среды выполнения проекта Kotlin/JS добавьте раздел js с browser {} или nodejs {}.

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

Инструкция binaries.executable() явно указывает компилятору Kotlin на генерацию исполняемых .js файлов. Это стандартное поведение при использовании текущего компилятора Kotlin/JS, но инструкция явно требуется, если вы работаете с компилятором Kotlin/JS IR или установили kotlin.js.generate.executable.default=false в вашем gradle.properties. В этих случаях пропуск binaries.executable() приведет к тому, что компилятор сгенерирует только внутренние библиотечные файлы Kotlin, которые можно использовать из других проектов, но нельзя запускать самостоятельно. (Это, как правило, быстрее, чем создание исполняемых файлов, и может быть оптимизацией при работе с нелистовыми модулями проекта).

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

Зависимости

Как и любые другие проекты Gradle, проекты Kotlin/JS поддерживают традиционные объявления зависимостей Gradle в разделе dependencies скрипта сборки.

dependencies {
    implementation("org.example.myproject", "1.1.0")
}
dependencies {
    implementation 'org.example.myproject:1.1.0'
}

Плагин Kotlin/JS Gradle также поддерживает объявления зависимостей для определенных наборов исходных файлов в разделе kotlin скрипта сборки.

kotlin {
    sourceSets["main"].dependencies {
        implementation("org.example.myproject", "1.1.0")
    }
}
kotlin {
    sourceSets {
        main {
            dependencies {
                implementation 'org.example.myproject:1.1.0'
            }
        }
    }
}

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

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

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

Зависимость от стандартной библиотеки Kotlin/JS является обязательной для всех проектов Kotlin/JS и поэтому неявной – не нужно добавлять никаких артефактов.

Если ваш проект содержит тесты на Kotlin, вы должны добавить зависимость от библиотеки kotlin.test:

dependencies {
    testImplementation(kotlin("test-js"))
}
dependencies {
    testImplementation 'org.jetbrains.kotlin:kotlin-test-js'
}

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

В мире JavaScript наиболее распространённый способ управления зависимостями – npm. Он предлагает самый большой общедоступный репозиторий JavaScript-модулей.

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

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

dependencies {
    implementation(npm("react", "> 14.0.0 <=16.9.0"))
}
dependencies {
    implementation npm('react', '> 14.0.0 <=16.9.0')
}

Плагин использует менеджер пакетов Yarn для загрузки и установки зависимостей NPM. Он работает без дополнительной настройки, но вы можете настроить его под свои нужды. Узнайте, как настроить Yarn в плагине Kotlin/JS Gradle.

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

  • devDependencies, через devNpm(...),

  • optionalDependencies через optionalNpm(...), и

  • peerDependencies через peerNpm(...).

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

задача run

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

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

Для запуска проектов Kotlin/JS, нацеленных на Node.js, задача run является псевдонимом задачи nodeRun (которая также доступна в проектах Kotlin multiplatform).

Для запуска проекта выполните стандартную задачу жизненного цикла run, или псевдоним, которому она соответствует:

./gradlew run

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

./gradlew run --continuous

или

./gradlew run -t

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

задача test

Плагин Kotlin/JS Gradle автоматически настраивает инфраструктуру тестирования для проектов. Для проектов браузера он загружает и устанавливает тестовый запуск Karma с другими необходимыми зависимостями; для проектов Node.js используется тестовый фреймворк Mocha.

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

  • Генерация source map

  • Генерация отчётов о тестах

  • Результаты выполнения тестов в консоли

Для запуска тестов браузера плагин по умолчанию использует Headless Chrome. Вы также можете выбрать другой браузер для запуска тестов, добавив соответствующие записи в раздел useKarma скрипта сборки:

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

Обратите внимание, что плагин Kotlin/JS Gradle не автоматически устанавливает эти браузеры для вас, а только использует те, которые доступны в его среде выполнения. Если вы выполняете тесты Kotlin/JS на сервере непрерывной интеграции, например, убедитесь, что браузеры, с которыми вы хотите протестировать, установлены.

Если вы хотите пропустить тесты, добавьте строку enabled = false в testTask.

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

Для запуска тестов выполните стандартную задачу жизненного цикла check:

./gradlew check

Конфигурация Karma

Плагин Kotlin/JS Gradle автоматически генерирует файл конфигурации Karma во время сборки, который включает ваши настройки из блока kotlin.js.browser.testTask.useKarma в вашем build.gradle(.kts). Вы можете найти файл по адресу build/js/packages/projectName-test/karma.conf.js. Чтобы внести изменения в конфигурацию, используемую Karma, поместите дополнительные файлы конфигурации в директорию karma.config.d в корне вашего проекта. Все файлы конфигурации .js в этой директории будут взяты и автоматически объединены в сгенерированный файл karma.conf.js во время сборки.

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

Связывание webpack

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

Версия webpack

Плагин Kotlin/JS использует webpack 5.

Если у вас есть проекты, созданные с версиями плагина ранее 1.5.0, вы можете временно вернуться к webpack 4, используемому в этих версиях, добавив следующую строку в gradle.properties вашего проекта:

kotlin.js.webpack.major.version=4

Задача webpack

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

  • outputFileName — имя выходного файла webpacked. Он будет сгенерирован в <projectDir>/build/distibution/ после выполнения задачи webpack. Значение по умолчанию — имя проекта.

  • output.libraryTarget — система модулей для выходного файла webpacked. Узнайте больше о доступных системах модулей для проектов Kotlin/JS. Значение по умолчанию — umd.

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

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

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

Плагин Kotlin/JS Gradle автоматически генерирует стандартный файл конфигурации 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.module.rules.push({
    test: /\.extension$/,
    loader: 'loader-name'
});

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

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

Для создания исполняемых JavaScript-артефактов через webpack плагин Kotlin/JS содержит задачи Gradle browserDevelopmentWebpack и browserProductionWebpack.

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

  • browserProductionWebpack применяет удаление мёртвого кода к сгенерированным артефактам и минимизирует результирующий JavaScript-файл, что занимает больше времени, но генерирует исполняемые файлы меньшего размера. Поэтому используйте задачу browserProductionWebpack при подготовке вашего проекта к производству.

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

./gradlew browserProductionWebpack

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

CSS

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

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

browser {
    commonWebpackConfig {
        cssSupport.enabled = true
    }
    binaries.executable()
}

В качестве альтернативы, вы можете добавить поддержку CSS независимо для webpackTask, runTask, и testTask.

webpackTask {
   cssSupport.enabled = true
}
runTask {
   cssSupport.enabled = true
}
testTask {
   useKarma {
      // . . .
      webpackConfig.cssSupport.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 шаблоны.

END_OF_DOCUMENT_MARKER

Node.js

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

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

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

Для использования предварительно установленного экземпляра Node.js добавьте следующие строки в ваш build.gradle(.kts):

rootProject.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin> {
    rootProject.the<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension>().download = false
    // or true for default behavior
}
 
rootProject.plugins.withType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin) {
    rootProject.extensions.getByType(org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension).download = false
}

Yarn

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

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

Для настройки дополнительных возможностей Yarn поместите файл .yarnrc в корень вашего проекта. Он автоматически подхватывается во время сборки.

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

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

Для получения дополнительной информации о .yarnrc, посетите официальную документацию Yarn.

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

Если Yarn уже установлен на хосте, где вы собираете проекты Kotlin/JS, вы можете настроить плагин Kotlin/JS 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.YarnRootExtension>().download = false
    // or 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.YarnRootExtension).download = false
}
 

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

Фиксация версий с помощью kotlin-js-store доступна начиная с Kotlin 1.6.10.

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

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

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

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.

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

Установка зависимостей npm с --ignore-scripts по умолчанию доступна начиная с Kotlin 1.6.10.

Для уменьшения вероятности выполнения вредоносного кода из скомпрометированных пакетов npm, плагин Kotlin/JS 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/distribution в корне проекта.

Для установки другого расположения файлов дистрибутива проекта добавьте блок distribution внутри browser в скрипте сборки и присвойте значение свойству directory. После выполнения задачи сборки проекта Gradle сохранит пакетный выходной файл в этом расположении вместе с ресурсами проекта.

kotlin {
    js {
        browser {
            distribution {
                directory = File("$projectDir/output/")
            }
        }
        binaries.executable()
        // . . .
    }
}
kotlin {
    js {
        browser {
            distribution {
                directory = file("$projectDir/output/")
            }
        }
        binaries.executable()
        // . . .
    }
}

Имя модуля

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

js {
   moduleName = "myModuleName"
}

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

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

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

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

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

Вы можете добавить пользовательские записи в package.json проекта через Gradle DSL. Для добавления пользовательских полей в 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.

Поиск и устранение неполадок

При сборке проекта Kotlin/JS с использованием Kotlin 1.3.xx вы можете столкнуться с ошибкой Gradle, если одна из ваших зависимостей (или любая транзитивная зависимость) была собрана с использованием Kotlin 1.4 или более поздней версии: Could not determine the dependencies of task ':client:jsTestPackageJson'./Cannot choose between the following variants. Это известная проблема, обходное решение предлагается здесь.

Последнее изменение: 07 апреля 2022 г.
Начало работы с Kotlin/JS для React Запуск Kotlin/JS

© 2010–2022 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