Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlinしか書けなくても⼤丈夫! Compose for Webで もっと⼿軽に Webア...

Avatar for Eriko Suto Eriko Suto
November 01, 2025

Kotlinしか書けなくても⼤丈夫! Compose for Webで もっと⼿軽に Webアプリを作ろう

Avatar for Eriko Suto

Eriko Suto

November 01, 2025
Tweet

Other Decks in Programming

Transcript

  1. Compose for Webとは? Compose Multiplatformをブラウザで動作可能にし、 UI実装をWebで再利用できるようにする仕組み https://www.jetbrains.com/ja-jp/compose-multiplatform/ Compose Multiplatform •

    Androidアプリ開発で利用する宣言的UIのフレーム ワークであるJetpack Composeを拡張し、様々なプ ラットフォームで利用できるようにしたもの • Web以外にもiOS/Android/デスクトップがサポート されている 2
  2. 利用に注意が必要なケース • 非Stableバージョンを許容できない保守的なシナリオ • SEOやページ内検索などHTMLの構造に依存する機能が必要なケース ◦ Compose for WebはUIをHTML要素で構成せず、Skiko(2Dグラフィックエンジ ンSkiaをKotlinで使えるようにしたもの)によってHTML

    Canvasに描画する特性 上、利用できない機能がある • ComposeによるUIの再利用を全く行わないケース ◦ Compose for Webの基本的なユースケースとしては、プラットフォームを跨いだ UIの再利用である https://www.jetbrains.com/help/kotlin-multiplatform-dev/choosing-web-target.html#when-to-choose-kot lin-wasm 5
  3. 目次 • Compose for Webの動作環境 • Compose for Webのはじめ方 •

    Androidアプリのこれ、Webだとどうなる? • パフォーマンス最適化 • その他の改善 • 情報のキャッチアップ • まとめ 6
  4. 前提:Compose for Webの動作条件 • Compose for Webは、Kotlin/Wasm コンパイラで Kotlinから WebAssembly

    へ変換することでブラウザで動作 • Kotlin/Wasmで構築したアプリの実⾏には WasmGCサポートするブ ラウザ環境が必要 8
  5. WasmGC対応ブラウザの現状 ※1 iOS18以降のデバイス(iOS18~18.1.1含む)の割合 主要モバイルブラウザの WasmGC対応バージョン インストール可能なOS 各OSの利⽤率 Chrome 119以降 Android7

    Nougat以降 98.6%(2025年4⽉時点)※2 Safari 18.2以降 iOS18.2以降 約82%未満 ※1 (2025年6⽉4⽇時点)※3 9 ※2 JetBrains s.r.o.「Android Platform/API Version Distribution」.AndroidStudio内Minimum SDK選択時の 「Help me choose」のリンクより https://kotlinlang.org/docs/wasm-configuration.html#chromium-based ※3 Apple Inc.「App Store」.https://developer.apple.com/support/app-store/
  6. プロジェクト作成 AndroidStudioの場合、主に3ステップで作成可能 1. Kotlin Multiplatformプラグインをインストール 2. New ProjectでKotlin Multiplatformテンプレートを選択 3.

    Web>Share UIを選択して作成 https://kotlinlang.org/docs/wasm-get-started.html?_cl=MTsxOzE7VnJQR0p3MTB5a0s5T0JJT2hBV0FYd3BISmN zOEE2ekh3dmM1eDRucDQ1NnJhNFkwM3NWV29RUHF2bkNkRUVoZjs= 13
  7. webMainの中⾝ webMain ├── kotlin │ ├── main.kt │ └── ・・・

    └── resources ├── index.html └── styles.css 17 共通のCompose実装を呼び出すエントリポイント
  8. 色々あるけどもしAndroidならこうするかも では、Webだとどうなる? 1. 開発したアプリをデバッグしたい →printlnやLog.dで出力してlogcatで確認 2. クイズをリアルタイムに購読したり、選択した回答を送信をしたい →Apolloライブラリを利用したGraphQL通信 3. デバッグの合間やクイズ終了後などバックグラウンドでの不要な購読を防ぎたい

    →Jetpack Lifecycleでの購読管理 4. クイズを選択中に誤ってタスクキルしてしまった場合にケアしたい →Jetpack DataStoreやSharedPreferencesに保存したデータを復元 5. QRコードからユーザ固有のパラメータを取得したい →Android アプリリンクを使いIntent経由でデータ取得 28
  9. 実装例の比較 29 項番 項目 Android Compose for Web(Kotlin/Wasm) 1 デバッグ

    ログ出力: printlnやLog.d ログ確認: Logcat デバッガー: AndroidStudioでブレークポイント 設定 ログ出力: printlnやKermitなどのサードパーティ製ライ ブラリ ログ確認: DevTools デバッガー: Devtoolsからブレイクポイント設定 2 GraphQL通信 Apollo Kotlin Apollo Kotlin v5 3 購読のライフサイクル管理 Jetpack Lifecycle Jetpack Lifecycle 4 データの永続化 Jetpack DataStore SharedPreferences Web Storage API 5 URLからのパラメータ取得 Intent Window Interface
  10. 実装例の比較 30 項番 項目 Android Compose for Web(Kotlin/Wasm) 1 デバッグ

    ログ出力: printlnやLog.d ログ確認: Logcat デバッガー: AndroidStudioでブレークポイント 設定 ログ出力: printlnやKermitなどのサードパーティ製ライ ブラリ ログ確認: DevTools デバッガー: Devtoolsからブレイクポイント設定 2 GraphQL通信 Apollo Kotlin Apollo Kotlin v5 3 購読のライフサイクル管理 Jetpack Lifecycle Jetpack Lifecycle 4 データの永続化 Jetpack DataStore SharedPreferences Web Storage API 5 URLからのパラメータ取得 Intent Window Interface
  11. 2.GraphQL通信 • 今回はGraphQLのクライアントライブラリであるApollo Kotlinを利⽤ • commonMainに依存関係を追加し、Android同様の実装を行う ことでMutation(更新)とQuery(取得)は問題なく動作し た • Subscription(購読)は5⽉時点で利⽤したApollo

    Kotlin v3で は動作しなかったが、Apollo Kotlin v5(Preview)では wasmJsターゲットもサポート済み 34 https://github.com/apollographql/apollo-kotlin/pull/6637 https://github.com/apollographql/apollo-kotlin/releases
  12. 補足:参考になるリポジトリ • compose-material-3-gallery ◦ JetBrainsのterrakokさんが作 成したMaterial 3コンポーネン トのショーケース ◦ Android/iOS/Desktop/Browse

    rをサポートしており、ほとんど のコンポーネントがWeb版でも そのまま動作することを確認で きる (タブレットではNavigation railを表示するなどAdaptive対 応もされていてすごい) 44
  13. おすすめのツール • kotlinlangのSlack ◦ #compose-web ◦ #webassembly • Klibs.io ◦

    KMP対応のライブラリ検索に 便利 ◦ Wasmに対応しているものの みをフィルタできる 63
  14. まとめ • Compose for Webを使い、実際にWebアプリを作成できた ◦ UI実装はもちろん、基本的な実装がしやすいように標準ライブラリでサポートさ れている ◦ サポートされていない実装もサードパーティライブラリで補うことができた

    ◦ 初回表示の速度に課題があったが、Web特有の最適化を少し行うことで改善でき た • Compose for Webはすべてのブラウザへのサポートを提供している ◦ WasmGCサポートブラウザの普及 ◦ Beta版でのJSフォールバックのサポート 65
  15. まとめ • Compose for Webを使い、実際にWebアプリを作成できた ◦ UI実装はもちろん、基本的な実装がしやすいように標準ライブラリでサポートさ れている ◦ サポートされていない実装もサードパーティライブラリで補うことができた

    ◦ 初回表示の速度に課題があったが、Web特有の最適化を少し行うことで改善でき た • Compose for Webはすべてのブラウザへのサポートを提供している ◦ WasmGCサポートブラウザの普及 ◦ Beta版でのJSフォールバックのサポート 66 KotlinエンジニアがWebアプリを作る時の選択肢の一つとしていかがでしょうか?