Closed12

Remix PWA を試したい

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

vite.config.ts

vite.config.ts
import { vitePlugin as remix } from "@remix-run/dev";
import { defineConfig } from "vite";
import tsconfigPaths from "vite-tsconfig-paths";
import { remixPWA } from "@remix-pwa/dev";

declare module "@remix-run/node" {
  interface Future {
    v3_singleFetch: true;
  }
}

export default defineConfig({
  plugins: [
    remix({
      future: {
        v3_fetcherPersist: true,
        v3_relativeSplatPath: true,
        v3_throwAbortReason: true,
        v3_singleFetch: true,
        v3_lazyRouteDiscovery: true,
      },
    }),
    tsconfigPaths(),
    remixPWA(),
  ],
});
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

entry.worker.ts

app/entry.worker.ts
/// <reference lib="WebWorker" />

import { WorkerDataFunctionArgs } from "@remix-pwa/sw";

export {};

declare let self: ServiceWorkerGlobalScope;

self.addEventListener("install", (event) => {
  console.log("Service worker installed");

  event.waitUntil(self.skipWaiting());
});

self.addEventListener("activate", (event) => {
  console.log("Service worker activated");

  event.waitUntil(self.clients.claim());
});

export const defaultFetchHandler = async ({
  request,
}: WorkerDataFunctionArgs) => {
  const response = await fetch(request);
  console.log(request.url);
  return response;
};

これで動くようになった、素晴らしい。

https://remix-pwa.run/docs/latest/default-fetch-handler

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

entry.worker.ts

コマンド
const app = new Hono().basePath("/sw");

app.get("/", (c) => c.text("Hello World"));

export const defaultFetchHandler = async ({
  request,
}: WorkerDataFunctionArgs) => {
  const res = await app.fetch(request);
  if (res.status === 404) {
    return await fetch(request);
  }
  return res;
};

これで http://localhost:5173/sw にアクセスしたら Hello World と表示されるようになった。

https://github.com/honojs/hono/blob/main/src/adapter/service-worker/handler.ts

Hono の Service Worker 用の handle 関数のコードを参考にした。

このスクラップは2025/01/20にクローズされました