如何使用Kotlin MPP中的Gradle将Vert.x网站和Kotlin粘合在一起 问题更新我尝试过的问题

问题描述

问题

我不清楚如何使用Gradle(Kotlin DSL)配置Kotlin MPP(多平台平台项目),以将Vert.x Web与Kotlin / JS目标上的Kotlin React一起用于Kotlin / JVM目标。

更新

您可以签出更新的minimal example以获得有效的解决方案 受Alexey Soshin的方法启发。

我尝试过的

在Kotlin MPP的GitHub上查看我的minimal example,在JVM目标上使用Vert.x Web服务器,在JS目标上使用Kotlin React。

您可以在以下情况下使其正常工作

  • 首先运行Gradle任务browserDevelopentRun我不理解它背后的魔力),然后在浏览器打开并呈现React SPA(单页应用程序)后即可
  • 停止该任务,然后
  • 通过任务run启动Vert.x后端。

此后,无需刷新浏览器中的剩余SPA,您可以通过按按钮确认其可以与后端通信,并且将警报接收到的数据。

问题

粘合这两个目标的可能方法/方法是什么,所以当我运行我的应用程序时:JS目标可以方便地通过JVM后端组装并提供服务?

我认为Gradle应该触发某些 Kotlin浏览器任务,然后以某种方式使它们可用于Vert.x后端。

解决方法

但是,如果您想运行一个任务,则需要服务器任务取决于您的JS编译。在您的build.gradle中添加以下内容:

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
    dependsOn(tasks.getByName<org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack>("jsBrowserProductionWebpack"))
}

现在调用run还将调用WebPack。

接下来,您要提供文件。有不同的方法。一种是使用Gradle将它们复制到Vert.x资源目录。另一个方法是将Vert.x指向WebPack默认将其放置的位置:

route().handler(StaticHandler.create("../../../distributions"))
,

那里发生了很多不同的事情。

首先,您的Vert.x和Webpack都在同一端口上运行。解决此问题的最简单方法是在其他端口上启动Vert.x,例如18080

.listen(18080,"localhost") { result ->

然后将您的index.kt文件更改为使用该端口:

 val result: SomeData = get("http://localhost:18080/data")

因为我们现在在不同的端口上运行,所以我们还需要指定CORS处理程序:

       router.apply {
                    route().handler(CorsHandler.create("*"))

最后一个事实是,您不能在同一进程中运行两个永无休止的Gradle任务(好的,可以,但这很复杂)。所以我建议您打开两个终端,然后运行:

./gradlew run

合而为一,

./gradlew jsBrowserDevelopmentRun

在另一个。

完成所有操作后,您应该看到以下内容:enter image description here

现在,这用于开发模式。对于生产模式,您可能不想运行jsBrowserDevelopmentRun,而是使用{{1}从您的Vert.x应用程序将jsBrowserProductionWebpack绑定到run和服务器spa.js上}。但是这个答案已经太长了。