NextJS 서버 컴포넌트에서 url, pathname 접근하기

taeyooooon·2023년 12월 2일
5
post-thumbnail

NextJS 14.0.0 버전 기준으로 작성된 글입니다.

1. usePathname

클라이언트 컴포넌트에서는 usePathname 으로 pathname에 간편히 접근가능하지만
usePathname 은 클라이언트 컴포넌트에서만 사용이 가능합니다.

2. middleware

서버컴포넌트에서 pathname에 접근하기 위해서 middleware 에서 추가적인 작업이 필요했습니다.

Nextjs middleware 공식문서 - https://nextjs.org/docs/app/building-your-application/routing/middleware

app 폴더와 같은 계층에 middleware.ts 파일을 생성하고 아래와 같이 작성하고

// middleware.ts
import { NextRequest, NextResponse } from 'next/server'

export function middleware(request: NextRequest) {
  const requestHeaders = new Headers(request.headers);
  requestHeaders.set('x-pathname', request.nextUrl.pathname);

  return NextResponse.next({
    request: {
      headers: requestHeaders,
    }
  });
}

사용하고자 하는 서버 컴포넌트에서 아래와같이 x-pathnameget해서 사용하면 된다

// /app/layout.tsx
import { headers } from 'next/headers';

export default function RootLayout() {
  const headersList = headers();
  const headerPathname = headersList.get('x-pathname') || "";
}

만약 pathname 이 아닌 url에 접근하고 싶으면 request.urlrequestHeaders에 set 해주면 된다

참고

https://github.com/vercel/next.js/issues/43704

profile
응애🐣 프론트엔드

2개의 댓글

comment-user-thumbnail
2024년 6월 24일

감사합니당

답글 달기
comment-user-thumbnail
2024년 9월 1일

글 잘읽었습니다. 궁금한 점이 있습니다. 해당 방법으로 Header 혹은 NavBar를 구현하고자 할때, 서버 컴포넌트는 재렌더링 되지 않는다는 점에서, path를 가져오지 못해서 올바르지 못한 기능을 구현하게 된다고 생각하는데 어떻게 생각하시나요?

답글 달기

관련 채용 정보