0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Compose Multipatformで作ったWebアプリをPWA化する

Posted at

TL;DR

gradle/libs.versions.toml
[versions]
# ...

+ yuyuyuyuyu-composePwa = "0.1.0"

[libraries]
# ...

[plugins]
# ...

+ yuyuyuyuyu-composePwa = { id = "dev.yuyuyuyuyu.composepwa", version.ref = "yuyuyuyuyu-composePwa" }

composeApp/build.gradle.kts
// ...

plugins {
//  ...

+   alias(libs.plugins.yuyuyuyuyu.composePwa)
}

を追記して Gradle project sync して

./gradlew :composeApp:buildPWA

を実行すればOK

composeApp/build/dist/wasmJs/productionExecutable/ にPWAとしてビルドされたWebアプリが出力されます

./gradlew :composeApp:wasmJsBrowserDistribution./gradlew :composeApp:buildPWA で置き換えるイメージです)

はじめに

AndroidエンジニアだってWebアプリ作りたくなる時くらいありますよね?!?!?!

でもやっぱりスマホにインストールしてオフラインで動かしたいですよね?!?!?!?

普段使っている技術スタックでWebアプリを作ってそれをスマホにインストールできたらうれしいですよね?!?!?!

でもCompose Multiplatformで作ったWebアプリをPWA化するライブラリ(プラグイン)が無い!!!!!!😭

ということで作りました

ComposePWAの導入方法

gradle/libs.versions.tomlcomposeApp/build.gradle.kts でそれぞれ下記のように追記し、 gradle sync すればOKです

gradle/libs.versions.toml
[versions]
# ...

+ yuyuyuyuyu-composePwa = "0.1.0"

[libraries]
# ...

[plugins]
# ...

+ yuyuyuyuyu-composePwa = { id = "dev.yuyuyuyuyu.composepwa", version.ref = "yuyuyuyuyu-composePwa" }
composeApp/build.gradle.kts
// ...

plugins {
    // ...

+   alias(libs.plugins.yuyuyuyuyu.composePwa)
}

// ...

使い方

基本的には

./gradlew :composeApp:buildPWA

を実行するだけでOKです

./gradlew :composeApp:buildPWA を実行することで、Compose Multiplatformで作ったWebアプリがPWAとしてビルドされ、 composeApp/build/dist/wasmJs/productionExecutable/ に出力されます

出力されるPWAをカスタマイズしたい場合

アプリアイコンを独自のものにする場合

アプリアイコンを独自のものにしたい、という場合は ngx-pwa-icons が便利です

アプリアイコンのPNGファイルがあるフォルダで

npx ngx-pwa-icons

を実行し、出来上がった icons/composeApp/src/wasmJsMain/resources/icons/ を置き換えてください。

ngx-pwa-icons の実行にはNode.jsが必要になります

それ以上のカスタマイズがしたい場合

自動生成された composeApp/src/wasmJsMain/resources/manifest.jsoncomposeApp/workbox-config.js をいじってください

内部的にはnpmモジュールの workbox-cli を使っています

Workboxのドキュメント

workbox-cliを呼び出している箇所

ComposePWAはなにをするのか

buildPWA というGradleタスクを提供します

buildPWA は呼び出されると

  1. ビルドキャッシュの削除(前回のビルドで生成されたサービスワーカーを削除するため)
  2. 依存しているnpmモジュールの同期(念のため)
  3. 必要なHTMLタグの追記(既に存在していたらスキップ)
  4. 必要なファイルの生成(既に存在していたらスキップ)
  5. Webアプリとしてビルド
  6. サービスワーカーの生成

を行い、Compose MultiplatformのソースコードをPWAとしてビルドします

composeApp/src/wasmJsMain/resources/index.html にどのような変更を加えるのか

<!doctype html>
<html lang="en">
  <head>
    <!-- ... -->

+   <script type="application/javascript" src="registerServiceWorker.js"></script>
+   <link rel="manifest" href="manifest.json">

  </head>
  <!-- ... -->
<html>

自動生成されるファイルたち

  • composeApp/workbox-config.js
  • composeApp/src/wasmJsMain/resources/icons/icon-*.png
  • composeApp/src/wasmJsMain/resources/manifest.json
  • composeApp/src/wasmJsMain/resources/registerServiceWorker.js

Workboxが分かる人向け

デフォルトのキャッシュ戦略

デフォルトのキャッシュ戦略は Stale-while-revalidate にしてあります

基本的にキャッシュから読み込みつつ更新があるかチェック、更新があったらバックグラウンドでダウンロードしておいて次回起動時に差し替える、というやつです

おわりに

Compose Multiplatform製のWebアプリをPWA化するプラグインを作ったと言ってはいますが、やっていることはほとんど gradle-node-plugin を使って workbox-cli を呼び出しているだけ、なのでこれらを作ってくださった偉大なる先人たちに圧倒的感謝です!!!!!!

おまけ

GitHub Pagesでホストするには

ComposePWAを使ってPWA化したWebアプリをGitHub Pagesでホストしているので、参考までにそこで使っているGitHub Actionsのリンクを貼っておきます

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?