Как организовать фронтенд и бэкэнд для Kotlin SPA с помощью Webpack - PullRequest
0 голосов
/ 09 мая 2018

Я разрабатываю СПА с Kotlin (Ktor) на бэкэнде. Структура проекта сейчас:

.
├── frontend/                <-- SPA frontend source project
│   ├── dist/                <-- current webpack dist
│   ├── node_modules/        <-- not to be included in the jar
│   ├── src/                 <-- to be bundled by webpack
│   │   └── index.js
│   ├── index.html           <-- to be served as static by backend
│   ├── package.json         <-- not to be included in the jar
│   └── webpack.config.json  <-- not to be included in the jar
│
├── src/                     <-- SPA backend source
|   └── main/
|       ├── kotlin/
|       |   └── Main.kt      <-- backend entry point
|       └── resources/       <-- framework-specific configuration
│
├── build.gradle
└── settings.gradle

Интерфейс успешно компилируется с cd frontend && npm run build, сохраняя полученный пакет в frontend/dist.

Настройка маршрутизации Ktor:

fun Application.main() {
    install(DefaultHeaders)
    install(CallLogging)

    routing {
        static("/") {
            default("frontend/index.html") // to be replaced with index file
                                           // from packaged frontend
        }
        // ... other dynamic routes for REST
    }
}

build.gradle довольно стандартен:

buildscript {
    ext.kotlin_version = '1.2.41'
    ext.ktor_version = '0.9.2'
    ext.koin_ktor_version = '0.9.2'
    ext.ktor_gson_version = '0.9.2'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

group 'org.root_talis'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'application'

mainClassName = 'MainKt'

kotlin { experimental { coroutines "enable" } }

repositories {
    mavenCentral()
    jcenter()
    maven { url "https://dl.bintray.com/kotlin/ktor" }
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    compile "io.ktor:ktor-server-netty:$ktor_version"
    compile "io.ktor:ktor-gson:$ktor_gson_version"
    compile "ch.qos.logback:logback-classic:1.2.1"
    compile "org.koin:koin-ktor:$koin_ktor_version"
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

Как заставить Gradle скомпилировать проект внешнего интерфейса через npm run build и упаковать dist в получившийся JAR-файл для обслуживания бэкэндом?

Есть ли рекомендации по организации таких проектов?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Если вам нужно выполнить некоторые команды npm, вы можете установить Node на машину, на которой вы работаете, объявить задачу Exec и сделать задачу build зависимой от нее.

val npmBuilder by tasks.creating(Exec::class){
    // some stuff
}

tasks.getByName("build").dependsOn(npmBuilder)

Посмотрите документацию по задаче Exec здесь .

В противном случае вы можете применить этот плагин Node для Gradle , позволяющий вам не зависеть от настроек машины.

Кроме того, я бы рекомендовал обрабатывать маршруты вашего SPA не вручную, а с использованием этой функции Ktor

0 голосов
/ 12 июня 2018
...