admin 2acc005809 feat(pwa): wire up @ducanh2912/next-pwa + register SW in layout
PWA install flow was wired but unusable: pwaUtil.install() calls
deferred.prompt(), but Chrome only fires beforeinstallprompt when a
valid Service Worker is registered + a manifest is linked. The project
had both intent (manifest, usePwaInstall hook) but no live SW —
public/sw.js was a stale workbox build artifact from a previous
attempt with hardcoded chunk URLs that no longer matched any build.

What this commit does:

1. Add @ducanh2912/next-pwa@10.2.9 as devDependency.
2. Wrap nextConfig with withPWA({...}):
   - dest: "public" SW outputs to public/sw.js
   - disable: true skip SW generation in dev (HMR-friendly)
   - register: false don't auto-inject registration
   - workboxOptions.skipWaiting: true + clientsClaim: true — new SW
     takes over immediately
3. Add --webpack flag to dev/build/dev:proxy scripts.
   @ducanh2912/next-pwa is webpack-only; Turbopack (Next 16 default)
   doesn't load webpack plugins. Per user decision to accept the perf
   trade-off in exchange for a working PWA.
4. Delete stale public/sw.js (workbox will regenerate it at build
   time with the correct chunk URLs).
5. Add src/app/_components/core/sw-register.tsx: a no-UI client
   component that registers /sw.js in production. Mounted at the end
   of <body> in layout.tsx. disable: true means dev mode skips
   registration (no /sw.js to fetch anyway).

After this commit + pnpm build, public/sw.js is regenerated with
correct chunk URLs, registered on first prod load, and Chrome fires
beforeinstallprompt — usePwaInstall + pwaUtil.install() then trigger
the native install prompt end-to-end.
2026-06-16 19:36:03 +08:00
2026-06-05 19:09:20 +08:00
2026-06-05 19:09:20 +08:00
2026-06-15 11:37:29 +08:00
2026-06-15 14:23:31 +08:00

This is a Next.js project bootstrapped with create-next-app.

Getting Started

First, run the development server:

npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev

Open http://localhost:3000 with your browser to see the result.

You can start editing the page by modifying app/page.tsx. The page auto-updates as you edit the file.

This project uses next/font to automatically optimize and load Geist, a new font family for Vercel.

Git Hooks

项目使用 .githooks/ 目录存放仓库内的 git hooks.git/hooks/)。clone 后需手动启用

git config core.hooksPath .githooks

启用的 Hook

post-receive

触发场景git push 到本仓库时(在 bare reporeceive.denyCurrentBranch=updateInstead 的非 bare repo 上)。

行为:自动执行 pnpm run build:start,即 next build && next start

注意事项

  • 本仓库的 .githooks/post-receive 自动生效 —— 必须在每个工作副本上跑一次上面的 git config 命令
  • core.hooksPath本地 git config(写入 .git/config),随仓库提交
  • post-receive接收端触发 —— 即 push 目标机器(生产 / 测试服务器)的 hook,不是本地开发机的

Learn More

To learn more about Next.js, take a look at the following resources:

You can check out the Next.js GitHub repository - your feedback and contributions are welcome!

Deploy on Vercel

The easiest way to deploy your Next.js app is to use the Vercel Platform from the creators of Next.js.

Check out our Next.js deployment documentation for more details. modify

S
Description
No description provided
Readme 47 MiB
Languages
TypeScript 90.2%
CSS 6.3%
JavaScript 1.6%
Shell 1.3%
HTML 0.4%
Other 0.1%