如何将 JS 目标添加到 KMM 项目?

Ste*_*ein 3 intellij-idea android-studio kotlin-multiplatform kotlin-js

我有一个 AndrodiStudio KMM 项目,我想添加一个 JS 目标。

鉴于 JS 开发仅在 IntelliJ 中可用,我希望我必须在 IDEA 中打开项目添加一个“模块”——但我什至不知道选择哪个——它们似乎都不是“正确”适合:

  • 在 Gradle 部分,有“用于浏览器的 Kotlin/JS 和“Kotlin/JVM”。添加“Kotlin/JS”会破坏*整个项目的 Gradle 构建。“Kotlin/Multiplatform”听起来不像我想要的我已经有了“共享”模块(虽然它不包括 JS)

  • 在 Kotlin 部分,有“KS | IDEA”。显然,我不想将基于“IDEA 构建系统”的内容添加到基于 gradle.kts 的项目中。

所以我的问题是:

  • 哪个模块模板是在“iosApp”和“androidApp”(在 AndroidStudio 或 Idea 中?)旁边添加“jsApp”(或 webApp)的最佳起点?

  • 我需要向“shared/build.gradle.kts”添加什么来支持“jsMain”和“jsTest”文件夹?是否有不同/更好的起点(例如,Github 上涵盖所有平台的教程或最小的“helloWorld”示例)?

我的代码的当前结构与 Android Studio 中的 KMM 项目模板 1:1 对应:https : //github.com/stefanhaustein/komponents

*) 错误信息:

Error resolving plugin [id: 'org.jetbrains.kotlin.multiplatform', version: '1.4.31']
> Plugin request for plugin already on the classpath must not include a version
Run Code Online (Sandbox Code Playgroud)

Ste*_*ein 5

通过创建一个新的 Kotlin/JS 项目并将其复制到jsAppKMM 项目中(平行于iosApp等)使其工作。最低限度jsApp/build.gradle.kts似乎是:

plugins {
    kotlin("js")
}

dependencies {
    implementation(project(":shared"))
}

kotlin {
    js() {
        browser {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在 中shared/build.gradle.kts,我需要将以下代码段添加到 kotlin 部分(与android()ios{...}

    js {
        browser {     
        }
    }
Run Code Online (Sandbox Code Playgroud)

为什么这花了我比预期更长的时间的陷阱:

  • 糟糕的时期遗忘.ktsbuild.gradle.kts和梦幻般的错误信息
  • 因为 jsAppbuild.gradle.kts现在是嵌套的,所以 kotlin 插件version显然不能在那里(猜测它对一致性有意义)。
  • js 源文件名index.html需要匹配模块名(jsApp在我的例子中)。
  • 不要忘记include(":jsApp")settings.gradle.kts

推荐步骤:

  • 尝试首先让“web”模块工作
  • 使用基于 gradle 的运行配置
  • 只有当web示例项目在新结构下工作时,才连接共享代码