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: 페이지가 새로고침 되면서 넘어가게 됩니다
ImageNEXTjs에서는 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를 만들어 줄 수 있다.
로그인 모달같은 경우 공통적으로 쓰이기 때문에 정리한다.