VSCode에서 NEXT.js를 설치하는 명령어입니다
npx create-next-app@latest
src/
directory -> ../../ -> @ "절대 경로"../../app/layout
⇒ @/app/layout
으로 변경이 가능아래의 명령어로 실행이 가능합니다
next dev
//or
npm run dev
public
: 누구나 접근할 수 있는 이미지들을 넣는 곳입니다
app
: app
은 원래 src
밖깥에 두는 것이 원칙입니다
src
: 타입스크립트나 자바스크립트 타입의 코드들이 들어가게 됩니다
app
을 src
안쪽에 위치?src
안쪽 app
폴더에 위치시킵니다src
바깥에 둘 것ex) baseURL/i/flow/signup
ex) baseURL/compose/tweet ...
다양한 users의 닉네임, 게시글 id 같은 것들은
계속 바뀌기 때문에 동적으로 바뀌도록 폴더 구조를 세팅해야 합니다!
Dynamic Routing
: 중괄호[] 폴더로 동적 라우팅 구현이 가능! ([username], [id] 등)ex) baseURL/elonmusk/stauts/id => elonmusk
미리 만들어 놓은 pages가 아닌 경우 not-found
에서 처리하게 됩니다
RootLayout -> HomeLayout -> HomePage
ex) app/(afterLogin)/home
의 경우 브라우저 URL에는 /home
으로 보이게 됩니다
template -> 페이지를 클릭하고 넘나 들 때, 매 번 새롭게 마운트시켜야 할 때 사용합니다
layout -> 고정된 부분(랜더링이 일어나지 않음)
사용자가 템플릿을 공유하는 경로 사이를 탐색할 때
구성 요소의 새 인스턴스가 마운트되고
DOM 요소가 다시 생성되며 상태가 유지되지 않고 다시 동기화됩니다
🚨 템플릿과 레이아웃은 같이 사용되지 않음!
보통, 그룹화의 기준은 Layout
으로 삼습니다
a
: 페이지가 새로고침 되면서 넘어가게 됩니다
Image
NEXTjs에서는 img
가 아닌 Image
를 사용합니다
import 한 이미지 Next에서 자동으로 최적화가 됩니다
redirect
다른 경로로 유저를 redirect
시킬 수 있습니다
// Navigate to the new path page
redirect('/new_path');
기본적으로 use server
를 사용한 서버 액션에서는 type은 push
가 기본 값입니다
브라우저 기록 스택에 리다이렉트 되는 URL이 추가되고,
그 외의 경우, replace
타입이 기본 값이므로 브라우저 기록 스택의 현재 URL을 대체합니다.
dvw
, dvh
쓰는 이유는 무엇일까요?
width: 100dvw;
height: 100dvh;
병렬 라우팅을 사용하면 동일한 레이아웃에서
하나 이상의 페이지를 동시에 또는 조건부로 렌더링할 수 있습니다
병렬 라우팅을 사용하면 경로가 독립적으로 스트리밍 될 때, 각 경로에 대해 독립적인 오류 및 로드 상태를 정의할 수 있습니다.
기존 모달과는 다르게 패러렐 라우트는 동시에 띄워진 페이지의 주소가 각각 다릅니다.
(기존 모달은 주소 변경이 일어나지 않음)
패러렐 라우트는 명명된 슬롯을 사용하여 생성됩니다
@folder
생성된 슬롯은 경로 세그먼트가 아니기 때문에 URL 구조에 영향을 주지 않습니다
(children prop은 폴더에 매핑할 필요가 없는 암시적 슬롯)
app/page.tsx
와 app/@children/page.tsx
는 동일합니다
ex) app/page.tsx
와 app/(beforeLogin)/@modal/page.tsx
는 병렬로 렌더링이 되지않음
병렬로 렌더링 하기 위해서는 슬롯과 다른 슬롯(혹은 페이지)가 "같은 계층 구조"를 가져야 합니다.
useState
는 클라이언트 컴포넌트에서만 동작.
그러나 서버 컴포넌트에서 사용되고 있다.
기본적으로 page.tsx
, layout.tsx
는 Next 서버에서 동작하고 있는 서버 컴포넌트입니다.
서버 컴포넌트는 컴포넌트 앞에 async
키워드를 붙여 비동기 컴포넌트로 만들 수도 있습니다!
//hooks 사용을 위해 컴포넌트 코드의 최상단에 넣어주기
'use client';
경로에 따라 @modal을 처리중 기본페이지가 없는 경우
default.tsx 가 없으면 not-found 404페이지가 뜨게 됩니다
슬롯
: 슬롯은 부모 컴포넌트에서 자식 컴포넌트로 컨텐츠를 전달하는 메커니즘을 제공합니다
(이를 통해 부모 컴포넌트에서 자식 컴포넌트에게 전달되는 컨텐츠를 동적으로 삽입할 수 있다)
서로 주소가 다른데 같이 뜰 수 있게 하는 것
app/page.tsx
위에 @modal/i/flow/login/page.tsx
을 띄우기!
@modal/i/flow/login 구조를 @modal/(.)i/flow/login 으로 변경
인터셉팅에 사용되는 ".." 은 주소를 기반으로 작성하게 됩니다
패러렐 라우트의 슬롯(@)는 주소에 영향을 미치지 않습니다
그러므로 (beforeLogin)/i/flow 주소를 (beforeLogin)/@modal/i/flow가 가리키려면
"(..)i" 가 아닌 "(.)i" 로 생성해주어야 합니다
// Link태그에 따라 이동할 때 가로채기가 일어남
// (beforeLogin)/@modal/i/flow/login/page.tsx가 화면에 그려지게 된다.
<Link href="/i/flow/login" className={styles.login}>
로그인
</Link>
Link
태그에 따른 이동이 아닐 경우에는 이 부분의 /i/flow/login/page.tsx
가 실행되게 됩니다
ex) 새로고침 했을 시..., 브라우저로 직접 주소를 쳐서 접근했을 경우
export default function Layout({ children, modal }: Props) {
return (
<div className={styles.container}>
{children}
{modal}
</div>
);
}
// 주소가 localhost:3000일 때는 children->page.tsx, modal->@modal/default.tsx
// 주소가 localhost:3000/i/flow/login 때는 children->i/flow/login/page.tsx, modal->@modal/i/flow/login/page.tsx가 실행
아래의 폴더 구조에 따라 가로채기가 일어납니다
✻ 클라이언트에서 라우팅 할 때만 인터셉트 라우팅이 적용됩니다
공통되는 컴포넌트의 부모 폴더에 _
를 사용하여 Private Folder
를 만들어 줄 수 있다.
로그인 모달같은 경우 공통적으로 쓰이기 때문에 정리한다.