레이아웃
레이아웃은 페이지 템플릿과 같은 재사용 가능한 UI 구조를 제공하는 데 사용되는 Astro 컴포넌트입니다.
우리는 일반적으로 머리글, 탐색 모음, 바닥글과 같이 페이지 전체에서 공유되는 공통 UI 요소를 제공하는 Astro 컴포넌트에 대해 “레이아웃”이라는 용어를 사용합니다. 일반적인 Astro 레이아웃 컴포넌트는 다음과 같은 Astro, Markdown, MDX 페이지를 제공합니다.
- 페이지 셸(
<html>
,<head>
,<body>
태그) - 개별 페이지 콘텐츠를 삽입해야 하는 위치를 지정하는
<slot />
.
하지만 레이아웃 컴포넌트에는 특별한 것이 없습니다! 다른 Astro 컴포넌트처럼 props를 전달받고 다른 컴포넌트를 가져와 사용할 수 있습니다. 여기에는 UI 프레임워크 컴포넌트와 클라이언트 측 스크립트가 포함될 수 있습니다. 전체 페이지 셸을 제공할 필요도 없으며 대신 부분 UI 템플릿으로 사용할 수 있습니다.
그러나 레이아웃 컴포넌트에 페이지 셸이 포함되어 있는 경우 <html>
요소는 컴포넌트에 있는 다른 모든 요소의 상위 요소여야 합니다. 모든 <style>
또는 <script>
요소를 <html>
태그로 묶어야 합니다.
레이아웃 컴포넌트는 일반적으로 프로젝트의 src/layouts
디렉터리에 배치되지만 이는 필수 사항은 아닙니다. 프로젝트의 어느 곳에나 배치하도록 선택할 수 있습니다. 심지어 레이아웃 이름 앞에 _
를 붙이면 레이아웃 컴포넌트와 페이지를 같은 위치에 배치할 수도 있습니다.
레이아웃 예시
섹션 제목: 레이아웃 예시Markdown/MDX 레이아웃
섹션 제목: Markdown/MDX 레이아웃페이지 레이아웃은 페이지 형식이 없는 Markdown 및 MDX 페이지에 특히 유용합니다.
Astro는 페이지 레이아웃으로 사용할 .astro
컴포넌트를 지정하기 위해 특별한 layout
프런트매터 속성을 제공합니다.
Markdown 또는 MDX 페이지의 일반적인 레이아웃은 다음과 같습니다.
- Markdown 또는 MDX 페이지의 프런트매터 및 기타 데이터를 사용하기 위한
frontmatter
prop. - 페이지의 Markdown/MDX 콘텐츠가 렌더링되어야 하는 위치를 나타내는 기본
<slot />
.
MarkdownLayoutProps
또는 MDXLayoutProps
도우미를 사용하여 레이아웃의 Props
타입을 설정할 수 있습니다.
Markdown 레이아웃 Props
섹션 제목: Markdown 레이아웃 PropsMarkdown/MDX 레이아웃은 Astro.props
를 통해 다음 정보를 사용할 수 있습니다.
file
- 이 파일의 절대 경로(예:/home/user/projects/.../file.md
).url
- 페이지인 경우 해당 페이지의 URL(예:/en/guides/markdown-content
).frontmatter
- Markdown 또는 MDX 문서의 모든 프런트매터.frontmatter.file
- 최상위file
속성과 동일합니다.frontmatter.url
- 최상위url
속성과 동일합니다.
headings
- 관련 메타데이터가 있는 Markdown 또는 MDX 문서의 제목(h1 -> h6
)들의 목록입니다. 이 목록은 다음 타입을 따릅니다:{ depth: number; slug: string; text: string }[]
- (Markdown만 해당)
rawContent()
- 원시 Markdown 문서를 문자열로 반환하는 함수입니다. - (Markdown만 해당)
compiledContent()
- HTML 문자열로 컴파일된 Markdown 문서를 반환하는 함수입니다.
Markdown 블로그 게시물의 예는 다음과 같은 Astro.props
객체를 레이아웃에 전달할 수 있습니다.
Markdown/MDX 레이아웃은 Astro.props
를 통해 모든 파일에서 내보낸 속성들을 사용할 수 있지만 몇 가지 차이점이 있습니다.
-
제목 정보(예:
h1 -> h6
요소)는getHeadings()
함수가 아닌headings
배열을 통해 사용할 수 있습니다. -
또한
file
및url
은 중첩된frontmatter
속성(예:frontmatter.url
및frontmatter.file
)으로 사용할 수도 있습니다. -
프런트매터 외부에 정의된 값(예: MDX의
export
문)은 사용할 수 없습니다. 대신 레이아웃 가져오기를 고려해 보세요.
수동으로 레이아웃 가져오기 (MDX)
섹션 제목: 수동으로 레이아웃 가져오기 (MDX)프런트매터에 존재하지 않거나 존재할 수 없는 정보를 MDX 레이아웃에 전달해야 할 수도 있습니다. 이 경우 대신 <Layout />
컴포넌트를 가져와 사용하고 다른 컴포넌트처럼 props를 전달할 수 있습니다.
그러면 레이아웃의 Astro.props
를 통해 값을 사용할 수 있으며 MDX 콘텐츠는 <slot />
컴포넌트가 작성된 페이지에 삽입됩니다.
레이아웃에서 TypeScript 사용하기
섹션 제목: 레이아웃에서 TypeScript 사용하기모든 Astro 레이아웃의 props로 타입을 제공하여 타입 안정성 및 자동 완성 기능을 추가할 수 있습니다.
중첩 레이아웃
섹션 제목: 중첩 레이아웃레이아웃 컴포넌트는 HTML의 전체 페이지를 포함할 필요가 없습니다. 레이아웃을 더 작은 컴포넌트로 나누고 레이아웃 컴포넌트를 결합하여 더욱 유연한 페이지 템플릿을 만들 수 있습니다. 이 패턴은 여러 레이아웃에서 일부 코드를 공유하려는 경우에 유용합니다.
예를 들어, BlogPostLayout.astro
레이아웃 컴포넌트는 게시물의 제목, 날짜, 작성자의 스타일을 지정할 수 있습니다. 그리고 사이트 전체 BaseLayout.astro
가 탐색, 바닥글, SEO 메타 태그, 전역 스타일, 글꼴과 같은 페이지 템플릿의 나머지 부분을 처리할 수 있습니다. 또한, 다른 중첩 컴포넌트와 마찬가지로 게시물에서 받은 props를 다른 레이아웃으로 전달할 수도 있습니다.