67dcf97edc
Next.js 16 ships Turbopack as the default bundler, but
@ducanh2912/next-pwa is webpack-only — the previous PWA setup
required `--webpack` on dev/build/"dev:proxy" scripts, accepting
a perf regression in exchange for working PWA install.
@serwist/turbopack (paired with the official 'serwist' package
and 'esbuild') is the Turbopack-native successor: it works with
the default bundler, no opt-out flag, and gives us a real TS
service worker source file we can read and edit.
What this commit does:
1. Swap deps in package.json:
- Remove @ducanh2912/next-pwa
- Add @serwist/turbopack, serwist, esbuild (all devDeps)
- Drop --webpack flag from dev / dev:proxy / build scripts
(Turbopack is restored as the bundler)
2. next.config.ts:
- Replace withPWAInit wrapping with withSerwist named import
- Update comment block to describe new architecture
3. New src/app/sw.ts: Serwist service worker source.
skipWaiting + clientsClaim + navigationPreload + defaultCache.
This file is compiled to a real SW at build time by Serwist.
4. New src/app/serwist/[[...slug]]/route.ts: catch-all Route
Handler that serves the compiled SW at /serwist/sw.js plus
Serwist's chunked runtime assets. Catch-all is required
because Serwist serves multiple files under /serwist/.
5. src/app/layout.tsx: replace <SwRegister /> with
<SerwistProvider swUrl="/serwist/sw.js"> from
@serwist/turbopack/react. The provider handles registration
+ lifecycle internally.
6. Delete src/app/_components/core/sw-register.tsx: replaced
by SerwistProvider.
7. .gitignore: add public/sw.js and public/workbox-*.js
(defensive — these are build artifacts that change hash
every build and shouldn't be committed).
8. Untrack public/workbox-3c9d0171.js: stale workbox runtime
from the previous next-pwa build, hash is build-specific
so it can never be regenerated correctly.
Not modified (intentionally):
- src/utils/pwa.ts: pure beforeinstallprompt browser-API wrapper,
library-agnostic, stays as-is.
- pwa-install-overlay / pwa-install-dialog: install UI flow
unchanged.
- public/manifest.json: still works; layout's metadata.manifest
points at it.
Verification:
- pnpm install resolved cleanly (added 24 pkgs, removed 209)
- npx tsc --noEmit passes (EXIT=0)
- Serwist provides named exports, not default — withSerwist and
createSerwistRoute are both named imports
31 lines
1.5 KiB
TypeScript
31 lines
1.5 KiB
TypeScript
import type { NextConfig } from "next";
|
||
import { withSerwist } from "@serwist/turbopack";
|
||
|
||
/**
|
||
* Next.js 16 临时绕过 `/_global-error` prerender 的 workStore bug
|
||
* 标记根 layout 不参与静态预渲染(global-error 会在请求时渲染)
|
||
* https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config
|
||
*
|
||
* 默认部署模型:`.next/` + `public/` + `next start`(或 Vercel 零配置)
|
||
* - `pnpm build` 产出 .next/(含 build manifest / chunks / 路由表 / 静态预渲染)
|
||
* - 脚本侧:scripts/deploy/_deploy_lib.sh 同步 .next/ + public/
|
||
* - 服务器启动:`cd <path> && next start -H 0.0.0.0 -p 3000`
|
||
* 或用 PM2:`pm2 start "next start" --name cozsweet`
|
||
*
|
||
* PWA 集成:`@serwist/turbopack` 在 build 阶段用 esbuild 编译 `src/app/sw.ts` 源文件。
|
||
* - Turbopack 原生支持 —— 不再需要 `--webpack` flag
|
||
* - SW 通过 Serwist Route Handler(src/app/serwist/[[...slug]]/route.ts)在 `/serwist/sw.js` 服务
|
||
* - 客户端注册走 `<SerwistProvider swUrl="/serwist/sw.js">`(替代旧的 <SwRegister />)
|
||
*
|
||
* 历史:
|
||
* - 之前用 @ducanh2912/next-pwa(webpack-only),被迫用 `--webpack` 退 Turbopack
|
||
* - 切到 @serwist/turbopack 后拿回 Turbopack 的 dev/build 性能
|
||
*/
|
||
const nextConfig: NextConfig = {
|
||
experimental: {
|
||
// 关闭静态优化以规避 16.2.7 global-error prerender bug
|
||
staticGenerationRetryCount: 0,
|
||
},
|
||
};
|
||
|
||
export default withSerwist(nextConfig); |