Как подключить мультиплатформенный модуль к js-модулю с gradle? - PullRequest
0 голосов
/ 03 ноября 2019

У меня проблема с подключением модуля. У меня есть модуль веб-приложения (js) и mpp-библиотека (мультиплатформенная) с модулем домена (мультиплатформенная). Пример, браузер выбрасывает ошибка , когда я использую некоторый класс из домена в модуле веб-приложения

структура проекта:

web-app
│   build.gradle.kts
│
├───package.json.d
│       project.info.json
│
├───public
│       index.html
│
├───src
│   └───main
│       ├───kotlin
│       │   └───com.some.webapp
│       │           JsApp.kt
│       │
│       └───resources
└───webpack.config.d
        babel.js
        css.js
        html.js
        minify.js
        sourcemap.js



mpp-library
│   build.gradle.kts
│
└───domain
    │   build.gradle.kts
    │   
    │
    └───src
        │   openapi.yaml
        │
        ├───androidMain
        │   │   AndroidManifest.xml
        │   │
        │   └───kotlin
        │           SomeUser.kt
        │
        ├───commonMain
        │   └───kotlin
        │       └───com
        │           └───some
        │               └───domain
        │                   │   Factory.kt
        │                   │
        │                   ├───di
        │                   ├───entity
        │                   │       Account.kt
        │                   │       User.kt
        │                   │
        │                   ├───model
        │                   └───repository
        │                           UserRepository.kt
        │
        ├───jsMain
        └───jvmMain

build.gradle.kts (web-app)

plugins {
    id("kotlin2js")
    kotlin("frontend")
}

kotlinFrontend {
    downloadNodeJsVersion = "latest"
    sourceMaps = false

    npm {

        replaceVersion("kotlinx-html-js", Versions.kotlin)
        replaceVersion("kotlinx-html-shared", Versions.kotlin)
        replaceVersion("kotlin-js-library", Versions.kotlin)

        dependency("text-encoding")

        devDependency("webpack", "4")
        devDependency("babel-loader", "8")
        devDependency("@babel/core")
        devDependency("@babel/preset-env")
        devDependency("css-loader")
        devDependency("karma")
        devDependency("style-loader")
        devDependency("source-map-loader")
        devDependency("html-loader")
    }

    sourceMaps = true

    webpack {
        publicPath = "/"
        bundleName = "web-app"
        contentPath = file("/public")
        port = 8085
        proxyUrl = "http://localhost:8080/"
        sourceMapEnabled = true
        stats = "errors-only"
    }

}

dependencies {
    implementation(Deps.Libs.Js.kotlinStdLib.name)
    implementation(Deps.Libs.Js.kotlinHTML.name)

    implementation(project(":mpp-library"))
}

tasks {
    compileKotlin2Js {
        kotlinOptions {

            moduleKind = "commonjs"
            main = "call"
        }
    }
}

fun org.jetbrains.kotlin.gradle.frontend.KotlinFrontendExtension.`webpack`(
    configure: org.jetbrains.kotlin.gradle.frontend.webpack.WebPackExtension.() -> Unit
) {
    bundle("webpack", delegateClosureOf(configure))
}

build.gradle.kts (: mpp-library: domain)

import util.MultiplatformPlugin
import util.mppLibrary


plugins {
    id("com.android.library")
    kotlin("multiplatform")
    id("kotlinx-serialization")
}

apply<MultiplatformPlugin>()

android {
    compileSdkVersion(Versions.Android.compileSdk)

    defaultConfig {
        minSdkVersion(Versions.Android.minSdk)
        targetSdkVersion(Versions.Android.targetSdk)
    }
}

dependencies {
    mppLibrary(Deps.Libs.MultiPlatform.kotlinStdLib)
}

JsApp.kt

package com.some.webapp

import com.some.domain.entity.Account
import kotlinx.html.dom.append
import kotlinx.html.h1
import kotlinx.html.js.h2
import kotlin.browser.document
import kotlin.browser.window


fun main() {
    window.onload = {

        val account = Account(password = "123")

        document.getElementById("app")?.append {
            h1 { +"Test: ${account.password}" }
            h2 { +"h2" }
        }
    }
}
...