PWA対応とモバイルUX改善。 - app/manifest.ts: Nextファイルベースでマニフェスト生成(name/short_name/display:standalone/icons 192+512 any+maskable + svg) - public/icon.svg + 生成PNG(192/512): scripts/generate-icons.mjs で sharp を用いてSVGをラスタライズ - public/sw.js: アプリシェルのプリキャッシュ、ナビゲーションはネットワーク優先(オフラインはキャッシュ/'/'にフォールバック)、静的アセットはキャッシュ優先。API/非GET/クロスオリジンはキャッシュせず、res.ok&&basic でエラー/リダイレクト結果を弾く - components/pwa/ServiceWorkerRegister: 本番のみ /sw.js を登録(開発HMRとの衝突回避) - app/layout.tsx: export const viewport(device-width, cover, themeColor) + metadata.icons/appleWebApp - middleware: sw.js/manifest/icon を認証ガードから除外(ログイン前でも取得可能) - ProjectNav: 横スクロールStrip(折り返さない)、Header: モバイルでダッシュボードテキストリンクを非表示
26 lines
1.1 KiB
TypeScript
26 lines
1.1 KiB
TypeScript
import { NextResponse, type NextRequest } from 'next/server';
|
||
import { SESSION_COOKIE } from '@/lib/auth/constants';
|
||
|
||
/**
|
||
* 認証ミドルウェア(Edge Runtime)。
|
||
* セッションCookieの「存在」のみを確認し、未所持なら保護画面を /login へリダイレクトする。
|
||
* HMAC検証・DB参照はNode.js RuntimeのgetCurrentUserで行う(ここでは行わない)。
|
||
* APIルートは各Route Handlerで401を返すため、本ミドルウェアの対象外とする。
|
||
*/
|
||
export function middleware(request: NextRequest) {
|
||
const token = request.cookies.get(SESSION_COOKIE)?.value;
|
||
if (!token) {
|
||
const loginUrl = new URL('/login', request.url);
|
||
loginUrl.searchParams.set('redirect', request.nextUrl.pathname);
|
||
return NextResponse.redirect(loginUrl);
|
||
}
|
||
return NextResponse.next();
|
||
}
|
||
|
||
export const config = {
|
||
matcher: [
|
||
// /login, /api, _next 静的 assets, favicon, PWA静的リソース(manifest/SW/icon) を除外
|
||
'/((?!login|api|_next/static|_next/image|favicon.ico|sw\\.js|manifest\\.webmanifest|icon\\.svg|icon-192\\.png|icon-512\\.png).*)',
|
||
],
|
||
};
|