关于 nextjs-16-proxy
为 Next.js 开发者提供迁移指南,将 middleware 用法更新为 Next.js 16 的 `proxy` 约定,并说明如何在路由前处理重写。
主要功能
- 01说明 `middleware.ts` 到 `proxy.ts` 的变更
- 02介绍文件应放置的位置
- 03说明路由前使用 proxy 重写
- 04提供 middleware 迁移命令
适用场景
- 01迁移 Next.js 15 的 middleware 文件
- 02重写与动态路由冲突的路径
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ blink-new/ claude --skill nextjs-16-proxy安装后在 Claude Code 中输入/nextjs-16-proxy确认已加载。
详细介绍
Next.js 16 Proxy 约定
Next.js 16 将 middleware 重命名为 proxy,以更准确地体现其网络边界用途。
与 Middleware 的主要变化
| 旧版(Next.js 15) | 新版(Next.js 16+) |
|---|---|
middleware.ts | proxy.ts |
export function middleware() | export function proxy() |
| 相同位置 | 相同位置 |
文件位置
将 proxy.ts 放在与 app 或 pages 同一层级的位置:
src/
├── proxy.ts ← Correct location
├── app/
│ └── ...
不要放在 app/ 内:
src/
├── app/
│ ├── proxy.ts ← Wrong location
│ └── ...
基本模板
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
export function proxy(request: NextRequest) {
const { pathname } = request.nextUrl;
// Example: rewrite /uploads/* to /api/uploads/*
if (pathname.startsWith("/uploads/")) {
const newUrl = request.nextUrl.clone();
newUrl.pathname = pathname.replace("/uploads/", "/api/uploads/");
return NextResponse.rewrite(newUrl);
}
return NextResponse.next();
}
export const config = {
matcher: ["/uploads/:path*"],
};
常见问题:动态路由捕获路径
当根目录下有类似 [teamSlug] 的动态路由时,它可能会在应用 next.config.ts 中的重写规则之前捕获路径。
问题:
- 请求:
/uploads/image.png - 动态路由
[teamSlug]将其捕获为teamSlug = "uploads" - 导致 404
解决方案:
使用 proxy.ts,而不是 next.config.ts 重写规则。Proxy 会在路由处理之前运行。
迁移命令
npx @next/codemod@canary middleware-to-proxy .
此命令会自动:
- 将
middleware.ts重命名为proxy.ts - 将函数名
middleware更新为proxy
评论
支持 Markdown