브라우저 내장 <link> 컴포넌트는 스타일시트와 같은 외부 리소스를 사용하거나 링크 메타데이터로 문서를 주석 처리할 수 있게 해줍니다.
<link rel="icon" href="favicon.ico" />레퍼런스
<link>
스타일시트, 폰트, 아이콘과 같은 외부 리소스를 링크하거나 링크 메타데이터로 문서를 주석 처리하려면, 브라우저 내장 <link> 컴포넌트를 렌더링하세요. 어떤 컴포넌트에서든 <link>를 렌더링할 수 있으며, React는 대부분의 경우 해당 DOM 요소를 <head>에 배치합니다.
<link rel="icon" href="favicon.ico" />Props
<link>는 모든 공통 요소 속성을 지원합니다.
rel: 문자열 타입, 필수, 리소스와의 관계를 지정합니다. React는 다른 링크와는 달리rel="stylesheet"링크를 특별하게 처리합니다.
다음 속성들은 rel="stylesheet"인 경우에 적용됩니다.
precedence: 문자열 타입.<link>DOM 노드를 문서의<head>내 다른 요소와 비교하여 순위를 지정해야 합니다. 이를 통해 어떤 스타일시트가 다른 스타일시트를 덮어쓸 수 있는지 결정합니다. 값은 우선순위에 따라"reset","low","medium","high"가 될 수 있습니다. 동일한 우선순위를 가진 스타일시트는<link>또는 인라인<style>태그 또는preload나preinit함수로 로드되었는지에 관계없이 함께 적용됩니다.media: 문자열 타입. 스타일시트를 특정 미디어 쿼리에 제한합니다.title: 문자열 타입. 대체 스타일시트의 이름을 지정합니다.
다음 속성들은 rel=stylesheet인 경우에 적용되지만, React의 스타일시트에 대한 특별한 처리를 비활성화합니다.
disabled: 불리언 타입. 스타일시트를 비활성화합니다.onError: 함수. 스타일시트 로드에 실패했을 때 호출됩니다.onLoad: 함수. 스타일시트 로드가 완료되었을 때 호출됩니다.
다음 속성들은 rel="preload" 나 rel="modulepreload"인 경우에 적용됩니다.
as: 문자열 타입. 리소스의 유형을 지정합니다. 가능한 값은audio,document,embed,fetch,font,image,object,script,style,track,video,worker입니다.imageSrcSet: 문자열 타입.as="image"인 경우에만 적용됩니다. 이미지 소스의 세트를 지정합니다.imageSizes: 문자열 타입.as="image"인 경우에만 적용됩니다. 이미지의 크기를 지정합니다.
다음 속성들은 rel="icon"이나 rel="apple-touch-icon"인 경우에 적용됩니다.
sizes: 문자열 타입. 아이콘의 크기를 지정합니다.
다음 속성들은 모든 경우에 적용됩니다.
href: 문자열 타입. 연결된 리소스의 URL입니다.crossOrigin: 문자열 타입. 사용할 CORS 정책. 가능한 값은anonymous와use-credentials입니다.as가"fetch"로 설정된 경우 필수입니다.referrerPolicy: 문자열 타입. 리소스를 가져올 때 보낼 Referrer 헤더를 지정합니다. 가능한 값은no-referrer-when-downgrade(기본값),no-referrer,origin,origin-when-cross-origin,unsafe-url입니다.fetchPriority: 문자열 타입. 리소스를 가져오는 우선순위를 지정합니다. 가능한 값은auto(기본값),high,low입니다.hrefLang: 문자열 타입. 연결된 리소스의 언어입니다.integrity: 문자열 타입. 리소스의 암호 해시로 진위를 확인합니다.type: 문자열 타입. 연결된 리소스의 MIME 유형입니다.
다음 React 속성들은 권장하지 않습니다.
blocking: 문자열 타입."render"로 설정하면 스타일시트가 로드될 때까지 브라우저가 페이지를 렌더링하지 않도록 지시합니다. React는 Suspense를 사용하여 더 세밀하게 제어할 수 있습니다.
특별한 렌더링 동작
React는 <link> 컴포넌트에 해당하는 DOM 요소를 React 트리의 어디에 렌더링하든 상관없이 항상 문서의 <head>에 배치합니다. <head>는 DOM 내에서 <link>가 위치할 수 있는 유일한 위치이지만, 특정 페이지를 나타내는 컴포넌트가 <link> 컴포넌트를 자체적으로 렌더링할 수 있다면 편리하고 구성이 용이합니다.
여기에는 몇 가지 예외가 있습니다.
<link>에rel="stylesheet"속성이 있는 경우, 이 특별한 동작을 위해 반드시precedence속성이 있어야 합니다. 이는 문서 내 스타일시트의 순서가 중요하기 때문입니다. React는 다른 스타일시트와의 순서를 결정하기 위해precedence속성을 사용합니다.precedence속성이 생략된 경우 특별한 동작이 없습니다.<link>에itemProp속성이 있는 경우, 특별한 동작이 없습니다. 이 속성은 문서 전체가 아니라 페이지의 특정 부분에 대한 메타데이터를 나타냅니다.<link>에onLoad또는onError속성이 있는 경우, 연결된 리소스의 로딩을 React 컴포넌트 내에서 수동으로 관리하기 때문입니다.
스타일시트에 대한 특별한 동작
또한, <link>가 스타일시트로 연결된 경우 (즉, 속성에 rel="stylesheet"가 있는 경우) React는 다음과 같은 방식으로 특별하게 동작합니다.
- 스타일시트가 로드되는 동안
<link>를 렌더링하는 컴포넌트는 일시 중단됩니다. - 여러 컴포넌트가 동일한 스타일시트에 대한 링크를 렌더링하는 경우, React는 중복된 링크를 제거하고 DOM에 단일 링크만 배치합니다. 두 링크는
href속성이 동일하면 같은 것으로 간주합니다.
위 특별한 동작에는 두 가지 예외가 있습니다.
- 링크에
precedence속성이 없으면 특별한 동작이 없습니다. 이는 문서 내 스타일시트의 순서가 중요하기 때문에 React는 다른 스타일시트와의 순서를 결정하기 위해precedence속성을 사용합니다. onLoad,onError,disabled속성을 제공하는 경우 특별한 동작이 없습니다. 이러한 속성들은 스타일시트 로딩을 컴포넌트 내에서 수동으로 관리하고 있음을 나타내기 때문입니다.
위 특별한 처리에는 두 가지 주의 사항이 있습니다.
- 링크가 렌더링 된 후에 React가 속성 변경을 무시합니다. (개발 중에 경고 메시지가 표시됩니다)
- 링크를 렌더링한 컴포넌트가 마운트 해제된 후에도 React는 링크를 DOM에 남길 수 있습니다.
사용법
관련 리소스 연결하기
아이콘, 정규화된 URL, 핑백과 같은 관련 리소스에 대한 링크로 문서에 주석을 추가할 수 있습니다. React는 이 메타데이터를 React 트리의 어디에 렌더링 되든 상관없이 문서의 <head>에 배치합니다.
import ShowRenderedHTML from './ShowRenderedHTML.js'; export default function BlogPage() { return ( <ShowRenderedHTML> <link rel="icon" href="favicon.ico" /> <link rel="pingback" href="http://www.example.com/xmlrpc.php" /> <h1>My Blog</h1> <p>...</p> </ShowRenderedHTML> ); }
스타일시트 연결하기
컴포넌트가 올바르게 표시되기 위해 특정 스타일시트에 의존하는 경우 해당 스타일시트에 대한 링크를 컴포넌트 내에서 렌더링할 수 있습니다. 스타일시트가 로드되는 동안 컴포넌트는 일시 중단됩니다. precedence 속성을 제공해야 하며 이는 React에 이 스타일시트를 다른 스타일시트와 비교하여 어디에 배치해야 하는지 알려줍니다. 높은 우선순위의 스타일시트는 낮은 우선순위의 스타일시트를 덮어쓸 수 있습니다.
import ShowRenderedHTML from './ShowRenderedHTML.js'; export default function SiteMapPage() { return ( <ShowRenderedHTML> <link rel="stylesheet" href="sitemap.css" precedence="medium" /> <p>...</p> </ShowRenderedHTML> ); }
스타일시트 우선순위 제어하기
스타일시트는 서로 충돌할 수 있으며, 이 경우 브라우저는 문서에서 나중에 오는 스타일시트를 적용합니다. React는 precedence 속성을 사용하여 스타일시트의 순서를 제어할 수 있도록 합니다. 이 예시에서는 두 개의 컴포넌트가 스타일시트를 렌더링하며, 더 높은 우선순위를 가진 스타일시트는 해당 컴포넌트를 더 먼저 렌더링하더라도 문서에서 나중에 배치됩니다.
import ShowRenderedHTML from './ShowRenderedHTML.js'; export default function HomePage() { return ( <ShowRenderedHTML> <FirstComponent /> <SecondComponent /> ... </ShowRenderedHTML> ); } function FirstComponent() { return <link rel="stylesheet" href="first.css" precedence="high" />; } function SecondComponent() { return <link rel="stylesheet" href="second.css" precedence="low" />; }
중복으로 제거된 스타일시트 렌더링
여러 컴포넌트에서 동일한 스타일시트를 렌더링하면 React는 문서의 head에 단일 <link>만 배치합니다.
import ShowRenderedHTML from './ShowRenderedHTML.js'; export default function HomePage() { return ( <ShowRenderedHTML> <Component /> <Component /> ... </ShowRenderedHTML> ); } function Component() { return <link rel="stylesheet" href="styles.css" precedence="medium" />; }
문서 내 특정 항목에 링크로 주석 달기
itemProp 속성을 사용하여 <link> 컴포넌트를 문서 내 특정 항목에 관련 리소스 링크로 주석을 달 수 있습니다. 이 경우 React는 이러한 주석을 문서의 <head>에 배치하지 않고 다른 React 컴포넌트와 같이 배치합니다.
<section itemScope>
<h3>Annotating specific items</h3>
<link itemProp="author" href="http://example.com/" />
<p>...</p>
</section>