kotlin-multiplatform-example
kotlin-multiplatform-example copied to clipboard
A barebones Kotlin multiplatform project with JVM and JS targets
Kotlin multiplatform project example
This repository contains a barebones Kotlin multiplatform Gradle project with 3 modules: common (compiled to both JVM
bytecode and JS), client (compiled to JS) and server (complied to JVM). Assumes a simple architecture, where the
server module is a backend JVM application, client is the usual frontend web application, and the common module
allows to share data structures, validation logic, and so on. It also comes with a working tests setup on both target
platforms.
Feel free to use it for personal and commercial projects.
Note that I don't feel comfortable with frontend tools and the client module might have some issues. If you notice
any problems or invalid configurations, please create a GitHub issue.
What to do after cloning
- Change group and version in root
build.gradle. - Update Gradle wrapper version in
gradle-wrapper.properties. - Update dependencies' versions in
gradle.propertiesandpackage.json. - Rename packages (preferably with IntelliJ
Refactor > Rename), replacecom.github.czyzbythroughout the project. - Include your project dependencies in subprojects
build.gradlefiles. - Write actual code. Or not.
Useful Gradle tasks
server:test: runs server tests and common tests compiled with serveractualimplementations via JUnit runner.client:test: runs client tests and common tests compiled with clientactualimplementations via Karma/Mocha.test,check: runs tests (or tests with all checks) in every subproject.server:run: runsmainfunction of the server project.client:run: runs Webpack in watch mode atlocalhost:8080which automatically reloads when you recompile KotlinJS sources or add copy new static resouces. (Press F12 and read the console to see if example code works.)client:watch -t: recompiles client sources and copies resources on everysrc/mainfile modification. Make sure to use-tflag to run in continuous mode. Along withclient:run, these two tasks provide hot reload after every file change.assemble: builds a standalone runnable jar atserver/build/libsand bundles JS sources toclient/build/dist.client:bundle: invokes Webpack (with deployment configuration) to pack and minifies JS sources and exports them toclient/build/dist. Invoked byassemble.client:copyStaticResources: copies files fromclient/src/main/resourcestoclient/build/dist. Copied files will be served by the dev server (client:run). Automatically invoked bybundleandclient:run.
Typical workflow
During development, run ./gradlew client:run and ./gradlew -t client:watch to deploy the client application locally
on localhost:8080 with hot reload on each file change. Use your server framework of choice to run the server
application. If anything unexpected happens, run ./gradlew clean and repeat.
Caveat: Ctrl+C will not kill Webpack (client:run). This is a known issue.
You can avoid it by turning off Gradle deamons or installing Yarn locally and using yarn run start instead of the
Gradle task.
To deploy, run ./gradlew assemble. server/build/libs will contain a standalone runnable jar, and client/build/dist
will contain your resources, Webpack-generated HTML file and bundled JS files.
Extras
See this commit in kotlinx-serialization branch branch for kotlinx-serialization integration example.
Client project contains examples of asynchronous tests.