import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server';
const isProjectedRoute = createRouteMatcher([
"/studio(.*)",
]);
export default clerkMiddleware(async (auth, req) => {
if(isProjectedRoute(req)) await auth.protect();
});
export const config = {
matcher: [
'/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)',
'/(api|trpc)(.*)',
],
};
-
Catch-All 路由
- Optional Catch-All Segment,指定开头路径但参数可选
app/sign-in/[[...sign-in]]/page.tsx 在当前路径中,匹配 /sign-in 以及任何以 /sign-in/... 开头的路径,且参数是可选
- 路径
/sign-in,捕获参数undefined或[];路径 /sign-in/google,捕获参数['google']
- Clerk可提供多种身份认证,例如google、邮箱以及很多第三方登录,这些登录都涉及到路径变种,例如
/sign-in/google、/sign-in/sso/callback、/sign-in等等,那么用[[...sign-in]]就可以用一个文件捕获所有路径,在其中再判断具体是哪种登录方式从而实现动态渲染或跳转
-
children
children 是一个特殊的 prop,表示组件标签中包裹的子元素
children 由 Next.js 自动传递,是当前访问的页面渲染出来的组件
React.ReactNode 是一个类型,它表示可以被渲染的任何 React 内容,JSX、字符串、数字等
- 在 App Router 中,
layout.tsx通过children渲染具体页面
interface LayoutProps {
children: React.ReactNode;
}
const Layout = ({ children }: LayoutProps) => {
return (
<div className="min-h-screen flex items-center justify-center">
{ children }
</div>
);
}
export default Layout;