From 6a40375e3f69f77813e2f00085625c774506e5af Mon Sep 17 00:00:00 2001 From: StefanMoCoAt Date: Sat, 27 Sep 2025 00:21:56 +0200 Subject: [PATCH] fixing Web-App --- clients/app/build.gradle.kts | 35 +++++++++- .../app/webpack.config.d/webpack.config.js | 65 ++++++++++++++++++- .../shared/commonui/components/AppScaffold.kt | 19 ++++-- gradle.properties | 13 ++-- 4 files changed, 115 insertions(+), 17 deletions(-) diff --git a/clients/app/build.gradle.kts b/clients/app/build.gradle.kts index b06b3d9f..11ae438e 100644 --- a/clients/app/build.gradle.kts +++ b/clients/app/build.gradle.kts @@ -1,6 +1,8 @@ @file:OptIn(ExperimentalKotlinGradlePluginApi::class) import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi +import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig +import org.jetbrains.kotlin.gradle.dsl.JvmTarget /** * Dieses Modul ist der "Host". Es kennt alle Features und die Shared-Module und @@ -31,12 +33,30 @@ kotlin { js(IR) { outputModuleName = "web-app" browser { - commonWebpackConfig { - cssSupport { enabled = true } + webpackTask { + mainOutputFileName = "web-app.js" + output.libraryTarget = "commonjs2" } + + // Development Server konfigurieren + runTask { + mainOutputFileName.set("web-app.js") + } + + // Browser-Tests komplett deaktivieren (Configuration Cache kompatibel) testTask { enabled = false } + + commonWebpackConfig { + cssSupport { enabled = true } + // Webpack-Mode abhängig von Build-Typ + mode = if (project.hasProperty("production")) + KotlinWebpackConfig.Mode.PRODUCTION + else + KotlinWebpackConfig.Mode.DEVELOPMENT + } + } binaries.executable() } @@ -94,6 +114,17 @@ kotlin { } } +tasks.withType { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_21) + freeCompilerArgs.addAll( + "-Xopt-in=kotlin.RequiresOptIn", + "-Xskip-metadata-version-check" // Für bleeding-edge Versionen + ) + } +} + + // Configure duplicate handling strategy for distribution tasks tasks.withType { duplicatesStrategy = DuplicatesStrategy.EXCLUDE diff --git a/clients/app/webpack.config.d/webpack.config.js b/clients/app/webpack.config.d/webpack.config.js index f83e0399..fa94b444 100644 --- a/clients/app/webpack.config.d/webpack.config.js +++ b/clients/app/webpack.config.d/webpack.config.js @@ -1,10 +1,69 @@ const HtmlWebpackPlugin = require('html-webpack-plugin'); const path = require('path'); +// Template-Pfad für deine index.html const templatePath = path.resolve(__dirname, '../../../../clients/app/src/jsMain/resources/index.html'); +// Erweitere die bestehende Kotlin/JS Webpack-Konfiguration config.plugins.push(new HtmlWebpackPlugin({ - template: templatePath, - filename: 'index.html', - inject: 'body', + template: templatePath, + filename: 'index.html', + inject: 'body', + // Optimierung hinzufügen + minify: { + removeComments: true, + collapseWhitespace: true, + removeRedundantAttributes: true, + removeEmptyAttributes: true, + useShortDoctype: true, + removeStyleLinkTypeAttributes: true, + keepClosingSlash: true, + minifyJS: true, + minifyCSS: true, + minifyURLs: true, + } })); + +// Bundle-Analyse für Development +if (process.env.ANALYZE_BUNDLE === 'true') { + const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; + config.plugins.push(new BundleAnalyzerPlugin({ + analyzerMode: 'static', + openAnalyzer: false, + reportFilename: 'bundle-report.html' + })); +} + +// Weitere Optimierungen hinzufügen (erweitert bestehende config) +config.optimization = { + ...config.optimization, // Behalte Kotlin/JS Optimierungen + splitChunks: { + chunks: 'all', + cacheGroups: { + vendor: { + test: /[\\/]node_modules[\\/]/, + name: 'vendor', + chunks: 'all' + } + } + } +}; + +// Development Server Konfiguration erweitern +if (config.devServer) { + config.devServer = { + ...config.devServer, + historyApiFallback: true, + hot: true, + // API Proxy für Backend-Anfragen (Array-Format für moderne Webpack) + proxy: [ + { + context: ['/api'], + target: 'http://localhost:8081', + changeOrigin: true, + secure: false, + pathRewrite: { '^/api': '' } + } + ] + } +} diff --git a/clients/shared/common-ui/src/commonMain/kotlin/at/mocode/clients/shared/commonui/components/AppScaffold.kt b/clients/shared/common-ui/src/commonMain/kotlin/at/mocode/clients/shared/commonui/components/AppScaffold.kt index 0b478d31..435f4440 100644 --- a/clients/shared/common-ui/src/commonMain/kotlin/at/mocode/clients/shared/commonui/components/AppScaffold.kt +++ b/clients/shared/common-ui/src/commonMain/kotlin/at/mocode/clients/shared/commonui/components/AppScaffold.kt @@ -1,9 +1,12 @@ package at.mocode.clients.shared.commonui.components +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -16,9 +19,15 @@ fun AppScaffold( }, content: @Composable (PaddingValues) -> Unit ) { - Scaffold( - topBar = header, - bottomBar = footer, - content = content - ) + Column(modifier = Modifier.fillMaxSize()) { + Scaffold( + topBar = header, + modifier = Modifier.weight(1f) + ) { + paddingValues -> + content(paddingValues) + } + footer() + } + } diff --git a/gradle.properties b/gradle.properties index 17eaa2d1..8c8769e3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,17 +8,16 @@ kotlin.daemon.jvmargs=-Xmx3072M -XX:+UseParallelGC -XX:MaxMetaspaceSize=1024M # Gradle Configuration org.gradle.jvmargs=-Xmx3072M -Dfile.encoding=UTF-8 -Dkotlin.daemon.jvm.options\="-Xmx2048M" -XX:+UseParallelGC -XX:MaxMetaspaceSize=1024M -XX:+HeapDumpOnOutOfMemoryError -Xshare:off -Djava.awt.headless=true -org.gradle.configuration-cache=true -org.gradle.parallel=true -org.gradle.caching=true -# org.gradle.configureondemand=true # Deprecated - removed for Gradle 9.0 compatibility org.gradle.workers.max=8 org.gradle.vfs.watch=true -# Für bessere Performance +# Configuration Cache optimieren - TEMPORÄR DEAKTIVIERT wegen JS-Test Serialisierungsproblemen +org.gradle.configuration-cache=false +org.gradle.configuration-cache.problems=warn -# Browser für Tests konfigurieren - verwende Chrome mit Puppeteer -#kotlin.js.browser.karma.useChromeHeadless=true +# Build Performance verbessern +org.gradle.parallel=true +org.gradle.caching=true # Security and Reproducibility org.gradle.dependency.verification=lenient