如何解决如何使用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
在另一个。
现在,这用于开发模式。对于生产模式,您可能不想运行jsBrowserDevelopmentRun
,而是使用{{1}从您的Vert.x应用程序将jsBrowserProductionWebpack
绑定到run
和服务器spa.js
上}。但是这个答案已经太长了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。